lhs2tex-1.19/0000755000175000017500000000000012507035615013653 5ustar00andresandres00000000000000lhs2tex-1.19/install-sh0000755000175000017500000001273612507035615015670 0ustar00andresandres00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the 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. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 lhs2tex-1.19/mkinstalldirs0000755000175000017500000000133012507035615016456 0ustar00andresandres00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1 2003/05/07 11:33:44 cvs-4 Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" 1>&2 mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here lhs2tex-1.19/TODO0000644000175000017500000000070312507035615014343 0ustar00andresandres00000000000000Features planned for 2.0 ======================== * Finish the manual. * Formatting directives parameterized by arity. * Facilitate Windows use. * Use ndm's FilePath library. Features planned for post-2.0 ============================= * Configurable lexer. Features planned for future versions of polytable ================================================= * Private columns are not shared with save-/restorecolumns. (?) * Support for rules. lhs2tex-1.19/lhs2TeX.sty.lit0000644000175000017500000001251212507035615016475 0ustar00andresandres00000000000000\begin{code} %if False % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % %endif %if not lhs2tex_lhs2tex_sty_read %let lhs2tex_lhs2tex_sty_read = True %include lhs2TeX.fmt % %if style /= newcode % \makeatletter \@@ifundefined{lhs2tex.lhs2tex.sty.read}% {\@@namedef{lhs2tex.lhs2tex.sty.read}{}% \newcommand\SkipToFmtEnd{}% \newcommand\EndFmtInput{}% \long\def\SkipToFmtEnd#1\EndFmtInput{}% }\SkipToFmtEnd \newcommand\ReadOnlyOnce[1]{\@@ifundefined{#1}{\@@namedef{#1}{}}\SkipToFmtEnd} \end{code} %-------------------------------= -------------------------------------------- \section{\TeX\ definitions} %-------------------------------= -------------------------------------------- \begin{code} %if latex209 \input{amstext.sty} \input{amssymb.sty} \input{stmaryrd.sty} \newcommand\ensuremath[1]{\ifmmode#1\else\mbox{$#1$}\fi} %if euler \input{euler.sty} %endif %else \usepackage{amstext} \usepackage{amssymb} \usepackage{stmaryrd} %if euler \usepackage{euler} %endif %endif \end{code} % \NB Die bedingte Formatierung wird \emph{nicht} verwendet, um gleichzeitig Math und Verbatim formatieren zu k"onnen. %-------------------------------= -------------------------------------------- \subsection{Typewriter style} %-------------------------------= -------------------------------------------- ks, 17.07.2003: Added a conditional that only includes this part if the selected style is typewriter style. ks, 28.07.2003: Removed the conditional again as it breaks compatibility. Not sure what to do here. Maybe create a new, clean @lhs2TeX.sty@ that should be included into new documents. \begin{code} %if not latex209 \DeclareFontFamily{OT1}{cmtex}{} \DeclareFontShape{OT1}{cmtex}{m}{n} {<5><6><7><8>cmtex8 <9>cmtex9 <10><10.95><12><14.4><17.28><20.74><24.88>cmtex10}{} \DeclareFontShape{OT1}{cmtex}{m}{it} {<-> ssub * cmtt/m/it}{} \newcommand{\texfamily}{\fontfamily{cmtex}\selectfont} %if underlineKeywords \usepackage{ulem}\normalem %else \DeclareFontShape{OT1}{cmtt}{bx}{n} {<5><6><7><8>cmtt8 <9>cmbtt9 <10><10.95><12><14.4><17.28><20.74><24.88>cmbtt10}{} \DeclareFontShape{OT1}{cmtex}{bx}{n} {<-> ssub * cmtt/bx/n}{} \newcommand{\tex}[1]{\text{\texfamily#1}} % NEU %endif %endif \newcommand{\Sp}{\hskip.33334em\relax} \end{code} %-------------------------------= -------------------------------------------- \subsection{Math style} %-------------------------------= -------------------------------------------- ks, 17.07.2003: As with the typewriter path, this is now conditionally included for math or poly mode. \begin{code} %if (style == math) || (style == poly) %if times \usepackage{times}\renewcommand{\ttdefault}{cmtt} \SetMathAlphabet{\mathrm}{normal}{OT1}{ptm}{m}{n} \SetMathAlphabet{\mathbf}{normal}{OT1}{ptm}{bx}{n} \SetMathAlphabet{\mathit}{normal}{OT1}{ptm}{m}{it} %endif %if style == math \newlength{\lwidth}\setlength{\lwidth}{4.5cm} \newlength{\cwidth}\setlength{\cwidth}{8mm} % 3mm %endif %if latex209 \newcommand{\Conid}[1]{{\mathit #1}} \newcommand{\Varid}[1]{{\mathit #1}} \newcommand{\anonymous}{\_} %else \newcommand{\Conid}[1]{\mathit{#1}} \newcommand{\Varid}[1]{\mathit{#1}} \newcommand{\anonymous}{\kern0.06em \vbox{\hrule\@@width.5em}} %endif \newcommand{\plus}{\mathbin{+\!\!\!+}} \newcommand{\bind}{\mathbin{>\!\!\!>\mkern-6.7mu=}} \newcommand{\rbind}{\mathbin{=\mkern-6.7mu<\!\!\!<}}% suggested by Neil Mitchell \newcommand{\sequ}{\mathbin{>\!\!\!>}} %if not standardsymbols \renewcommand{\leq}{\leqslant} \renewcommand{\geq}{\geqslant} %endif %endif \end{code} The following definitions facilitate the saving and restoring of column width information as well as the redefinition of column specifiers. It only works for @poly@ style. \begin{code} %if style == poly \usepackage{polytable} %mathindent has to be defined \@@ifundefined{mathindent}% {\newdimen\mathindent\mathindent\leftmargini}% {}% \def\resethooks{% \global\let\SaveRestoreHook\empty \global\let\ColumnHook\empty} \newcommand*{\savecolumns}[1][default]% {\g@@addto@@macro\SaveRestoreHook{\savecolumns[#1]}} \newcommand*{\restorecolumns}[1][default]% {\g@@addto@@macro\SaveRestoreHook{\restorecolumns[#1]}} \newcommand*{\aligncolumn}[2]% {\g@@addto@@macro\ColumnHook{\column{#1}{#2}}} \resethooks %if standardsymbols \newcommand{\onelinecommentchars}{\quad--- } %else \newcommand{\onelinecommentchars}{\quad-{}- } %endif \newcommand{\commentbeginchars}{\enskip\{-} \newcommand{\commentendchars}{-\}\enskip} \newcommand{\visiblecomments}{% \let\onelinecomment=\onelinecommentchars \let\commentbegin=\commentbeginchars \let\commentend=\commentendchars} \newcommand{\invisiblecomments}{% \let\onelinecomment=\empty \let\commentbegin=\empty \let\commentend=\empty} \visiblecomments \newlength{\blanklineskip} \setlength{\blanklineskip}{0.66084ex} \newcommand{\hsindent}[1]{\quad}% default is fixed indentation \let\hspre\empty \let\hspost\empty %endif \end{code} %-------------------------------= -------------------------------------------- \subsection{Some useful definitions} %-------------------------------= -------------------------------------------- \begin{code} \newcommand{\NB}{\textbf{NB}} \newcommand{\Todo}[1]{$\langle$\textbf{To do:}~#1$\rangle$} \EndFmtInput \makeatother \end{code} \begin{code} % %endif %endif \end{code} lhs2tex-1.19/configure0000755000175000017500000034031412507035615015567 0ustar00andresandres00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for lhs2tex 1.19. # # # Copyright (C) 1992-1996, 1998-2012 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 # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # 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 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+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} 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 test -x / || 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 : export CONFIG_SHELL # 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 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+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 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 about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_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; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # 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 -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' 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 as_test_x='test -x' as_executable_p=as_fn_executable_p # 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='lhs2tex' PACKAGE_TARNAME='lhs2tex' PACKAGE_VERSION='1.19' PACKAGE_STRING='lhs2tex 1.19' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS SEP LHS2TEX stydir MKTEXLSR POLYTABLE_INSTALL texmf KPSEWHICH DVIPS GV XDVI PDFLATEX LATEX FIND UNIQ SORT SED GREP DIFF TOUCH MKDIR RM CP MV LN_S INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM HUGS GHC PRE NUMVERSION SHORTVERSION VERSION 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 with_texmf enable_polytable ' 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 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 lhs2tex 1.19 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/lhs2tex] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of lhs2tex 1.19:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-polytable do not install polytable TeX package Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-texmf=DIR path to an existing texmf tree [$TEXMFLOCAL] Report bugs to the package provider. _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 lhs2tex configure 1.19 generated by GNU Autoconf 2.69 Copyright (C) 2012 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 lhs2tex $as_me 1.19, which was generated by GNU Autoconf 2.69. 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 VERSION="1.19" SHORTVERSION="1.19" NUMVERSION=119 PRE=2 # check for Haskell compiler # Extract the first word of "ghc", so it can be a program name with args. set dummy ghc; 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_path_GHC+:} false; then : $as_echo_n "(cached) " >&6 else case $GHC in [\\/]* | ?:[\\/]*) ac_cv_path_GHC="$GHC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GHC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GHC=$ac_cv_path_GHC if test -n "$GHC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GHC" >&5 $as_echo "$GHC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # check for Hugs (only for documentation) # Extract the first word of "hugs", so it can be a program name with args. set dummy hugs; 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_path_HUGS+:} false; then : $as_echo_n "(cached) " >&6 else case $HUGS in [\\/]* | ?:[\\/]*) ac_cv_path_HUGS="$HUGS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_HUGS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi HUGS=$ac_cv_path_HUGS if test -n "$HUGS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HUGS" >&5 $as_echo "$HUGS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # install command ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${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 as_fn_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 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' # symbolic links { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # other programs # Extract the first word of "mv", so it can be a program name with args. set dummy mv; 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_path_MV+:} false; then : $as_echo_n "(cached) " >&6 else case $MV in [\\/]* | ?:[\\/]*) ac_cv_path_MV="$MV" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MV=$ac_cv_path_MV if test -n "$MV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5 $as_echo "$MV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "cp", so it can be a program name with args. set dummy cp; 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_path_CP+:} false; then : $as_echo_n "(cached) " >&6 else case $CP in [\\/]* | ?:[\\/]*) ac_cv_path_CP="$CP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CP=$ac_cv_path_CP if test -n "$CP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CP" >&5 $as_echo "$CP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "rm", so it can be a program name with args. set dummy rm; 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_path_RM+:} false; then : $as_echo_n "(cached) " >&6 else case $RM in [\\/]* | ?:[\\/]*) ac_cv_path_RM="$RM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RM=$ac_cv_path_RM if test -n "$RM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 $as_echo "$RM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "mkdir", so it can be a program name with args. set dummy mkdir; 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_path_MKDIR+:} false; then : $as_echo_n "(cached) " >&6 else case $MKDIR in [\\/]* | ?:[\\/]*) ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MKDIR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MKDIR=$ac_cv_path_MKDIR if test -n "$MKDIR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR" >&5 $as_echo "$MKDIR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "touch", so it can be a program name with args. set dummy touch; 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_path_TOUCH+:} false; then : $as_echo_n "(cached) " >&6 else case $TOUCH in [\\/]* | ?:[\\/]*) ac_cv_path_TOUCH="$TOUCH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_TOUCH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi TOUCH=$ac_cv_path_TOUCH if test -n "$TOUCH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TOUCH" >&5 $as_echo "$TOUCH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "diff", so it can be a program name with args. set dummy diff; 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_path_DIFF+:} false; then : $as_echo_n "(cached) " >&6 else case $DIFF in [\\/]* | ?:[\\/]*) ac_cv_path_DIFF="$DIFF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DIFF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi DIFF=$ac_cv_path_DIFF if test -n "$DIFF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DIFF" >&5 $as_echo "$DIFF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "grep", so it can be a program name with args. set dummy grep; 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_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else case $GREP in [\\/]* | ?:[\\/]*) ac_cv_path_GREP="$GREP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GREP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GREP=$ac_cv_path_GREP if test -n "$GREP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GREP" >&5 $as_echo "$GREP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "sed", so it can be a program name with args. set dummy sed; 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_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else case $SED in [\\/]* | ?:[\\/]*) ac_cv_path_SED="$SED" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi SED=$ac_cv_path_SED if test -n "$SED"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 $as_echo "$SED" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "sort", so it can be a program name with args. set dummy sort; 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_path_SORT+:} false; then : $as_echo_n "(cached) " >&6 else case $SORT in [\\/]* | ?:[\\/]*) ac_cv_path_SORT="$SORT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SORT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi SORT=$ac_cv_path_SORT if test -n "$SORT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SORT" >&5 $as_echo "$SORT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "uniq", so it can be a program name with args. set dummy uniq; 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_path_UNIQ+:} false; then : $as_echo_n "(cached) " >&6 else case $UNIQ in [\\/]* | ?:[\\/]*) ac_cv_path_UNIQ="$UNIQ" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_UNIQ="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi UNIQ=$ac_cv_path_UNIQ if test -n "$UNIQ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNIQ" >&5 $as_echo "$UNIQ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "find", so it can be a program name with args. set dummy find; 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_path_FIND+:} false; then : $as_echo_n "(cached) " >&6 else case $FIND in [\\/]* | ?:[\\/]*) ac_cv_path_FIND="$FIND" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FIND="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi FIND=$ac_cv_path_FIND if test -n "$FIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIND" >&5 $as_echo "$FIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "latex", so it can be a program name with args. set dummy latex; 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_path_LATEX+:} false; then : $as_echo_n "(cached) " >&6 else case $LATEX in [\\/]* | ?:[\\/]*) ac_cv_path_LATEX="$LATEX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LATEX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LATEX=$ac_cv_path_LATEX if test -n "$LATEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LATEX" >&5 $as_echo "$LATEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; 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_path_PDFLATEX+:} false; then : $as_echo_n "(cached) " >&6 else case $PDFLATEX in [\\/]* | ?:[\\/]*) ac_cv_path_PDFLATEX="$PDFLATEX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PDFLATEX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PDFLATEX=$ac_cv_path_PDFLATEX if test -n "$PDFLATEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFLATEX" >&5 $as_echo "$PDFLATEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xdvi", so it can be a program name with args. set dummy xdvi; 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_path_XDVI+:} false; then : $as_echo_n "(cached) " >&6 else case $XDVI in [\\/]* | ?:[\\/]*) ac_cv_path_XDVI="$XDVI" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XDVI="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XDVI=$ac_cv_path_XDVI if test -n "$XDVI"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XDVI" >&5 $as_echo "$XDVI" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gv", so it can be a program name with args. set dummy gv; 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_path_GV+:} false; then : $as_echo_n "(cached) " >&6 else case $GV in [\\/]* | ?:[\\/]*) ac_cv_path_GV="$GV" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GV="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GV=$ac_cv_path_GV if test -n "$GV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GV" >&5 $as_echo "$GV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "dvips", so it can be a program name with args. set dummy dvips; 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_path_DVIPS+:} false; then : $as_echo_n "(cached) " >&6 else case $DVIPS in [\\/]* | ?:[\\/]*) ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DVIPS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi DVIPS=$ac_cv_path_DVIPS if test -n "$DVIPS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DVIPS" >&5 $as_echo "$DVIPS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # texmf tree # Check whether --with-texmf was given. if test "${with_texmf+set}" = set; then : withval=$with_texmf; case "$withval" in yes|no) texmf= ;; *) texmf="$withval" ;; esac fi # Extract the first word of "kpsewhich", so it can be a program name with args. set dummy kpsewhich; 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_path_KPSEWHICH+:} false; then : $as_echo_n "(cached) " >&6 else case $KPSEWHICH in [\\/]* | ?:[\\/]*) ac_cv_path_KPSEWHICH="$KPSEWHICH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_KPSEWHICH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi KPSEWHICH=$ac_cv_path_KPSEWHICH if test -n "$KPSEWHICH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $KPSEWHICH" >&5 $as_echo "$KPSEWHICH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$texmf"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a texmf tree" >&5 $as_echo_n "checking for a texmf tree... " >&6; } # If user did not specify something, try it ourselves if ${ac_cv_texmf_tree+:} false; then : $as_echo_n "(cached) " >&6 else if test -x "$KPSEWHICH"; then ac_cv_texmf_tree=`$KPSEWHICH --expand-var='$TEXMFLOCAL'` if test -z "$ac_cv_texmf_tree"; then ac_cv_texmf_tree=`$KPSEWHICH --expand-var='$TEXMFMAIN'` fi fi if test -z "$ac_cv_texmf_tree"; then # try some common paths for i in /usr/share/texmf /usr/local/share/texmf; do if test -d $$i; then ac_cv_texmf_tree=$$i break fi done fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_texmf_tree" >&5 $as_echo "$ac_cv_texmf_tree" >&6; } texmf="$ac_cv_texmf_tree" else ac_cv_texmf_tree="$texmf" fi if test -n "$texmf"; then cat >>confdefs.h <<_ACEOF #define TEXMFTOP "$texmf" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for texmf.cnf" >&5 $as_echo_n "checking for texmf.cnf... " >&6; } if test -x "$KPSEWHICH"; then texmfcnf="`$KPSEWHICH --format=web2c texmf.cnf`" fi if test -z "$texmfcnf"; then texmfcnf="$texmf/web2c/texmf.cnf" fi if test -f "$texmfcnf"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } cat >>confdefs.h <<_ACEOF #define TEXMF_IS_WEB2C 1 _ACEOF texmf_is_web2c=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } texmf_is_web2c=no fi fi # Check whether --enable-polytable was given. if test "${enable_polytable+set}" = set; then : enableval=$enable_polytable; POLYTABLE_INSTALL=$enableval else POLYTABLE_INSTALL=yes fi if test "z$POLYTABLE_INSTALL" = "zyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the polytable package" >&5 $as_echo_n "checking for the polytable package... " >&6; } if test -x "$KPSEWHICH"; then POLYTABLE="`$KPSEWHICH polytable.sty`" fi if test -f "$POLYTABLE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POLYTABLE" >&5 $as_echo "$POLYTABLE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for version of polytable" >&5 $as_echo_n "checking for version of polytable... " >&6; } POLYTABLE_VERSION=`$GREP " v.* .polytable. package" $POLYTABLE | $SED -e "s/^.*v\(.*\) .polytable. package.*$/\1/"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POLYTABLE_VERSION" >&5 $as_echo "$POLYTABLE_VERSION" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # does polytable need to be installed? { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether polytable needs to be installed" >&5 $as_echo_n "checking whether polytable needs to be installed... " >&6; } POLYTABLE_INSTALL=no if test -n $POLYTABLE; then if ( IFS="."; a="$POLYTABLE_VERSION"; b="0.8.2"; while test -n "$a$b" do set -- $a; h1="$1"; shift 2>/dev/null; a="$*" set -- $b; h2="$1"; shift 2>/dev/null; b="$*" test -n "$h1" || h1=0; test -n "$h2" || h2=0 test ${h1} -eq ${h2} || break done test ${h1} -lt ${h2} ) then POLYTABLE_INSTALL=yes fi else POLYTABLE_INSTALL=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POLYTABLE_INSTALL" >&5 $as_echo "$POLYTABLE_INSTALL" >&6; } fi # Extract the first word of "mktexlsr", so it can be a program name with args. set dummy mktexlsr; 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_path_MKTEXLSR+:} false; then : $as_echo_n "(cached) " >&6 else case $MKTEXLSR in [\\/]* | ?:[\\/]*) ac_cv_path_MKTEXLSR="$MKTEXLSR" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MKTEXLSR="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MKTEXLSR=$ac_cv_path_MKTEXLSR if test -n "$MKTEXLSR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKTEXLSR" >&5 $as_echo "$MKTEXLSR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # docdir and expansion docdir="$datadir/doc/$PACKAGE_TARNAME-$PACKAGE_VERSION" stydir="$datadir/$PACKAGE_TARNAME-$PACKAGE_VERSION" # lhs2TeX binary path relative to docdir LHS2TEX="../lhs2TeX" # search path separator SEP=":" ac_config_files="$ac_config_files config.mk src/Version.lhs lhs2TeX.1 doc/InteractiveHugs.lhs doc/InteractivePre.lhs" 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 : "${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 -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' 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 # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # 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 lhs2tex $as_me 1.19, which was generated by GNU Autoconf 2.69. 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 the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ lhs2tex config.status 1.19 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 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' 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 "config.mk") CONFIG_FILES="$CONFIG_FILES config.mk" ;; "src/Version.lhs") CONFIG_FILES="$CONFIG_FILES src/Version.lhs" ;; "lhs2TeX.1") CONFIG_FILES="$CONFIG_FILES lhs2TeX.1" ;; "doc/InteractiveHugs.lhs") CONFIG_FILES="$CONFIG_FILES doc/InteractiveHugs.lhs" ;; "doc/InteractivePre.lhs") CONFIG_FILES="$CONFIG_FILES doc/InteractivePre.lhs" ;; *) 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 _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 $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 echo "Configuration succesfully completed." echo "Say" echo " make to compile and build documentation" echo " make bin to compile the binary only" echo " make install to (compile and) install" lhs2tex-1.19/lhs2TeX.fmt.lit0000644000175000017500000003524712507035615016456 0ustar00andresandres00000000000000\begin{code} %if False % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % %endif %if not lhs2tex_lhs2tex_fmt_read %let lhs2tex_lhs2tex_fmt_read = True \end{code} %-------------------------------= -------------------------------------------- \section{Format definitions} %-------------------------------= -------------------------------------------- %-------------------------------= -------------------------------------------- \subsection{Verbatim style} %-------------------------------= -------------------------------------------- Also used for \verb@\verb@ and \verb@\begin{verbatim}@, so no conditionals at work here. % \begin{code} %subst verb a = "\text{\tt " a "}" %subst verbatim a = "\begin{tabbing}\tt'n" a "'n\end{tabbing}'n" %subst verbnl = "\\'n\tt " \end{code} %-------------------------------= -------------------------------------------- \subsection{Typewriter style} %-------------------------------= -------------------------------------------- \begin{code} %if style == tt %subst inline a = "\text{\texfamily " a "}" %subst thinspace = "\Sp " %subst code a = "\begin{tabbing}\texfamily'n" a "'n\end{tabbing}'n" %subst comment a = "{\rmfamily-{}- " a "}" %subst nested a = "{\rmfamily\enskip\{- " a " -\}\enskip}" %subst pragma a = "{\rmfamily\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %subst spaces a = a %subst special a = a %subst space = "~" %subst newline = "\\'n\texfamily " %subst conid a = "{\itshape " a "}" %subst varid a = a %subst consym a = a %subst varsym a = a %subst backquoted a = "`" a "`" %subst numeral a = a %subst char a = "''" a "''" %subst string a = "\char34 " a "\char34 " %if underlineKeywords %subst keyword a = "\uline{" a "}" %else %subst keyword a = "{\bfseries " a "}" %endif %format \ = "\char''10" %format . = "\char''00" %if not spacePreserving %format alpha = "\char''02" %format beta = "\char''03" %format gamma = "\char''11" %format delta = "\char''12" %format pi = "\char''07" %format infty = "\char''16" %format intersect = "\char''22" %format union = "\char''23" %format forall = "\char''24" %format exists = "\char''25" %format not = "\char''05" %format && = "\char''04" %format || = "\char''37" %format <- = "\char''06" %format -> = "\char''31" %format == = "\char''36" %format /= = "\char''32" %format <= = "\char''34" %format >= = "\char''35" %endif \end{code} % Unterst"utzung f"ur Meta-Haskell. % \begin{code} %if meta %format M.a = "\ensuremath{a}" %format M.b = "\ensuremath{b}" \end{code} etc~(for all lower and upper case letters). %if style == code \begin{code} %format M.c = "\ensuremath{c}" %format M.d = "\ensuremath{d}" %format M.e = "\ensuremath{e}" %format M.f = "\ensuremath{f}" %format M.g = "\ensuremath{g}" %format M.h = "\ensuremath{h}" %format M.i = "\ensuremath{i}" %format M.j = "\ensuremath{j}" %format M.k = "\ensuremath{k}" %format M.l = "\ensuremath{l}" %format M.m = "\ensuremath{m}" %format M.n = "\ensuremath{n}" %format M.o = "\ensuremath{o}" %format M.p = "\ensuremath{p}" %format M.q = "\ensuremath{q}" %format M.r = "\ensuremath{r}" %format M.s = "\ensuremath{s}" %format M.t = "\ensuremath{t}" %format M.u = "\ensuremath{u}" %format M.v = "\ensuremath{v}" %format M.w = "\ensuremath{w}" %format M.x = "\ensuremath{x}" %format M.y = "\ensuremath{y}" %format M.z = "\ensuremath{z}" %format M.A = "\ensuremath{A}" %format M.B = "\ensuremath{B}" %format M.C = "\ensuremath{C}" %format M.D = "\ensuremath{D}" %format M.E = "\ensuremath{E}" %format M.F = "\ensuremath{F}" %format M.G = "\ensuremath{G}" %format M.H = "\ensuremath{H}" %format M.I = "\ensuremath{I}" %format M.J = "\ensuremath{J}" %format M.K = "\ensuremath{K}" %format M.L = "\ensuremath{L}" %format M.M = "\ensuremath{M}" %format M.N = "\ensuremath{N}" %format M.O = "\ensuremath{O}" %format M.P = "\ensuremath{P}" %format M.Q = "\ensuremath{Q}" %format M.R = "\ensuremath{R}" %format M.S = "\ensuremath{S}" %format M.T = "\ensuremath{T}" %format M.U = "\ensuremath{U}" %format M.V = "\ensuremath{V}" %format M.W = "\ensuremath{W}" %format M.X = "\ensuremath{X}" %format M.Y = "\ensuremath{Y}" %format M.Z = "\ensuremath{Z}" \end{code} %endif \begin{code} %format M.alpha = "\ensuremath{\alpha}" %format M.beta = "\ensuremath{\beta}" \end{code} etc~(for all lower and upper case greek letters). %if style == code \begin{code} %format M.gamma = "\ensuremath{\gamma}" %format M.delta = "\ensuremath{\delta}" %format M.epsilon = "\ensuremath{\epsilon}" %format M.zeta = "\ensuremath{\zeta}" %format M.eta = "\ensuremath{\eta}" %format M.theta = "\ensuremath{\theta}" %format M.iota = "\ensuremath{\iota}" %format M.kappa = "\ensuremath{\kappa}" %format M.lambda = "\ensuremath{\lambda}" %format M.mu = "\ensuremath{\mu}" %format M.nu = "\ensuremath{\nu}" %format M.xi = "\ensuremath{\xi}" %format M.pi = "\ensuremath{\pi}" %format M.rho = "\ensuremath{\rho}" %format M.sigma = "\ensuremath{\sigma}" %format M.tau = "\ensuremath{\tau}" %format M.upsilon = "\ensuremath{\upsilon}" %format M.phi = "\ensuremath{\phi}" %format M.chi = "\ensuremath{\chi}" %format M.psi = "\ensuremath{\psi}" %format M.omega = "\ensuremath{\omega}" %format M.Gamma = "\ensuremath{\Gamma}" %format M.Delta = "\ensuremath{\Delta}" %format M.Theta = "\ensuremath{\Theta}" %format M.Lambda = "\ensuremath{\Lambda}" %format M.Xi = "\ensuremath{\Xi}" %format M.Pi = "\ensuremath{\Pi}" %format M.Sigma = "\ensuremath{\Sigma}" %format M.Upsilon = "\ensuremath{\Upsilon}" %format M.Phi = "\ensuremath{\Phi}" %format M.Psi = "\ensuremath{\Psi}" %format M.Omega = "\ensuremath{\Omega}" \end{code} %endif \begin{code} %format M.forall = "\ensuremath{\forall}" %format M.exists = "\ensuremath{\exists}" %format M.not = "\ensuremath{\neg}" %format ==> = "\ensuremath{\Longrightarrow}" %format <== = "\ensuremath{\Longleftarrow}" %format /\ = "\ensuremath{\wedge}" %format \/ = "\ensuremath{\vee}" %format M.= = "\ensuremath{=}" %format M./= = "\ensuremath{\neq}" %format M.< = "\ensuremath{<}" %format M.<= = "\ensuremath{\leq}" %format M.>= = "\ensuremath{\geq}" %format M.> = "\ensuremath{>}" %endif \end{code} %-------------------------------= -------------------------------------------- \subsection{New code style} %-------------------------------= -------------------------------------------- \begin{code} %elif style == newcode %subst comment a = "-- " a %subst nested a = "{- " a " -}" %subst code a = a "'n" %subst newline = "'n" %subst dummy = %subst pragma a = "{-# " a " #-}" %subst tex a = %subst numeral a = a %subst keyword a = a %subst spaces a = a %subst special a = a %subst space = " " %subst conid a = a %subst varid a = a %subst consym a = a %subst varsym a = a %subst backquoted a = "`" a "`" %subst char a = "''" a "''" %subst string a = "'d" a "'d" \end{code} %-------------------------------= -------------------------------------------- \subsection{Math and Poly style} %-------------------------------= -------------------------------------------- Some things modified due to introduction of @poly@ formatter by ks, 17.07.2003. Since both formatters share a lot of declarations, both declare |anyMath| to be true. The common parts are then declared in a conditional checking |anyMath|. \begin{code} %elif style == math %subst phantom a = "\phantom{" a "\mbox{}}" %subst comment a = "\mbox{\qquad-{}- " a "}" %subst nested a = "\mbox{\enskip\{- " a " -\}\enskip}" %if array %subst code a = "\[\begin{array}{@{}lcl}'n\hspace{\lwidth}&\hspace{\cwidth}&\\[-10pt]'n" a "'n\end{array}\]" %subst column3 l c r = "{}" l " & " c " & {" r "}" %subst column1 a = "\multicolumn{3}{@{}l}{" a "}" %else %subst code a = "\begin{tabbing}'n\qquad\=\hspace{\lwidth}\=\hspace{\cwidth}\=\+\kill'n" a "'n\end{tabbing}" %subst column3 l c r = "$" l "$ \> \makebox[\cwidth]{$" c "$} \> ${" r "}$" %subst column1 a = "${" a "}$" %endif %subst newline = "\\'n" %subst blankline = "\\[0.66084ex]%'n" %let anyMath = True %elif style == poly %subst comment a = "\mbox{\onelinecomment " a "}" %subst nested a = "\mbox{\commentbegin " a " \commentend}" %if array %subst code a = "\['n\begin{parray}\SaveRestoreHook'n" a "\ColumnHook'n\end{parray}'n\]\resethooks'n" %else %subst code a = "\begingroup\par\noindent\advance\leftskip\mathindent\('n\begin{pboxed}\SaveRestoreHook'n" a "\ColumnHook'n\end{pboxed}'n\)\par\noindent\endgroup\resethooks'n" %endif %subst column c a = "\column{" c "}{" a "}%'n" %subst fromto b e t = "\>[" b "]{}" t "{}\<[" e "]%'n" %subst left = "@{}>{\hspre}l<{\hspost}@{}" %subst centered = "@{}>{\hspre}c<{\hspost}@{}" %subst dummycol = "@{}l@{}" %subst newline = "\\'n" %subst blankline = "\\[\blanklineskip]%'n" %subst indent n = "\hsindent{" n "}" %let anyMath = True %endif %if anyMath %let autoSpacing = True %subst dummy = "\cdot " %subst inline a = "\ensuremath{" a "}" %subst hskip a = "\hskip" a "em\relax" %subst pragma a = "\mbox{\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %if latex209 %subst numeral a = "{\mathrm " a "}" %subst keyword a = "{\mathbf " a "}" %else %subst numeral a = "\mathrm{" a "}" %subst keyword a = "\mathbf{" a "}" %endif %subst spaces a = a %subst special a = a %subst space = "\;" %subst conid a = "\Conid{" a "}" %subst varid a = "\Varid{" a "}" %subst consym a = "\mathbin{" a "}" %subst varsym a = "\mathbin{" a "}" %subst backquoted a = "\mathbin{`" a "`}" %subst char a = "\text{\tt ''" a "''}" %subst string a = "\text{\tt \char34 " a "\char34}" %format _ = "\anonymous " %format -> = "\to " %format <- = "\leftarrow " %format => = "\Rightarrow " %format \ = "\lambda " %format | = "\mid " %format { = "\{\mskip1.5mu " %format } = "\mskip1.5mu\}" %format [ = "[\mskip1.5mu " %format ] = "\mskip1.5mu]" %format = = "\mathrel{=}" %format .. = "\mathinner{\ldotp\ldotp}" %format ~ = "\mathord{\sim}" %format @ = "\mathord{@}" %format . = "\mathbin{\circ}" %format !! = "\mathbin{!!}" %format ^ = "\mathbin{\uparrow}" %format ^^ = "\mathbin{\uparrow\uparrow}" %format ** = "\mathbin{**}" %format / = "\mathbin{/}" %format `quot` = "\mathbin{\Varid{`quot`}}" %format `rem` = "\mathbin{\Varid{`rem`}}" %format `div` = "\mathbin{\Varid{`div`}}" %format `mod` = "\mathbin{\Varid{`mod`}}" %format :% = "\mathbin{:\%}" %format % = "\mathbin{\%}" %format : = "\mathbin{:}" %format ++ = "\plus " %format == = "\equiv " %% ODER: format == = "\mathrel{==}" %format /= = "\not\equiv " %% ODER: format /= = "\neq " %format <= = "\leq " %format >= = "\geq " %format `elem` = "\in " %format `notElem` = "\notin " %format && = "\mathrel{\wedge}" %format || = "\mathrel{\vee}" %format >> = "\sequ " %format >>= = "\bind " %format =<< = "\rbind " %format $ = "\mathbin{\$}" %format `seq` = "\mathbin{\Varid{`seq`}}" %format ! = "\mathbin{!}" %format // = "\mathbin{//}" %format undefined = "\bot " %format not = "\neg " \end{code} % Problem: |!| wird sowohl als Infix-Operator als auch prefix f"ur Striktheitsannotationen verwendet (|"\mathord{!}"|). Unterst"utzung f"ur Meta-Haskell. % \begin{code} %if meta %format M.a = "a" %format M.b = "b" \end{code} etc~(for all lower and upper case letters). %if style == code \begin{code} %format M.c = "c" %format M.d = "d" %format M.e = "e" %format M.f = "f" %format M.g = "g" %format M.h = "h" %format M.i = "i" %format M.j = "j" %format M.k = "k" %format M.l = "l" %format M.m = "m" %format M.n = "n" %format M.o = "o" %format M.p = "p" %format M.q = "q" %format M.r = "r" %format M.s = "s" %format M.t = "t" %format M.u = "u" %format M.v = "v" %format M.w = "w" %format M.x = "x" %format M.y = "y" %format M.z = "z" %format M.A = "A" %format M.B = "B" %format M.C = "C" %format M.D = "D" %format M.E = "E" %format M.F = "F" %format M.G = "G" %format M.H = "H" %format M.I = "I" %format M.J = "J" %format M.K = "K" %format M.L = "L" %format M.M = "M" %format M.N = "N" %format M.O = "O" %format M.P = "P" %format M.Q = "Q" %format M.R = "R" %format M.S = "S" %format M.T = "T" %format M.U = "U" %format M.V = "V" %format M.W = "W" %format M.X = "X" %format M.Y = "Y" %format M.Z = "Z" \end{code} %endif \begin{code} %format M.alpha = "\alpha " %format M.beta = "\beta " \end{code} etc~(for all lower and upper case greek letters). %if style == code \begin{code} %format M.gamma = "\gamma " %format M.delta = "\delta " %format M.epsilon = "\epsilon " %format M.zeta = "\zeta " %format M.eta = "\eta " %format M.theta = "\theta " %format M.iota = "\iota " %format M.kappa = "\kappa " %format M.lambda = "\lambda " %format M.mu = "\mu " %format M.nu = "\nu " %format M.xi = "\xi " %format M.pi = "\pi " %format M.rho = "\rho " %format M.sigma = "\sigma " %format M.tau = "\tau " %format M.upsilon = "\upsilon " %format M.phi = "\phi " %format M.chi = "\chi " %format M.psi = "\psi " %format M.omega = "\omega " %format M.Gamma = "\Gamma " %format M.Delta = "\Delta " %format M.Theta = "\Theta " %format M.Lambda = "\Lambda " %format M.Xi = "\Xi " %format M.Pi = "\Pi " %format M.Sigma = "\Sigma " %format M.Upsilon = "\Upsilon " %format M.Phi = "\Phi " %format M.Psi = "\Psi " %format M.Omega = "\Omega " \end{code} %endif \begin{code} %format M.forall = "\forall " %format M.exists = "\exists " %format M.not = "\neg " %format ==> = "\enskip\Longrightarrow\enskip " %format <== = "\enskip\Longleftarrow\enskip " %format /\ = "\enskip\mathrel{\wedge}\enskip " %format \/ = "\enskip\mathrel{\vee}\enskip " %format M.= = "=" %format M./= = "\neq " %format M.< = "<" %format M.<= = "\leq " %format M.>= = "\geq " %format M.> = ">" %endif %endif \end{code} %-------------------------------= -------------------------------------------- \section{\LaTeX commands} %-------------------------------= -------------------------------------------- New, 21.11.2005: @lhs2TeX.sty@ is now included from @lhs2TeX.fmt@. \begin{code} %include lhs2TeX.sty \end{code} \begin{code} %endif \end{code} lhs2tex-1.19/lhs2TeX.1.in0000644000175000017500000001266612507035615015646 0ustar00andresandres00000000000000.TH LHS2TEX "1" "April 2015" "lhs2TeX" "User Commands" .SH NAME lhs2TeX \- a literate Haskell to (La)TeX code translator .SH SYNOPSIS .B lhs2TeX [options] file .SH DESCRIPTION This tool takes as its input a literate Haskell source file (Bird-style or LaTeX-style or even a combination thereof), and produces output, which, depending on the .B STYLE selected, can be either a LaTeX document or a stripped version of the code. The output is produced on stdout. Several directives are interpreted by .B lhs2TeX itself and can be used to customize the output further. .SH OPTIONS There are two sorts of options for \fBlhs2TeX\fR. The first selects a .B STYLE which governs the overal mode of operation for \fBlhs2TeX\fR. Only one style may be selected: .TP .B --poly The poly style is an improvement of the older .B math style. It produces a LaTeX document, with the code blocks formatted using a proportional font. The output is highly customizable using formatting directives. Furthermore, the resulting code respects some of the alignments made in the source file. .TP .B --math The math style is as .B poly style, but has less alignment capabilities. Tokens appearing in the source file at a special column are all aligned in the output. Furthermore, indentation is respected. .TP .B --newcode In the new code style, everything but code blocks is stripped from the file. In addition, certain syntactic transformations can be performed on the code using formatting directives. For example, if the source code is annotated in certain positions to produce even nicer results in .B poly style, one can use .B newcode style to remove these annotations. .TP .B --code In code style, all comments and specification code is stripped from the file, so that only the code remains. Use this if you want to produce a smaller version of your source file. .TP .B --tt Typewriter style prints code almost verbatim, using a monospaced font, but formatting certain symbols (lambda abstraction, arrows ...) using an extended character set. This style is default if no style is explicitly selected, but this behaviour should not be relied upon. The default style may be changed in future versions. .TP .B --verb Verbatim style prints code as-is, using a monospaced font. No formatting whatsoever is applied to the code. However, .B lhs2TeX does not make use of a LaTeX verbatim environment, but rather escapes special TeX constructs in the translation. This implies that it is easier to pass the resulting TeX code to macros or use it inside certain environments than it would be with a native verbatim-environment. .PD .PP The following options are considered are also considered as styles, but return only information about the program: .TP \fB-h\fR, \fB-?\fR, \fB--help\fR Returns a short usage message listing all the available options. .TP \fB-V\fR, \fB--version\fR Returns version information. .TP .B --copying Displays the complete GNU General Public License. .TP .B --warranty Displays the parts of the GPL than concerns warranty. .PD .PP The remaining options modify the behaviour of the program. .TP \fB-P\fIpath\fR, \fB--path=\fIpath\fR Takes a (colon-separated) list .I path of paths that are used as search path for files to be included. If the list starts with a colon, then the list is appended to the current search path. If the list ends with a colon, then the list is prepended to the current search path. If there is neither a colon at the beginning nor at the end of the list, then the list replaces the current search path. Environment variables can be used in the list of paths, if enclosed in curly braces, i.e., .I {VAR} expands to the current value of the environment variable VAR. If a path ends with a double slash \fI//\fR, then all subdirectories of that path are included in the search path. Note that this can significantly slow down .B lhs2TeX when looking for files. The built-in default search path of .B lhs2TeX is .nf {HOME}/lhs2TeX// {HOME}/.lhs2TeX// {LHS2TEX}// /usr/local/share/lhs2tex// /usr/local/share/lhs2TeX// /usr/local/lib/lhs2tex// /usr/local/lib/lhs2TeX// /usr/share/lhs2tex// /usr/share/lhs2TeX// /usr/lib/lhs2tex// /usr/lib/lhs2TeX// .fi .TP \fB-i\fIfile\fR, \fB--include=\fIfile\fR Includes .I file before anything else. This option has the same effect as an .nf %include \fIfile\fR .fi directive at the beginning of the source file. .TP \fB-l\fIequation\fR, \fB--let=\fIequation\fR Assumes .I equation while processing the source file. This option has the same effect as a .nf %let \fIequation\fR .fi directive at the beginning of the source file. .TP \fB-s\fIflag\fR, \fB--set=\fIflag\fR Sets .I flag to .B True at the beginning of the source file. This option has the same effect as a .nf %let \fIflag\fR=True .fi at the beginning of the source file. .TP \fB-u\fIflag\fR, \fB--unset=\fIflag\fR Sets .I flag to .B False at the beginning of the source file. This option has the same effect as a .nf %let \fIflag\fR=False .fi at the beginning of the source file. .SH VERSION @VERSION@ .SH AUTHORS Andres Loeh wrote .B poly and .B newcode styles and is the current maintainer of the package. Ralf Hinze wrote the original .BR lhs2TeX . .SH SEE ALSO .IR https://github.com/kosmikus/lhs2tex , the .B lhs2TeX development repository and issue tracker .br .IR https://hackage.haskell.org/package/lhs2tex , the .B lhs2TeX Hackage page .br .IR Guide2.pdf , the manual lhs2tex-1.19/LICENSE0000644000175000017500000000206712507035615014665 0ustar00andresandres00000000000000Copyright (c) 1997-2005 Ralf Hinze, Andres Loeh This package is free software; you can 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. As a special exception, permission is granted to include the files (or parts of the files) lhs2TeX.sty, lhs2TeX.fmt, as well as files (or parts of files) distributed in the Library subdirectory of this package that include a notice in their header, literally in other documents, regardless of the conditions or license applying to these documents. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 lhs2tex-1.19/Testsuite/0000755000175000017500000000000012507035615015644 5ustar00andresandres00000000000000lhs2tex-1.19/Testsuite/operators.snip0000644000175000017500000000065612507035615020564 0ustar00andresandres00000000000000Variablen: |a !! 3|, |a + b|, |a Prelude.+ b|, |a `div` b|, |a `Prelude.div` b|. Konstruktoren: |l :^: r|, |l Tree.:^: r|, |l `Br` r|, |l `Tree.Br` r|. Selbstdefinierte: |f @@ g|, |f .> g|, |x `isPrefixOf` y|. %format @@ = "\mathbin{\varocircle}" %format .> = "\mathbin{\fatsemi}" Noch einmal: |f @@ g|, |f .> g|, |a `elem` set| und |a `notElem` set|. Beachte: |a `div` b| versus |a ` div ` b|. Sections: |(`div` 2)| und |(+ 5)|. lhs2tex-1.19/Testsuite/gap.snip0000644000175000017500000000023212507035615017303 0ustar00andresandres00000000000000> msg = "Hello world\n\ > \how are you doing?\n\ > \Cheers." lhs2tex-1.19/Testsuite/idents.snip0000644000175000017500000000040712507035615020026 0ustar00andresandres00000000000000Varianten: |fun what now|, |Prelude.take 10 x|. Mit Unterstrich: |mapM_| und |remove_leading_line|. %format Verbatim = "\mathrm{Verb}" %format Verbatim.a = "\mathit{a}" |Verbatim.a + Math.b + Verbatim.b|. %format empty = "\emptyset " |Bag.empty| oder |Set.empty| lhs2tex-1.19/Testsuite/braces.snip0000644000175000017500000000025212507035615017775 0ustar00andresandres00000000000000Records: |fun (State{dict = d, no = n})|, |fun (State{dict = d, no = n})|. > main = do { putStr "hello"; > putStr "world"; > exit > } lhs2tex-1.19/Testsuite/special.snip0000644000175000017500000000054612507035615020164 0ustar00andresandres00000000000000< " ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7" < "8 9 : ; < = > ? @ A B C D E F G H I J K L M N O" < "P Q R S T U V W X Y Z [ \ ] ^ _ ` 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 { | } ~" |[1 .. 99]|, |fac :: Int -> Int|, |fac n = n * fac (n -1)|, |\n -> n + 1|, |[ i * i || i <- [0..99] ]|, |x@(~(a : as))|. < m >> n = m >>= \_ -> n lhs2tex-1.19/Testsuite/indentation.snip0000644000175000017500000000051212507035615021051 0ustar00andresandres00000000000000> faculty n > | n == 0 = 1 > | otherwise = n * faculty n' > where n' = n - 1 > unused = n' > weird a b > where (c, d) | cond = (a, b) > | otherwise = (b, a) > list = [ i * i > | i <- [0 .. 99 ] ] > main = sequence [ print i > | i <- [0 .. 99] ] lhs2tex-1.19/Testsuite/parens.snip0000644000175000017500000000167012507035615020033 0ustar00andresandres00000000000000%format (abs (a)) = "|" a "|" %format power a (b) = a "^{" b "}" %format (sqrt (a)) = "\sqrt{" a "}" %format (pair (a) (b)) = "\langle" a "," b "\rangle" |power (abs (a + b)) (1/2)|, |f (abs a)|, |p (_, _) = 1|, |let a' = abs a in sqrt (a' + a)|, |fun (gun a b^27) c ++ b^^(-8)|, |abs (a, b)|, |abs (+ a * b)|, |abs ()|, |abs (a * b +)|, |f (pair (a * b) (a / b))|, |map sqrt x|. Newtype. %format (MkSet (a)) = a > newtype Set a = MkSet [a] > insert :: a -> Set a -> Set a > insert a (MkSet []) = MkSet [a] > insert a (MkSet ((b : x))) > | a <= b = MkSet (a : b : x) > | otherwise = MkSet (b : insert a x) %format (MkId (a)) = a > newtype Id a = MkId a > > instance Monad Id where > return a = MkId a {-""-} > MkId a >>= f = f a Es werden niemals zwei Klammerpaare entfernt |((e))|. %format f (a) = "\Varid{f}\;" a %format (g a) = "\Varid{g}\;" a Ja: |f (g a)| und nein: |f ((g a))|. lhs2tex-1.19/Testsuite/Try.lhs0000644000175000017500000000033212507035615017130 0ustar00andresandres00000000000000> go = concat [ show n ++ ": " ++ [toEnum n] ++ ", \\symbol{" ++ show n ++ "}\\\\\n" > | n <- [32 .. 127] ] > go' = unlines [ concat [ [toEnum i, ' '] | i <- [32 + 24 * n .. 55 + 24 * n] ] | n <- [0 .. 3] ] lhs2tex-1.19/Testsuite/Test.lhs0000644000175000017500000001111512507035615017272 0ustar00andresandres00000000000000\documentclass[fleqn]{article} \usepackage[german]{babel} \usepackage{moreverb} \usepackage{boxedminipage} \parindent0cm \newcommand{\Show}[1]{\listinginput{1}{#1.snip}\input{#1.tex}} %-------------------------------= -------------------------------------------- %include ../lhs2TeX.fmt %-------------------------------= -------------------------------------------- \begin{document} %-------------------------------= -------------------------------------------- \section{String gaps} %-------------------------------= -------------------------------------------- \Show{gap} %-------------------------------= -------------------------------------------- \section{Identifiers} %-------------------------------= -------------------------------------------- \Show{idents} %-------------------------------= -------------------------------------------- \section{Operators} %-------------------------------= -------------------------------------------- \Show{operators} %-------------------------------= -------------------------------------------- \section{Special symbols} %-------------------------------= -------------------------------------------- \Show{special} %-------------------------------= -------------------------------------------- \section{Spacing} %-------------------------------= -------------------------------------------- \Show{spacing} \Show{braces} %-------------------------------= -------------------------------------------- \section{Indentation} %-------------------------------= -------------------------------------------- \Show{indentation} % \NB Die senkrechten Striche sind im ersten Beispiel etwas einger"uckt, da \verb|\mid| als Operator gesetzt wird. Schlie"st man die linke Seite in \verb|{..}| ein, dann wird |weird| nicht richtig gesetzt. Die rechte Seite \emph{wird} in \verb|{..}| eingeschlossen, damit |list| und |main| richtig gesetzt werden (auf diese Weise verliert \verb|\mid| seinen Status als Operator). %-------------------------------= -------------------------------------------- \section{Format directives} %-------------------------------= -------------------------------------------- \Show{format} \Show{parens} %-------------------------------= -------------------------------------------- \section{Errors} %-------------------------------= -------------------------------------------- \Show{errors} %-------------------------------= -------------------------------------------- \section{Meta-Haskell} %-------------------------------= -------------------------------------------- Erfordert \verb|-l'meta = True'| Kommandozeilenoption (wichtig: \emph{vor} \verb@-i lhs2TeX.fmt@ angeben). % \Show{meta} %-------------------------------= -------------------------------------------- \section{Comments} %-------------------------------= -------------------------------------------- \Show{comments} %-------------------------------= -------------------------------------------- \section{Verbatim} %-------------------------------= -------------------------------------------- \verb|khadrkh| und \verb*|kjhsfd kjghsdf|. % \begin{verbatim} bass sdakh asd asd \end{verbatim} % \begin{verbatim*} bass sdakh asd asd \end{verbatim*} %-------------------------------= -------------------------------------------- \section{Active commands} %-------------------------------= -------------------------------------------- |product [1..20]| yields \eval{product [1..20]}. %if False > default (Integer) > group n = map (take n) > . takeWhile (not . null) > . iterate (drop n) > rows = concat > . intersperse " \\\\\n" > . map (\(n, s) -> show n ++ " & " ++ s) > . zip [1 ..] > . group 60 > intersperse s [] = [] > intersperse s [a] = [a] > intersperse s (a1 : a2 : as) = a1 : s : intersperse s (a2 : as) > out n = putStr (rows (show n)) %endif |product [1..200]| yields \[ \begin{array}{rl} \perform{out (product [1..200])} \end{array} \] > twice f a = f (f a) \eval{:type twice} und \eval{:type twice twice} haben den gleichen Typ. %-------------------------------= -------------------------------------------- \section{Active commands with @ghci@} %-------------------------------= -------------------------------------------- %options ghci -fglasgow-exts -fno-monomorphism-restriction |product [1..20]| yields \eval{product [1..20]}. %if False > main = undefined %endif |product [1..200]| yields \[ \begin{array}{rl} \perform{out (product [1..200])} \end{array} \] < twice f a = f (f a) %format forall = "\forall " %format . = "." \eval{:type twice} und \eval{:type twice twice} haben den gleichen Typ. \end{document} lhs2tex-1.19/Testsuite/meta.snip0000644000175000017500000000030512507035615017463 0ustar00andresandres00000000000000\begin{equation} |(M.forall a, x) ordered x ==> ordered (insert a x)|, \end{equation} \begin{equation} |(M.forall M.x, M.y) ordered M.x /\ ordered M.y ==> ordered (merge M.x M.y)|. \end{equation} lhs2tex-1.19/Testsuite/format.snip0000644000175000017500000000054512507035615020033 0ustar00andresandres00000000000000%format f a b = "\varphi\;" a b > bla = yuks (f a -- works > b) > bla = yuks (f a -- does not work > b) \NB Es ist wichtig bei der Ersetzung, da"s nur das erste Token des Ersetzungstextes die Position erbt; sonst wird |b| nicht richtig positioniert. %format a1 %format a2 > ordered (a1 : a2 : as) = a1 <= a2 && ordered (a2 : as) lhs2tex-1.19/Testsuite/spacing.snip0000644000175000017500000000037512507035615020170 0ustar00andresandres00000000000000> infixr @@ 2 > infixr .> 3 Schl"usselwo"rter: |let x = 1 in x * x|, |fun (let x = 1 in x * x)|, |let (a, b) = (b, a) in a * b|, |[let a=1 in a, let b=2 in b]|, |let {a = 1; b = 2} in a * b|, |do {let a = 1; return (a * a)}|. Listen: |[1,2,3] ++ [a]|. lhs2tex-1.19/Testsuite/Makefile0000644000175000017500000000171312507035615017306 0ustar00andresandres00000000000000 include ../config.mk #----------------------------------------------------------------------------- # directories and files snips := $(wildcard *.snip) texs := $(foreach file, $(snips:.snip=.tex), $(file)) LHS2TEX = ../lhs2TeX #----------------------------------------------------------------------------- # pattern rules %.tex : %.snip # lhs2TeX -verb -i../lhs2TeX.fmt -l'meta = True' $< > $@ $(LHS2TEX) -v --math --align=33 -smeta -i../lhs2TeX.fmt $< > $@ %.tex : %.lhs # lhs2TeX -verb -i../lhs2TeX.fmt -l'meta = True' $< > $@ $(LHS2TEX) -v --math --align=33 -smeta $< > $@ %.ps : %.dvi $(DVIPS) -D600 -o $@ $< #----------------------------------------------------------------------------- .PHONY: show view print clean Test.dvi : $(texs) show : Test.dvi $(XDVI) -s 3 Test.dvi & view : Test.ps xe ghostview Test.ps & print : Test.dvi $(DVIPS) -D600 -f Test.dvi | lpr -Pa -Zl clean : rm -f Test.tex $(texs) *.dvi *.ps include ../common.mk lhs2tex-1.19/Testsuite/errors.snip0000644000175000017500000000004312507035615020050 0ustar00andresandres00000000000000% format f (a = a % format f a = b lhs2tex-1.19/Testsuite/comments.snip0000644000175000017500000000024012507035615020360 0ustar00andresandres00000000000000Inline comments: |fun -- ny| und |first {- second -} third|. > a `elem` [] = False -- vordefiniert > a `elem` (b : bs) = a == b {- lazy -} || a `elem` bs lhs2tex-1.19/sorts.snip0000644000175000017500000000134112507035615015717 0ustar00andresandres00000000000000> quickSort :: (Ord a) => [a] -> [a] > quickSort [] = [] > quickSort (a : as) = quickSort [ b | b <- as, b <= a ] > ++ a : quickSort [ b | b <- as, b > a ] > > mergeSort :: (Ord a) => [a] -> [a] > mergeSort [] = [] > mergeSort [a] = [a] > mergeSort as = merge (mergeSort bs) (mergeSort cs) > where (bs, cs) = splitAt (length as `div` 2) as The worst case execution time of |mergeSort| is $\Theta(n\log n)$. NB. |splitAt| is given by < splitAt :: Int -> [a] -> ([a], [a]) < splitAt k as = (take k as, drop k as) {-"\enskip."-} lhs2tex-1.19/Library/0000755000175000017500000000000012507035615015257 5ustar00andresandres00000000000000lhs2tex-1.19/Library/agda.fmt0000644000175000017500000000310312507035615016660 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % agda.fmt % % basic definitions for formatting agda code % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % % Andres Loeh, May 2009, ver 1.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_agda_fmt_read %let lhs2tex_agda_fmt_read = True %include polycode.fmt % %if style /= newcode \ReadOnlyOnce{agda.fmt}% %if lang == agda \RequirePackage[T1]{fontenc} \RequirePackage[utf8x]{inputenc} \RequirePackage{ucs} \RequirePackage{amsfonts} \providecommand\mathbbm{\mathbb} % TODO: Define more of these ... \DeclareUnicodeCharacter{737}{\textsuperscript{l}} \DeclareUnicodeCharacter{8718}{\ensuremath{\blacksquare}} \DeclareUnicodeCharacter{8759}{::} \DeclareUnicodeCharacter{9669}{\ensuremath{\triangleleft}} \DeclareUnicodeCharacter{8799}{\ensuremath{\stackrel{\scriptscriptstyle ?}{=}}} \DeclareUnicodeCharacter{10214}{\ensuremath{\llbracket}} \DeclareUnicodeCharacter{10215}{\ensuremath{\rrbracket}} % TODO: This is in general not a good idea. \providecommand\textepsilon{$\epsilon$} \providecommand\textmu{$\mu$} %subst keyword a = "\Keyword{" a "}" %Actually, varsyms should not occur in Agda output. %subst varsym a = "\Varid{" a "}" % TODO: Make this configurable. IMHO, italics doesn't work well % for Agda code. \renewcommand\Varid[1]{\mathord{\textsf{#1}}} \let\Conid\Varid \newcommand\Keyword[1]{\textsf{\textbf{#1}}} \EndFmtInput %endif %endif %endif lhs2tex-1.19/Library/lambda.fmt0000644000175000017500000000172112507035615017210 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % lambda.fmt % % Format \ x -> y as \ x . y in TeX % Based on forall.fmt; look there for slightly more % documentation. % % Andres Loeh, September 2008, version 1.1 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_lambda_fmt_read %let lhs2tex_lambda_fmt_read = True %include lhs2TeX.fmt %include forall.fmt % %if style /= newcode %format \ = lambda_ "\hslambda " %format -> = "\hsarrow{" `arrow_` "}{" lambdaperiod_ "}" %format `arrow_` = "\rightarrow " %format lambda_ = "\lambda " %format lambdaperiod_ = "\mathpunct{.}" % \ReadOnlyOnce{lambda.fmt}% \makeatletter \newcommand\hslambda{\global\let\hsarrow=\hsarrowperiodonce} \newcommand*\hsarrowperiodonce[2]{#2\global\let\hsarrow=\hscompose} \AtHaskellReset{\global\let\hsarrow=\hscompose} % In the beginning, we should reset Haskell once. \HaskellReset \makeatother \EndFmtInput %endif %endif lhs2tex-1.19/Library/exists.fmt0000644000175000017500000000152212507035615017306 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % exists.fmt % % Format exists x. y as \exists x. y in TeX, not as compose % Based on forall.fmt; look there for slightly more % documentation. % % Andres Loeh, September 2008, version 1.1 % Duncan Coutts, September 2008, copy'n'pasted from lambda.fmt % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_exists_fmt_read %let lhs2tex_exists_fmt_read = True %include lhs2TeX.fmt %include forall.fmt % %if style /= newcode %format exists(x) = exists_ x "\hsexists " %format exists_ = "\exists " % \ReadOnlyOnce{exists.fmt}% \makeatletter \newcommand\hsexists{\global\let\hsdot=\hsperiodonce} \AtHaskellReset{\global\let\hsdot=\hscompose} % In the beginning, we should reset Haskell once. \HaskellReset \makeatother \EndFmtInput %endif %endif lhs2tex-1.19/Library/forall.fmt0000644000175000017500000000346312507035615017254 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % forall.fmt % % *EXPERIMENTAL* % Semi-automatic formatting of the . as either function % composition (normally) or a period (when used after a % forall). % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % % Andres Loeh, November 2005, ver 1.1 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_forall_fmt_read %let lhs2tex_forall_fmt_read = True %include lhs2TeX.fmt % %if style /= newcode % % First, let's redefine the forall, and the dot. % %format forall(x) = forall_ x "\hsforall " %format . = "\hsdot{" `comp_` "}{" period_ "}" %format `comp_` = "\circ " %format period_ = "." %format forall_ = "\forall " % % This is made in such a way that after a forall, the next % dot will be printed as a period, otherwise the formatting % of `comp_` is used. By redefining `comp_`, as suitable % composition operator can be chosen. Similarly, period_ % is used for the period. % \ReadOnlyOnce{forall.fmt}% \makeatletter % The HaskellResetHook is a list to which things can % be added that reset the Haskell state to the beginning. % This is to recover from states where the hacked intelligence % is not sufficient. \let\HaskellResetHook\empty \newcommand*{\AtHaskellReset}[1]{% \g@@addto@@macro\HaskellResetHook{#1}} \newcommand*{\HaskellReset}{\HaskellResetHook} \global\let\hsforallread\empty \newcommand\hsforall{\global\let\hsdot=\hsperiodonce} \newcommand*\hsperiodonce[2]{#2\global\let\hsdot=\hscompose} \newcommand*\hscompose[2]{#1} \AtHaskellReset{\global\let\hsdot=\hscompose} % In the beginning, we should reset Haskell once. \HaskellReset \makeatother \EndFmtInput %endif %endiflhs2tex-1.19/Library/beamerboxed.fmt0000644000175000017500000000225312507035615020246 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % beamerboxed.fmt % % Displaying code that is set with lhs2TeX in poly style inside boxes from the % beamer class. % % Permission is granted to include this file (or parts of this file) literally % into other documents, regardless of the conditions or license applying to % these documents. % % Stefan Holdermans, April 2010, version 1.0 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_beamerboxed_fmt_read %let lhs2tex_beamerboxed_fmt_read = True %include polycode.fmt %include beamer.fmt % %if style /= newcode \ReadOnlyOnce{beamerboxed.fmt} \setbeamercolor{hsbox}{parent=block body} \newlength{\hsboxsep} \setlength{\hsboxsep}{.33em} \newcommand{\hsboxrounded}{true} \newcommand{\hsboxshadow}{true} \newenvironment{beamerboxedhscode} {\let\hspre\(\let\hspost\)% \beamercolorbox% [sep=\hsboxsep,rounded=\hsboxrounded,shadow=\hsboxshadow]% {hsbox}% \hscodestyle% \pboxed}% {\endpboxed% \endbeamercolorbox% \ignorespacesafterend} \newcommand{\beamerboxedhs}{\sethscode{beamerboxedhscode}} \EndFmtInput %endif %endiflhs2tex-1.19/Library/beamer.fmt0000644000175000017500000000125112507035615017221 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % beamer.fmt % % Utility commands for use of lhs2TeX with the beamer % class. Note that this fmt file is not required for % using lhs2TeX together with beamer. % % Andres Loeh, November 2008, version 1.0 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_beamer_fmt_read %let lhs2tex_beamer_fmt_read = True %include lhs2TeX.fmt % \ReadOnlyOnce{beamer.fmt}% \let\savesavecolumns\savecolumns \newcommand{\saverestorecolumns}{% \savecolumns\global\let\savecolumns\restorecolumns} \newcommand{\resetsavecolumns}{% \global\let\savecolumns\savesavecolumns} \EndFmtInput %endif lhs2tex-1.19/Library/jfpcompat.fmt0000644000175000017500000000163612507035615017760 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % jfpcompat.fmt % % jfp.cls is incompatible with array.sty! This is a fix. % This is included in the lhs2TeX distribution because % lhs2TeX depends on array.sty, and many lhs2TeX users are % JFP authors. % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % % Andres Loeh, November 2005, ver 1.1 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_jfpcompat_fmt_read %let lhs2tex_jfpcompat_fmt_read = True %include lhs2TeX.fmt % \ReadOnlyOnce{jfpcompat.fmt}% \makeatletter \def\@@authortable{% \leavevmode \hbox \bgroup $\col@@sep\tabcolsep \let\d@@llarbegin\begingroup \let\d@@llarend\endgroup \let\\\author@@tabcrone \ignorespaces \@@tabarray} \makeatother \EndFmtInput % %endif lhs2tex-1.19/Library/colorcode.fmt0000644000175000017500000000337112507035615017744 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % colorcode.fmt % % colored code for poly style in lhs2TeX % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % % Andres Loeh, January 2008, ver 1.7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_colorcode_fmt_read %let lhs2tex_colorcode_fmt_read = True %include polycode.fmt % %if style /= newcode \ReadOnlyOnce{colorcode.fmt}% \RequirePackage{colortbl} \RequirePackage{calc} \makeatletter \newenvironment{colorhscode}% {\hsnewpar\abovedisplayskip \hscodestyle \tabular{@@{}>{\columncolor{codecolor}}p{\linewidth}@@{}}% \let\\=\@@normalcr \(\pboxed}% {\endpboxed\)% \endtabular \hsnewpar\belowdisplayskip \ignorespacesafterend} \newenvironment{tightcolorhscode}% {\hsnewpar\abovedisplayskip \hscodestyle \tabular{@@{}>{\columncolor{codecolor}\(}l<{\)}@@{}}% \pmboxed}% {\endpmboxed% \endtabular \hsnewpar\belowdisplayskip \ignorespacesafterend} \newenvironment{barhscode}% {\hsnewpar\abovedisplayskip \hscodestyle \arrayrulecolor{codecolor}% \arrayrulewidth=\coderulewidth \tabular{||p{\linewidth-\arrayrulewidth-\tabcolsep}@@{}}% \let\\=\@@normalcr \(\pboxed}% {\endpboxed\)% \endtabular \hsnewpar\belowdisplayskip \ignorespacesafterend} \makeatother \def\colorcode{\columncolor{codecolor}} \definecolor{codecolor}{rgb}{1,1,.667} \newlength{\coderulewidth} \setlength{\coderulewidth}{3pt} \newcommand{\colorhs}{\sethscode{colorhscode}} \newcommand{\tightcolorhs}{\sethscode{tightcolorhscode}} \newcommand{\barhs}{\sethscode{barhscode}} \EndFmtInput %endif %endif lhs2tex-1.19/Library/spacing.fmt0000644000175000017500000000143612507035615017417 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % spacing.fmt % % Formatting sequences of ^ as spaces of different width. % Note that the default formatting of (^) is affected by this. % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % % Andres Loeh, November 2005, ver 1.1 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_spacing_fmt_read %let lhs2tex_spacing_fmt_read = True % %if style == newcode %format ^ = %format ^^ = " " %format ^^^ = " " %format ^^^^ = " " %format ^^. = %else %format ^ = " " %format ^^ = "\;" %format ^^^ = "\quad " %format ^^^^ = "\qquad " %format ^^. = ^^ "." %endif %endiflhs2tex-1.19/Library/polycode.fmt0000644000175000017500000001310312507035615017603 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % polycode.fmt % % better code environment for poly style in lhs2TeX % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % % Andres Loeh, February 2013, ver 1.12 % % TODO: use \[ \] in arrayhs (fleqn problem) % think about penalties and better pagebreaks % by using \allowdisplaybreaks %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_polycode_fmt_read %let lhs2tex_polycode_fmt_read = True %include lhs2TeX.fmt % %if style == poly % %if False % The follwing subst replaces the bad default from lhs2TeX.fmt. % The idea is to just provide the basic structure in the subst, and % let the rest be handled by a LaTeX environment. %endif % %subst code a = "\begin{hscode}\SaveRestoreHook'n" a "\ColumnHook'n\end{hscode}\resethooks'n" % % % This package provides two environments suitable to take the place % of hscode, called "plainhscode" and "arrayhscode". % % The plain environment surrounds each code block by vertical space, % and it uses \abovedisplayskip and \belowdisplayskip to get spacing % similar to formulas. Note that if these dimensions are changed, % the spacing around displayed math formulas changes as well. % All code is indented using \leftskip. % % Changed 19.08.2004 to reflect changes in colorcode. Should work with % CodeGroup.sty. % \ReadOnlyOnce{polycode.fmt}% \makeatletter \newcommand{\hsnewpar}[1]% {{\parskip=0pt\parindent=0pt\par\vskip #1\noindent}} % can be used, for instance, to redefine the code size, by setting the % command to \small or something alike \newcommand{\hscodestyle}{} % The command \sethscode can be used to switch the code formatting % behaviour by mapping the hscode environment in the subst directive % to a new LaTeX environment. \newcommand{\sethscode}[1]% {\expandafter\let\expandafter\hscode\csname #1\endcsname \expandafter\let\expandafter\endhscode\csname end#1\endcsname} % "compatibility" mode restores the non-polycode.fmt layout. \newenvironment{compathscode}% {\par\noindent \advance\leftskip\mathindent \hscodestyle \let\\=\@@normalcr \let\hspre\(\let\hspost\)% \pboxed}% {\endpboxed\)% \par\noindent \ignorespacesafterend} \newcommand{\compaths}{\sethscode{compathscode}} % "plain" mode is the proposed default. % It should now work with \centering. % This required some changes. The old version % is still available for reference as oldplainhscode. \newenvironment{plainhscode}% {\hsnewpar\abovedisplayskip \advance\leftskip\mathindent \hscodestyle \let\hspre\(\let\hspost\)% \pboxed}% {\endpboxed% \hsnewpar\belowdisplayskip \ignorespacesafterend} \newenvironment{oldplainhscode}% {\hsnewpar\abovedisplayskip \advance\leftskip\mathindent \hscodestyle \let\\=\@@normalcr \(\pboxed}% {\endpboxed\)% \hsnewpar\belowdisplayskip \ignorespacesafterend} % Here, we make plainhscode the default environment. \newcommand{\plainhs}{\sethscode{plainhscode}} \newcommand{\oldplainhs}{\sethscode{oldplainhscode}} \plainhs % The arrayhscode is like plain, but makes use of polytable's % parray environment which disallows page breaks in code blocks. \newenvironment{arrayhscode}% {\hsnewpar\abovedisplayskip \advance\leftskip\mathindent \hscodestyle \let\\=\@@normalcr \(\parray}% {\endparray\)% \hsnewpar\belowdisplayskip \ignorespacesafterend} \newcommand{\arrayhs}{\sethscode{arrayhscode}} % The mathhscode environment also makes use of polytable's parray % environment. It is supposed to be used only inside math mode % (I used it to typeset the type rules in my thesis). \newenvironment{mathhscode}% {\parray}{\endparray} \newcommand{\mathhs}{\sethscode{mathhscode}} % texths is similar to mathhs, but works in text mode. \newenvironment{texthscode}% {\(\parray}{\endparray\)} \newcommand{\texths}{\sethscode{texthscode}} % The framed environment places code in a framed box. \def\codeframewidth{\arrayrulewidth} \RequirePackage{calc} \newenvironment{framedhscode}% {\parskip=\abovedisplayskip\par\noindent \hscodestyle \arrayrulewidth=\codeframewidth \tabular{@@{}||p{\linewidth-2\arraycolsep-2\arrayrulewidth-2pt}||@@{}}% \hline\framedhslinecorrect\\{-1.5ex}% \let\endoflinesave=\\ \let\\=\@@normalcr \(\pboxed}% {\endpboxed\)% \framedhslinecorrect\endoflinesave{.5ex}\hline \endtabular \parskip=\belowdisplayskip\par\noindent \ignorespacesafterend} \newcommand{\framedhslinecorrect}[2]% {#1[#2]} \newcommand{\framedhs}{\sethscode{framedhscode}} % The inlinehscode environment is an experimental environment % that can be used to typeset displayed code inline. \newenvironment{inlinehscode}% {\(\def\column##1##2{}% \let\>\undefined\let\<\undefined\let\\\undefined \newcommand\>[1][]{}\newcommand\<[1][]{}\newcommand\\[1][]{}% \def\fromto##1##2##3{##3}% \def\nextline{}}{\) }% \newcommand{\inlinehs}{\sethscode{inlinehscode}} % The joincode environment is a separate environment that % can be used to surround and thereby connect multiple code % blocks. \newenvironment{joincode}% {\let\orighscode=\hscode \let\origendhscode=\endhscode \def\endhscode{\def\hscode{\endgroup\def\@@currenvir{hscode}\\}\begingroup} %\let\SaveRestoreHook=\empty %\let\ColumnHook=\empty %\let\resethooks=\empty \orighscode\def\hscode{\endgroup\def\@@currenvir{hscode}}}% {\origendhscode \global\let\hscode=\orighscode \global\let\endhscode=\origendhscode}% \makeatother \EndFmtInput % %endif %endif lhs2tex-1.19/Library/greek.fmt0000644000175000017500000000345612507035615017074 0ustar00andresandres00000000000000%if False %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % greek.fmt % % Formatting of Greek characters. % % Permission is granted to include this file (or parts of this file) % literally into other documents, regardless of the conditions or % license applying to these documents. % % Andres Loeh, November 2005, ver 1.1 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %endif %if not lhs2tex_greek_fmt_read %let lhs2tex_greek_fmt_read = True % %if style == poly %format alpha = "\alpha " %format beta = "\beta " %format gamma = "\gamma " %format delta = "\delta " %format epsilon = "\varepsilon " %format zeta = "\zeta " %format eta = "\eta " %format theta = "\vartheta " %format iota = "\iota " %format kappa = "\kappa " %format lambda = "\lambda " %format mu = "\mu " %format nu = "\nu " %format omikron = "o" %format pi = "\pi " %format rho = "\rho " %format sigma = "\sigma " %format tau = "\tau " %format upsilon = "\upsilon " %format phi = "\varphi " %format chi = "\chi " %format psi = "\psi " %format omega = "\omega " %format Alpha = "\mathrm{A}" %format Beta = "\mathrm{B}" %format Gamma = "\Gamma " %format Delta = "\Delta " %format Epsilon = "\mathrm{E}" %format Zeta = "\mathrm{Z}" %format Eta = "\mathrm{H}" %format Theta = "\Theta " %format Iota = "\mathrm{I}" %format Kappa = "\mathrm{K}" %format Lambda = "\Lambda " %format Mu = "\mathrm{M}" %format Nu = "\mathrm{N}" %format Xi = "\Xi " %format Omikron = "\mathrm{O}" %format Pi = "\Pi " %format Rho = "\mathrm{P}" %format Sigma = "\Sigma " %format Tau = "\mathrm{T}" %format Upsilon = "\Upsilon " %format Phi = "\Phi " %format Chi = "\mathrm{X}" %format Psi = "\Psi " %format Omega = "\Omega " %endif %endiflhs2tex-1.19/src/0000755000175000017500000000000012507035615014442 5ustar00andresandres00000000000000lhs2tex-1.19/src/Main.lhs0000644000175000017500000010125712507035615016044 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Main program} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module Main ( main ) > where > > import Data.Char ( isSpace ) > import Data.List ( isPrefixOf ) > import System.IO > import System.Directory ( copyFile ) > import System.Console.GetOpt > import Text.Regex ( matchRegex, mkRegexWithOpts ) > import System.Environment > import System.Exit > import System.Process > import Control.Arrow > import Control.Monad > import Control.Monad.Error > import Control.Monad.State ( MonadState(..), modify ) > import Control.Monad.Trans > import Prelude hiding ( getContents ) > > import Version > import TeXCommands > import TeXParser > import qualified Verbatim > import qualified Typewriter > import qualified Math > import qualified MathPoly as Poly > import qualified NewCode > import Directives > import Document > import State > import StateT > import qualified FiniteMap as FM > import Auxiliaries > import Value > import License > > import FileNameUtils > --import Directory %endif % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Main loop} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > main :: IO () > main = getArgs >>= main' > main' :: [String] -> IO () > main' args = case getOpt Permute options args of > (o,n,[]) -> do hSetEncoding stdin utf8 > hSetEncoding stdout utf8 > hSetEncoding stderr utf8 > (flags,initdirs,styles) > <- foldM (\(s,d,x) (sf,df,ns) -> do s' <- sf s > return (s',df d,ns ++ x)) > (state0,[],[]) o > case reverse styles of > [] -> lhs2TeX Poly flags (reverse initdirs) n > -- ks, 22.11.2005, changed default style to |Poly| > [Help] -> quitSuccess (usageInfo uheader options) > [SearchPath] -> quitSuccess (init . unlines $ searchPath) > [Version] -> quitSuccess programInfo > [Copying] -> quitSuccess (programInfo ++ "\n\n" ++ copying) > [Warranty] -> quitSuccess (programInfo ++ "\n\n" ++ warranty) > [Pre] | length n >= 3 -> preprocess flags (reverse initdirs) False n -- used as preprocessor -pgmF -F > [Pre,Help] | length n >= 3 -> preprocess flags (reverse initdirs) True n -- used as literate preprocessor -pgmL > [s] -> lhs2TeX s flags (reverse initdirs) n > _ -> quitError (incompatibleStylesError styles) > when (output flags /= stdout) (hClose (output flags)) > (_,_,errs) -> do hPutStrLn stderr $ concat errs > hPutStrLn stderr $ "Trying compatibility mode option handling ..." > cstyle args > where > quitSuccess s = do hPutStrLn stdout $ s > exitWith ExitSuccess > quitError s = do hPutStrLn stderr $ usageInfo (s ++ "\n" ++ uheader) options > exitFailure > incompatibleStylesError ss = "only one style allowed from: " > ++ unwords (map (\s -> "--" ++ decode s) ss) ++ "\n" > type Formatter = XIO Exc State () > initState :: Style -> FilePath -> [FilePath] -> State -> State > initState sty filePath ep s = s { style = sty, > file = filePath, > ofile = filePath, > searchpath = ep, > toggles = FM.fromList toggles0 > } > where toggles0 = --[(decode CodeOnly, Bool (sty == CodeOnly))] > [("style", Int (fromEnum sty))] > ++ [("version", Int numversion)] > ++ [("pre", Int pre)] > ++ [("lang", Int (fromEnum (lang s)))] > ++ [ (decode s, Int (fromEnum s)) | s <- [(minBound :: Style) .. maxBound] ] > ++ [ (decode s, Int (fromEnum s)) | s <- [(minBound :: Lang) .. maxBound] ] > -- |++ [ (s, Bool False) || s <- ["underlineKeywords", "spacePreserving", "meta", "array", "latex209", "times", "euler" ] ]| > preprocess :: State -> [Class] -> Bool -> [String] -> IO () > preprocess flags dirs lit (f1:f2:f3:_) > = if (f1 == f2) && not lit > then copyFile f2 f3 > else do c <- readFile f1 > case matchRegex (mkRegexWithOpts "^%include" True False) c of > Nothing -> if lit then > do h <- openOutputFile f3 > lhs2TeX NewCode (flags { output = h }) (Directive Include "lhs2TeX.fmt" : dirs) [f1] > hClose h > else copyFile f2 f3 > Just _ -> -- supposed to be an lhs2TeX file > do h <- openOutputFile f3 > lhs2TeX NewCode (flags { output = h }) dirs [f1] > hClose h > preprocess _ _ _ _ = error "preprocess: too few arguments" > lhs2TeX :: Style -> State -> [Class] -> [String] -> IO () > lhs2TeX s flags dirs files = do (str, file) <- input files > expandedpath <- expandPath (searchpath flags) > toIO (do put (initState s file expandedpath flags) > formats (map (No 0) dirs) `catchError` abort > formatStr (addEndEOF str) > stopexternals) > where addEndEOF = (++"%EOF\n") . unlines . lines > input :: [String] -> IO (String, FilePath) > input [] = do s <- getContents; return (s, "") > input ["-"] = do s <- getContents; return (s, "") > input (filePath : _) = chaseFile [] filePath Converting command line options into directives. > uheader :: String > uheader = "lhs2TeX [ options ] files\n\nAvailable options:\n" ks, 20.07.2003: The short option for @--align@ has been changed into @-A@. Otherwise @-align@ would not trigger compatibility mode, but be interpreted as a valid option usage. ks, 24.03.2004: The long option @--verbose@ has been removed for now, because with some versions of GHC it triggers ambiguity errors with @--verb@. > options :: [OptDescr (State -> IO State,[Class] -> [Class],[Style])] > options = > [ Option ['h','?'] ["help"](NoArg (return, id, [Help])) "get this help" > , Option ['v'] [] {- ["verbose"] -} > (NoArg (\s -> return $ s { verbose = True }, id, [])) "be verbose" > , Option ['V'] ["version"] (NoArg (return, id, [Version])) "show version" > , Option [] ["tt"] (NoArg (return, id, [Typewriter])) "typewriter style" > , Option [] ["math"] (NoArg (return, id, [Math])) "math style" > , Option [] ["poly"] (NoArg (return, id, [Poly])) "poly style (default)" > , Option [] ["code"] (NoArg (return, id, [CodeOnly])) "code style" > , Option [] ["newcode"] (NoArg (return, id, [NewCode])) "new code style" > , Option [] ["verb"] (NoArg (return, id, [Verb])) "verbatim" > , Option [] ["haskell"] (NoArg (\s -> return $ s { lang = Haskell}, id, [])) "Haskell lexer (default)" > , Option [] ["agda"] (NoArg (\s -> return $ s { lang = Agda}, id, [])) "Agda lexer" > , Option [] ["pre"] (NoArg (return, id, [Pre])) "act as ghc preprocessor" > , Option ['o'] ["output"] (ReqArg (\f -> (\s -> do h <- openOutputFile f > return $ s { output = h }, id, [])) "file") "specify output file" > , Option [] ["file-directives"] > (NoArg (\s -> return $ s { fldir = True }, id, [])) "generate %file directives" > , Option [] ["no-pragmas"] > (NoArg (\s -> return $ s { pragmas = False }, id, [])) "no LINE pragmas" > , Option ['A'] ["align"] (ReqArg (\c -> (return, (Directive Align c:), [])) "col") "align at " > , Option ['i'] ["include"] (ReqArg (\f -> (return, (Directive Include f:), [])) "file") "include " > , Option ['l'] ["let"] (ReqArg (\s -> (return, (Directive Let s:), [])) "equation") "assume " > , Option ['s'] ["set"] (ReqArg (\s -> (return, (Directive Let (s ++ " = True"):), [])) "flag") "set " > , Option ['u'] ["unset"] (ReqArg (\s -> (return, (Directive Let (s ++ " = False"):), [])) "flag") "unset " > , Option ['P'] ["path"] (ReqArg (\p -> (\s -> return $ s { searchpath = modifySearchPath (searchpath s) p }, id , [])) "path") > "modify search path" > , Option [] ["searchpath"] > (NoArg (return, id, [SearchPath])) "show searchpath" > , Option [] ["copying"] (NoArg (return, id, [Copying])) "display license" > , Option [] ["warranty"](NoArg (return, id, [Warranty])) "info about warranty" > ] > > formatStr :: String -> Formatter > formatStr str = formats (texparse 1 str) `catchError` abort Compatibility mode option handling. > cstyle :: [String] -> IO () > cstyle args@(('-':a) : x) = case encode a of > Just sty -> cstyle' sty x > Nothing -> cstyle' Typewriter args > cstyle args = cstyle' Typewriter args > cstyle' :: Style -> [String] -> IO () > cstyle' s args = let (dirs,files) = coptions args > in lhs2TeX s state0 dirs files > coptions :: [String] -> ([Class], [String]) > coptions = foldr (<|) ([], []) > where > "-align" <| (ds, s : as) = (Directive Align s : ds, as) > "-i" <| (ds, s : as) = (Directive Include s : ds, as) > "-l" <| (ds, s : as) = (Directive Let s : ds, as) > ('-' : 'i' : s) <| (ds, as) = (Directive Include s : ds, as) > ('-' : 'l' : s) <| (ds, as) = (Directive Let s : ds, as) > s <| (ds, as) = (ds, s : as) We abort immediately if an error has occured. > abort :: Exc -> Formatter > abort (msg, context) = do st <- get > liftIO (hPutStrLn stderr (text st)) > liftIO (exitWith (ExitFailure 1)) > where text st = "*** Error in " ++ at (file st) (lineno st) ++ ": \n" > ++ unlines [ "included from " ++ at f l | (f, l) <- files st ] > ++ msg ++ "\n" > ++ unlines (take 4 (lines context)) > at f n = "file " ++ f ++ " line " ++ show n % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Formatting} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > formats :: [Numbered Class] -> Formatter > formats [] = return () > formats (No n (Directive d s) : ts) > | conditional d = do modify (\st -> st{lineno = n}) > st <- get > directive (lang st) > d s (file st,n) > (conds st) (toggles st) ts > formats (No n t : ts) = do modify (\st -> st{lineno = n}) > format t > formats ts > format :: Class -> Formatter > -- |format (Many ('%' : '%' : _)) = return ()| -- @%%@-comments used to be removed > format (Many s) = out (Text s) > format (Inline s) = inline s > format (Command Hs s) = inline s > format (Command (Vrb b) s) = out (Verbatim.inline b s) > format (Command Eval s) = do st <- get > unless (style st `elem` [CodeOnly,NewCode]) $ > do result <- external (map unNL s) > inline result > format (Command Perform s) = do st <- get > unless (style st `elem` [CodeOnly,NewCode]) $ > do result <- external (map unNL s) > modify (\st@State{file = f', lineno = l'} -> > st{file = "", files = (f', l') : files st}) > liftIO (when (verbose st) (hPutStr stderr $ "(" ++ "")) > formatStr (addEndNL result) > modify (\st'@State{files = (f, l) : fs} -> > st'{file = f, lineno = l, files = fs}) > liftIO (when (verbose st) (hPutStrLn stderr $ ")")) > where > addEndNL = (++"\n") . unlines . lines Remove trailing blank line. > trim = reverse >>> skip >>> reverse > > skip s | all isSpace t = u > | otherwise = s > where (t, u) = breakAfter (== '\n') s > format (Environment Haskell_ s) > = display s > format (Environment Code s) = display s > format (Environment Spec s) = do st <- get > unless (style st `elem` [CodeOnly,NewCode]) $ > display s > format (Environment Evaluate s) > = do st <- get > unless (style st `elem` [CodeOnly,NewCode]) $ > do result <- external s > display result > format (Environment Hide s) = return () > format (Environment Ignore s) = return () > format (Environment (Verbatim b) s) > = out (Verbatim.display 120 b s) > format (Directive Format s) = do st <- get > b@(n,e) <- fromEither (parseFormat (lang st) s) > put (st{fmts = FM.add b (fmts st)}) > format (Directive Subst s) = do st <- get > b <- fromEither (parseSubst (lang st) s) > put (st{subst = FM.add b (subst st)}) > format (Directive Include arg)= do st <- get > let d = path st > let sp = searchpath st > modify (\st@State{file = f', lineno = l'} -> > st{file = f, files = (f', l') : files st, path = d ++ dir f}) > -- |d <- liftIO getCurrentDirectory| > -- |liftIO (setCurrentDirectory (dir f))| > (str,f) <- liftIO (chaseFile sp (d ++ f)) > modify (\st -> st { file = f }) > liftIO (when (verbose st) (hPutStr stderr $ "(" ++ f)) > formatStr (addEndNL str) > -- |liftIO (setCurrentDirectory d)| > modify (\st'@State{files = (f, l) : fs} -> > st'{file = f, lineno = l, files = fs, path = d}) > liftIO (when (verbose st) (hPutStrLn stderr $ ")")) > where f = withoutSpaces arg > addEndNL = (++"\n") . unlines . lines ks, 25.01.2003: I added the above function at the suggestion of NAD, but I am not completely sure if this is the right thing to do. Maybe we should strip blank lines from the end of a file as well, maybe we should do nothing at all. Hard to say what people think is intuitive. Anyway, the reason why I added it is this: if an %include directive is immediately followed by another line and the included file does not end in a blank line, then there will not be a single space between the last character of the included file and the first character of the following line. It would be possible to split a TeX control sequence over two different files that way. Seems strange. So we add a newline, or even two if none has been there before, to make sure that exactly one linebreak ends up in the output, but not more, as a double newline is interpreted as a \par by TeX, and that might also not be desired. > format (Directive Begin _) = modify (\st -> st{stack = fmts st : stack st}) > format (Directive End _) = do st <- get > when (null (stack st)) $ > do liftIO (hPutStrLn stderr $ "unbalanced %} in line " > ++ show (lineno st)) > modify (\st -> st{stack = [fmts st]}) > modify (\st@State{stack = d:ds} -> st{fmts = d, stack = ds}) ks, 11.09.03: added exception handling for unbalanced grouping \Todo{|toggles| should be saved, as well.} > format (Directive Let s) = do st <- get > t <- fromEither (define (lang st) (toggles st) s) > put st{toggles = FM.add t (toggles st)} > format (Directive Align s) > | all isSpace s = modify (\st -> st{align = Nothing, stacks = ([], [])}) > | otherwise = modify (\st -> st{align = Just (read s), stacks = ([], [])}) \NB @%align@ also resets the left identation stacks. Also, the @poly@ directives @%separation@ and @%latency@ reset the corresponding indentation stack |pstack|. > format (Directive Separation s ) > = modify (\st -> st{separation = read s, pstack = []}) > format (Directive Latency s) = modify (\st -> st{latency = read s, pstack = []}) > format (Directive File s) = modify (\st -> st{file = withoutSpaces s}) > format (Directive Options s) = modify (\st -> st{opts = trim s}) > where trim = dropWhile isSpace >>> reverse >>> dropWhile isSpace >>> reverse > format (Error exc) = throwError exc Printing documents. %{ %format d1 %format d2 > eject :: Doc -> Formatter > eject Empty = return () > eject (Text s) = do st <- get > let (ls,enl) = checkNLs 0 s > when (fldir st && not (null s) && atnewline st && (ofile st /= file st || olineno st /= lineno st)) $ > do liftIO (hPutStr (output st) ("%file " ++ show (lineno st) ++ " " ++ show (file st) ++ "\n")) > put (st { ofile = file st, olineno = lineno st }) > > liftIO (hPutStr (output st) s) > modify (\st -> st { olineno = olineno st + ls, atnewline = enl (atnewline st)}) > where > checkNLs n ('\n':[]) = (n+1,const True) > checkNLs n (_:[]) = (n,const False) > checkNLs n [] = (n,id) > checkNLs n ('\n':xs) = checkNLs (n+1) xs > checkNLs n (_:xs) = checkNLs n xs > eject (d1 :^: d2) = eject d1 >> eject d2 > eject (Embedded s) = formatStr s > eject (Sub s ds) = do st <- get; substitute (subst st) > where > substitute d = case FM.lookup s d of > Nothing -> throwError (undef s, "") > Just sub -> eject (sub ds) > > undef :: String -> String > undef s = "`" ++ s ++ "' is not defined;\n\ > \perhaps you forgot to include \"lhs2TeX.fmt\"?" %} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Style dependent formatting} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > out :: Doc -> Formatter > out d = do st <- get; eject (select (style st)) > where select CodeOnly = Empty > select NewCode = Empty > select _ = d > inline, display :: String -> Formatter > inline s = do st <- get > d <- fromEither (select (style st) st) > eject d > where select Verb st = Right (Verbatim.inline False s) > select Typewriter st = Typewriter.inline (lang st) (fmts st) s > select Math st = Math.inline (lang st) (fmts st) (isTrue (toggles st) auto) s > select Poly st = Poly.inline (lang st) (fmts st) (isTrue (toggles st) auto) s > select CodeOnly st = return Empty > select NewCode st = return Empty -- generate PRAGMA or something? > display s = do st <- get > (d, st') <- fromEither (select (style st) st) > put st' > eject d > where select Verb st = return (Verbatim.display 120 False s, st) > select Typewriter st = do d <- Typewriter.display (lang st) (fmts st) s; return (d, st) > select Math st = do (d, sts) <- Math.display (lang st) (fmts st) (isTrue (toggles st) auto) (stacks st) (align st) s > return (d, st{stacks = sts}) > select Poly st = do (d, pstack') <- Poly.display (lang st) (lineno st + 1) (fmts st) (isTrue (toggles st) auto) (separation st) (latency st) (pstack st) s > return (d, st{pstack = pstack'}) > select NewCode st = do d <- NewCode.display (lang st) (fmts st) s > let p = sub'pragma $ Text ("LINE " ++ show (lineno st + 1) ++ " " ++ show (takeFileName $ file st)) > return ((if pragmas st then ((p <> sub'nl) <>) else id) d, st) > select CodeOnly st = return (Text (trim s), st) > auto = "autoSpacing" > isTrue togs s = bool (value togs s) Delete leading and trailing blank line (only the first!). > trim :: String -> String > trim = skip >>> reverse >>> skip >>> reverse > where > skip :: String -> String > skip "" = "" > skip s | all isSpace t = u > | otherwise = s > where (t, u) = breakAfter (== '\n') s % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Conditional directives} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - A stack of Boolean values holds the conditions of @%if@-directives. Perhaps surpsingly, each @%if@ gives rise to \emph{two} entries; if @%elif@ is not used the second entry is always |True|, otherwise it holds the negation of all previous conditions of the current @%if@-chain. ks, 16.08.2004: At the end of the input, we might want to check for unbalanced if's or groups. > directive :: Lang -> Directive -> String > -> (FilePath,LineNo) -> [CondInfo] -> Toggles > -> [Numbered Class] -> Formatter > directive lang d s (f,l) stack togs ts > = dir d s stack > where > dir If s bs = do b <- fromEither (eval lang togs s) > skipOrFormat ((f, l, bool b, True) : bs) ts > dir Elif s ((f,l,b2,b1):bs) = do b <- fromEither (eval lang togs s) > skipOrFormat ((f, l, bool b, not b2 && b1) : bs) ts > dir Else _ ((f,l,b2,b1):bs) = skipOrFormat ((f, l, not b2 && b1, True) : bs) ts > dir Endif _ ((f,l,b2,b1):bs)= skipOrFormat bs ts > dir EOF _ [] = return () -- nothing left to do > dir EOF s bs = throwError (init $ unlines (map unBalancedIf bs), s) > dir d s _ = throwError ("spurious %" ++ decode d, s) > skipOrFormat :: [CondInfo] -> [Numbered Class] -> Formatter > skipOrFormat stack ts = do modify (\st -> st{conds = stack}) > if andS stack then formats ts > else skip ts > andS :: [CondInfo] -> Bool > andS = all (\(_,_,x,y) -> x && y) > unBalancedIf :: CondInfo -> String > unBalancedIf (f,l,_,_) = "%if at " ++ f ++ " line " ++ show l ++ " not closed" > skip :: [Numbered Class] -> Formatter > skip [] = return () > skip ts@(No n (Directive d s) : _) > | conditional d = formats ts > skip (t : ts) = skip ts % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Active commands} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - ks, 23.10.2003: extended to work with @ghci@, too. ks, 03.01.2004: fixed to work with @ghci-6.2@, hopefully without breaking @hugs@ or old @ghci@ compatibility. New, 26.01.2006: we're now starting an external process @ghci@ or @hugs@ using the System.Process library. The process is then reused for subsequent computations, which should dramatically improve compilation time for documents that make extensive use of @\eval@ and @\perform@. The function |external| can be used to call the process. It is discouraged to call any programs except @ghci@ or @hugs@, because we make a number of assumptions about the program being called. Input is the expression to evaluate. Output is the result in string form. > external :: String -> XIO Exc State String > external expr = do st <- get > let os = opts st > f = file st > ex = externals st > ghcimode = "ghci" `isPrefixOf` os > cmd > | ghcimode = os ++ " -v0 -ignore-dot-ghci " ++ f > | otherwise = (if null os then "hugs " else os ++ " ") ++ f > script = "putStrLn " ++ show magic ++ "\n" > ++ expr ++ "\n" > ++ "putStrLn " ++ show magic ++ "\n" > pi <- case FM.lookup f ex of > Just pi -> return pi > Nothing -> -- start new external process > liftIO $ do > when (verbose st) $ > hPutStrLn stderr $ "Starting external process: " ++ cmd > runInteractiveCommand cmd > put (st {externals = FM.add (f,pi) ex}) > let (pin,pout,_,_) = pi > liftIO $ do > -- hPutStrLn stderr ("sending: " ++ script) > hPutStr pin script > hFlush pin > extract' pout This function can be used to stop all external processes by sending the @:q@ command to them. > stopexternals :: Formatter > stopexternals = do st <- get > let ex = externals st > pis = map (ex FM.!) (FM.keys ex) > when (not . null $ pis) $ liftIO $ do > when (verbose st) $ > hPutStrLn stderr $ "Stopping external processes." > mapM_ (\(pin,_,_,pid) -> do hPutStrLn pin ":q" > hFlush pin > waitForProcess pid) pis To extract the answer from @ghci@'s or @hugs@' output we use a simple technique which should work in most cases: we print the string |magic| before and after the expression we are interested in. We assume that everything that appears before the first occurrence of |magic| on the same line is the prompt, and everything between the first |magic| and the second |magic| plus prompt is the result we look for. > magic :: String > magic = "!@#$^&*" > > extract' :: Handle -> IO String > extract' h = fmap (extract . unlines) (readMagic 2) > where readMagic :: Int -> IO [String] > readMagic 0 = return [] > readMagic n = do l <- hGetLine h > -- hPutStrLn stderr ("received: " ++ l) > let n' | (null . snd . breaks (isPrefixOf magic)) l = n > | otherwise = n - 1 > fmap (l:) (readMagic n') > extract :: String -> String > extract s = v > where (t, u) = breaks (isPrefixOf magic) s > -- t contains everything up to magic, u starts with magic > -- |u' = tail (dropWhile (/='\n') u)| > pre = reverse . takeWhile (/='\n') . reverse $ t > prelength = if null pre then 0 else length pre + 1 > -- pre contains the prefix of magic on the same line > u' = drop (length magic + prelength) u > -- we drop the magic string, plus the newline, plus the prefix > (v, _) = breaks (isPrefixOf (pre ++ magic)) u' > -- we look for the next occurrence of prefix plus magic % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Reading files} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > dir :: FilePath -> FilePath > dir filePath > | null d = "" > | otherwise = reverse d > where d = dropWhile (/= '/') (reverse filePath) lhs2tex-1.19/src/MathCommon.lhs0000644000175000017500000002245512507035615017224 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Common code for math and poly formatters} %-------------------------------= -------------------------------------------- ks, 15.06.2004: I have moved common code from the math and poly formatters to this module. Poly has been created from a copy of the old math formatter, therefore there has been much overlap between the two modules. > module MathCommon ( module MathCommon ) > where > import Typewriter ( latex ) > import Document > import Directives > import HsLexer > import qualified FiniteMap as FM > import Auxiliaries > > import Control.Monad > when :: Monad m => Bool -> (a -> m a) -> (a -> m a) > when True f = f > when False f = return % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Adding positional information} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > type Row = Int > type Col = Int > > data Pos a = Pos {row :: !Row, col :: !Col, ann :: a} > deriving (Show) %{ %format r1 %format r2 %format c1 %format c2 > instance Eq (Pos a) where > Pos r1 c1 _ == Pos r2 c2 _= r1 == r2 && c1 == c2 > instance Ord (Pos a) where > Pos r1 c1 _ <= Pos r2 c2 _= (r1, c1) <= (r2, c2) > pos2string :: Pos a -> String > pos2string (Pos r c _) = "'" ++ show r ++ "_" ++ show c %} > instance (CToken tok) => CToken (Pos tok) where > catCode (Pos _ _ t) = catCode t > token (Pos _ _ t) = token t > inherit (Pos r c t') t = Pos r c (inherit t' t) > fromToken t = Pos 0 0 (fromToken t) Numbering the list of tokens. > number :: Row -> Col -> [Token] -> [Pos Token] > number r c [] = [] > number r c (t : ts) = Pos r c t : number r' c' ts > where (r', c') = count r c (string t) > > count :: Row -> Col -> String -> (Row, Col) > count r c [] = (r, c) > count r c (a : s) > | a == '\n' = count (r + 1) 1 s > | otherwise = count r (c + 1) s Splitting the token list in lines. > lines :: [Pos a] -> [[Pos a]] > lines = split 1 > where > split _ [] = [] > split r ts = us : split (r + 1) vs > where (us, vs) = span (\t -> row t <= r) ts % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{A very simple Haskell Parser} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - ks, 27.06.2003: I'll add some explanation which reflects the way I understand things. Since I don't know Smugweb and I haven't written the code below, it is possible that the explanation is not adequate: A |Chunk| is a sequence of \emph{delimiters} or \emph{applications}. Delimiters are keywords or operators. Applications are everything else. An |application| is a sequence of atoms that are forming a Haskell function application. The list must never be empty, but can contain a single element (for instance, in normal infix expressions such as |2 + 3| this will occur frequently). An |atom| is a single identifier (not an operator, though -- those are delimiters), or a chunk in parentheses. > type Chunk a = [Item a] > > data Item a = Delim a > | Apply [Atom a] > deriving (Show) > > data Atom a = Atom a > | Paren a (Chunk a) a > deriving (Show) The parser itself differs between the two styles. The math formatter cannot handle unbalanced parentheses, the poly formatter has a heuristic that allows successful parsing of unbalanced parentheses in many, but not all cases. % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Making replacements} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > data Mode = Mandatory > | Optional Bool If |eval e| returns |Mandatory| then parenthesis around |e| must not be dropped; |Optional True| indicates that it can be dropped; |Optional False| indicates that the decision is up the caller. % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Making replacements} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - ks, 23.07.2003: This substitute function does not work recursively. To change this is on my TODO list. Substitutions without arguments, hovewer, do work recursively because they are handled again at a later stage (by the call to latexs, for instance in leftIndent). > substitute :: (CToken tok,Show tok) => Formats -> Bool -> Chunk (Pos tok) -> [Pos tok] > substitute d auto chunk = snd (eval chunk) > where > eval :: (CToken tok) => [Item (Pos tok)] -> (Mode,[Pos tok]) > eval [e] = eval' e > eval chunk = (Optional False, concat [ snd (eval' i) | i <- chunk ]) > > eval' :: (CToken tok) => Item (Pos tok) -> (Mode,[Pos tok]) > eval' (Delim s) = (Optional False, [s]) > eval' (Apply []) = impossible "eval'" > eval' (Apply (e : es)) = eval'' False e es > > eval'' :: (CToken tok) => Bool -> Atom (Pos tok) -> [Atom (Pos tok)] -> (Mode,[Pos tok]) > eval'' _ (Atom s) es = case FM.lookup (string (token s) ++ pos2string s) d `mplus` FM.lookup (string (token s)) d of > Nothing -> (Optional False, s : args es) > Just (opt, opts, lhs, rhs)-> (Optional opt, set s (concat (fmap sub rhs)) ++ args bs) > where > (as, bs) | m <= n = (es ++ replicate (n - m) dummy, []) > | otherwise = splitAt n es > n = length lhs > m = length es > binds = zip lhs [ snd (eval'' b a []) | (b, a) <- zip opts as ] > sub t@(Varid x) = case FM.lookup x (FM.fromList binds) of > Nothing -> [fromToken t] > Just ts -> ts > sub t = [fromToken t] Whenever a token is replaced or removed, the first token of the replacement inherits the position of the original token. > eval'' opt (Paren l e r) es > | optional = (Mandatory, set l s ++ args es) > | otherwise = (Optional False, [l] ++ s ++ [r] ++ args es) > where (flag, s) = eval e > optional = catCode l == Del '(' && not (mandatory e) > && case flag of Mandatory -> False; Optional f -> opt || f \NB It is not a good idea to remove parentheses around atoms, because that would remove the parentheses in @deriving (Eq)@ and @module M (a)@ as well. > args :: (CToken tok) => [Atom (Pos tok)] -> [Pos tok] > args es = concat [ sp ++ snd (eval'' False i []) | i <- es ] -- $\cong$ Applikation > sp :: (CToken tok) => [Pos tok] > sp | auto = [fromToken (TeX False sub'space)] > | otherwise = [] To support macros of the form @%format Parser (a) = a@. > set :: (CToken tok) => tok -> [tok] -> [tok] > set s [] = [] > set s (t : ts) = inherit s (token t) : ts > > mandatory :: (CToken tok) => Chunk tok -> Bool > mandatory e = False Code before: < mandatory e = null e -- nullary tuple < || or [ isComma i | i <- e ] -- tuple < || isOp (head e) -- left section < || isOp (last e) -- right section > isComma, isOp :: (CToken tok) => Item tok -> Bool > isComma (Delim t) = case token t of > Special c -> c == ',' > _ -> False > isComma _ = False > > isOp (Delim t) = case token t of > Special c -> c == '`' -- f"ur @` div `@ > Consym _ -> True > Varsym s -> s /= "\\" > Op _ -> True > _ -> False > isOp _ = False > dummy :: (CToken tok) => Atom tok > dummy = Atom (fromToken (Varid "")) \NB We cannot use embedded \TeX\ text here, because |TeX| is not a legal atom (|string| is applied to it). % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Adding spaces and indentation} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - There are subtle differences between the two styles. For inline-code. > latexs :: (CToken tok) => Formats -> [tok] -> Doc > latexs dict = catenate . fmap (latex sub'space sub'space dict . token) lhs2tex-1.19/src/TeXParser.lhs0000644000175000017500000002302112507035615017025 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Pseudo-\TeX\ Parser} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module TeXParser ( texparse ) > where > import Data.Char ( isSpace, isAlpha ) > import TeXCommands > import Data.List ( isPrefixOf ) > import Auxiliaries hiding ( breaks ) %endif Care is taken that no character of the input is lost; this is necessary for reporting the correct line number if an error occurs. > texparse :: LineNo -> String -> [Numbered Class] > texparse n = number n . compress . classify0 "" To be able to catch errors the maximum length of arguments is restricted to |maxChar| for commands and to |maxLine| for environments. > maxChar, maxLine :: Int > maxChar = 1000 > maxLine = 80 * 500 A simple Pseudo-\TeX-Parser. \NB Pseudo-\TeX\ environments must not be nested: \[ @\begin{code}...\begin{code}...\end{code}...\end{code}@ \] is not parsed properly. |classify0| is only used at the start of a file or line; it recognizes bird (and inverse bird) tracks. > classify0 :: String -> String -> [Class] > classify0 _ [] = [] > classify0 n ('>' : s) = Environment Code (n ++ ' ' : t) : classify0 "" u > where (t, u) = unbird '>' s > classify0 n ('<' : s) = Environment Spec (n ++ ' ' : t) : classify0 "" u > where (t, u) = unbird '<' s > classify0 n s = Many n : classify s \NB The preceding newline (if any) is put into the code section to be able to suppress blank lines in the \LaTeX\ text. > classify :: String -> [Class] > classify [] = [] > classify ('\n' : s) = classify0 "\n" s Commands disguised as comments (AKA pseudo-comments). ks, 19.08.2004: changed |classify v| to |classify0 v| calls, to recognize (incorrect-Haskell) bird tracks directly after a directive. > classify ('%' : s) = case encode t of > Nothing -> Many ('%' : t ++ arg) : classify0 "" v > Just cmd -> Directive cmd arg : classify0 "" v > where (t, u) = break isSpace s > (arg, v) = breakAfter (== '\n') u \NB Text starting with @%@ is ignored; in most cases this is what you want (exception @\%@). Environments. > classify str@('\\' : s) = case span isIdChar s of > ("begin", '{' : t) -> case span isIdChar t of > (env, '}' : u) -> case encode env of > Nothing -> cont > Just cmd > | pred v -> Environment cmd (arg ++ w) : classify x > | otherwise -> notFound end str : cont > where > end = "\\end{" ++ env ++ "}" > pred = isPrefixOf end > (arg, v) = breaks maxLine pred u > (w, x) = blank (drop (length end) v) > _ -> cont Inline verbatim commands are treated specially; otherwise @\verb|a|@ would be mistaken as inline code. Furthermore: then we are able to write @\verb|\begin{code}|@. > ("verb*", c : t) -> verbatim True c t > ("verb", c : t) -> verbatim False c t Commands. > (cmd, '{' : t) -> case encode cmd of > Nothing -> cont > Just cmd -> case nested maxChar 0 t of > (a, '}' : u) -> Command cmd a : classify u > _ -> notFound "matching `}'" str : cont > ([], '%' : t) -> Many "\\%" : classify t > _ -> cont > where > cont = One '\\' : classify s > verbatim b c t = case verb maxChar c t of > (u, c' : v) | c == c' -> Command (Vrb b) u : classify v > _ -> notFound ("matching `" ++ [c] ++ "'") str : cont Inline code. > classify ('|' : '|' : s) = One '|' : classify s > classify str@('|' : s) = case inline maxChar s of > (arg, '|' : t) -> Inline arg : classify t > _ -> notFound "matching `|'" str : One '|' : classify s Short verb. > classify ('@' : '@' : s) = One '@' : classify s > classify str@('@' : s) = case shortverb maxChar s of > (arg, '@' : t) -> Command (Vrb False) arg : classify t > _ -> notFound "matching `@'" str : One '@' : classify s Everything else. > classify (c : s) = One c : classify s > notFound :: String -> String -> Class > notFound what s = Error (what ++ " not found", s) > isIdChar :: Char -> Bool > isIdChar c = isAlpha c || c == '*' % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Parsing of arguments} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - The parser satisfy % \begin{eqnarray*} |parse M.s = (M.l, M.r)| & |==>| & |M.s = M.l ++ M.r| \end{eqnarray*} % The function |nested n 0| recognizes arguments enclosed in matching curly braces. > nested :: Int -> Int -> String -> (String, String) > nested n depth s = nest n s > where > nest 0 s = ([], s) > nest n [] = ([], []) > nest n ('}' : s) > | depth == 0 = ([], '}' : s) > | otherwise = '}' <| nested (n - 1) (depth - 1) s > nest n ('{' : s) = '{' <| nested (n - 1) (depth + 1) s > nest n ('\\' : c : s) = '\\' <| c <| nest (n - 2) s > nest n (c : s) = c <| nest (n - 1) s The function |verb n c| recognizes arguments enclosed in |c|. > verb :: Int -> Char -> String -> (String, String) > verb 0 c s = ([], s) > verb n c [] = ([], []) > verb n c (c' : s) > | c == c' = ([], c' : s) > | otherwise = c' <| verb (n - 1) c s The function |inline n| recognizes arguments enclosed in vertical bars (and converts double bars into single bars; therefore it is \emph{not} equivalent to |verb n '||'|). > inline :: Int -> String -> (String, String) > inline 0 s = ([], s) > inline n [] = ([], []) > inline n ('|' : '|' : s) = '|' <| inline (n - 2) s > inline n ('|' : s) = ([], '|' : s) > inline n (c : s) = c <| inline (n - 1) s > > shortverb :: Int -> String -> (String, String) > shortverb 0 s = ([], s) > shortverb n [] = ([], []) > shortverb n ('@' : '@' : s) = '@' <| shortverb (n - 2) s > shortverb n ('@' : s) = ([], '@' : s) > shortverb n (c : s) = c <| shortverb (n - 1) s The function |unbird| recognizes code sections marked by bird tracks; |blank| skips the next line if it is blank. > unbird :: Char -> String -> (String, String) > unbird c [] = ([], []) > unbird c ('\n' : c' : s) > | c == c' = '\n' <| ' ' <| unbird c s > unbird c ('\n' : s) = '\n' <| blank s > unbird c (c' : s) = c' <| unbird c s > > blank :: String -> (String, String) > blank s | all isSpace t = (t, u) > | otherwise = ("", s) > where (t, u) = breakAfter (== '\n') s |breaks n pred as| returns |(x, y)| such that |as = x ++ y|, |pred y| holds and |x| is as small as possible (but at most of length |n|). > breaks :: Int -> ([a] -> Bool) -> [a] -> ([a], [a]) > breaks n pred [] = ([], []) > breaks n pred as@(a : as') > | n == 0 || pred as = ([], as) > | otherwise = a <| breaks (n - 1) pred as' % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Post processing} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - Collaps adjacent |One|'s into a |Many|. > compress = foldr (<|) [] > where > One '\n' <| ts = Many "\n" : ts > Many s@('\n' : _) <| ts = Many s : ts > One c <| (Many s : ts) = Many (c : s) : ts > One c <| ts = Many [c] : ts > Many s <| (Many s' : ts) = Many (s ++ s') : ts > t <| ts = t : ts \NB The first two equations make |compress| incrementel (?); otherwise \[ |do s <- readFile "Examples/InfI.lhs"; mapM_ print (compress (map One s))| \] is silent until the complete input has been digested. Adding line numbers. > number :: LineNo -> [Class] -> [Numbered Class] > number n [] = [] > number n (t : ts) = No n t : number (n + i) ts > where i = case t of > One c -> impossible "number" > Many s -> newlines s > Inline s -> newlines s > Command _ s -> newlines s > Environment _ s -> newlines s > Directive _ s -> newlines s > Error _ -> 0 Number of newline characters in a string. > newlines :: String -> Int > newlines s = length [ c | c <- s, c == '\n' ] lhs2tex-1.19/src/Typewriter.lhs0000644000175000017500000001112112507035615017324 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Typewriter formatter} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module Typewriter ( module Typewriter ) > where > > import Control.Monad > > import Verbatim ( trim, expand ) > import Document > import Directives > import HsLexer > import qualified FiniteMap as FM > import Auxiliaries > import TeXCommands ( Lang (..) ) %endif % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Inline and display code} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > inline, display :: Lang -> Formats -> String -> Either Exc Doc > inline lang dict = tokenize lang > >=> lift (latexs sub'thin sub'thin dict) > >=> lift sub'inline > display lang dict = lift trim > >=> lift (expand 0) > >=> tokenize lang > >=> lift (latexs sub'space sub'nl dict) > >=> lift sub'code % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{\LaTeX\ encoding} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > latexs :: Doc -> Doc -> Formats -> [Token] -> Doc > latexs sp nl dict = catenate . map (latex sp nl dict) > > latex :: Doc -> Doc -> Formats -> Token -> Doc > latex sp nl dict = tex Empty > where > tex _ (Space s) = sub'spaces (convert False s) > tex q (Conid s) = replace q s (sub'conid (q <> convert False s)) > tex _ (Varid "") = sub'dummy -- HACK > tex q (Varid s) = replace q s (sub'varid (q <> convert False s)) > tex q (Consym s) = replace q s (sub'consym (q <> convert False s)) > tex q (Varsym s) = replace q s (sub'varsym (q <> convert False s)) > tex _ (Numeral s) = replace Empty s (sub'numeral (convert True s)) -- NEU > tex _ (Char s) = sub'char (catenate (map conv' (init $ tail s))) -- NEW: remove quotes > tex _ (String s) = sub'string (catenate (map conv' (init $ tail s))) -- NEW: remove quotes > tex _ (Special c) = sub'special (replace Empty [c] (conv False c)) > tex _ (Comment s) = sub'comment (Embedded s) > tex _ (Nested s) = sub'nested (Embedded s) > tex _ (Pragma s) = sub'pragma (Embedded s) > tex _ (Keyword s) = replace Empty s (sub'keyword (convert False s)) > tex _ (TeX False d) = d > tex _ (TeX True d) = sub'tex d > tex _ t@(Qual ms t') = replace Empty (string t) (tex (catenate (map (\m -> tex Empty (Conid m) <> Text ".") ms)) t') > tex _ t@(Op t') = replace Empty (string t) (sub'backquoted (tex Empty t')) > where cmd | isConid t'= sub'consym > | otherwise = sub'varsym > > replace q s def = case FM.lookup s dict of > Just (_, _, [], ts) -> q <> catenate (map (tex Empty) ts) > _ -> def \NB the directives @%format a = b@ and @%format b = a@ cause a loop. \NB Only nullary macros are applied. Conversion of strings and characters. The Boolean indicates whether we want to convert a numeric literal which could contain an exponent. > convert :: Bool -> String -> Doc > convert isNum s = catenate (map (conv isNum) s) > conv :: Bool -> Char -> Doc > conv _ ' ' = sp > conv _ '\n' = nl > conv isNum c > | c `elem` "#$%&" = Text ("\\" ++ [c]) > | c `elem` "\"\\^_{}~" = Text (char c) > | isNum && c `elem` "-+"= Text ("{" ++ [c] ++ "}") > | otherwise = Text [c] > > conv' ' ' = Text "~" -- NEW: instead of |Text (char ' ')| -- for character and string literals > conv' c = conv False c \NB The character @"@ is not copied verbatim, to be able to use @german.sty@ (@"@ is made active). \NB The coding of characters is not independent of the \TeX\ font used, eg @\/@ appears different in italics and typewriter (@\@ is \texttt{\char'134} in typewriter, but \textit{\char'134} in italics). > char :: Char -> String > char c = "\\char" ++ show (fromEnum c) ++ " " lhs2tex-1.19/src/NewCode.lhs0000644000175000017500000001132412507035615016477 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{New code formatter} %-------------------------------= -------------------------------------------- This is a more sophisticated code formatter that respects formatting directives. It should even respect formatting directives with arguments, in a way that is compatible with the @poly@ or @math@ formatters. %if codeOnly || showModuleHeader > module NewCode ( module NewCode ) > where > > import Control.Monad ( (>=>) ) > import Data.List ( partition ) > > import Verbatim ( trim, expand ) > import Document > import Directives > import HsLexer > import qualified FiniteMap as FM > import Auxiliaries > import MathPoly ( exprParse, substitute, number ) > import TeXCommands ( Lang(..) ) %endif % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Display code} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \NB We do not need an |inline| function because we are only interested in the ``real'' program code. All comments are deleted. > display :: Lang -> Formats -> String -> Either Exc Doc > display lang fmts = lift trim > >=> lift (expand 0) > >=> tokenize lang > >=> lift (number 1 1) > >=> lift (partition (\t -> catCode t /= White)) > >=> exprParse *** return > >=> lift (substitute fmts False) *** return > >=> lift (uncurry merge) > >=> lift (fmap token) > >=> lift (latexs sub'space sub'nl fmts) > >=> lift sub'code % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Encoding} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - ks, added 10.01.2004: This is based on |latexs| in Typewriter, and therefore still named this way, but it is a bit simpler and does not use anything \LaTeX ish: the |latexs| and |latex| functions itself are copied literally, but |convert| does not do anything except replacing newlines and spaces, if specified by an appropriate @%subst@. It's questionable whether this functionality is actually desired. > latexs :: Doc -> Doc -> Formats -> [Token] -> Doc > latexs sp nl dict = catenate . map (latex sp nl dict) > > latex :: Doc -> Doc -> Formats -> Token -> Doc > latex sp nl dict = tex Empty > where > tex _ (Space s) = sub'spaces (convert s) > tex q (Conid s) = replace q s (sub'conid (q <> convert s)) > tex _ (Varid "") = sub'dummy -- HACK > tex q (Varid s) = replace q s (sub'varid (q <> convert s)) > tex q (Consym s) = replace q s (sub'consym (q <> convert s)) > tex q (Varsym s) = replace q s (sub'varsym (q <> convert s)) > tex _ (Numeral s) = replace Empty s (sub'numeral (convert s)) -- NEU > tex _ (Char s) = sub'char (catenate (map conv (init $ tail s))) -- NEW: remove quotes > tex _ (String s) = sub'string (catenate (map conv (init $ tail s))) -- NEW: remove quotes > tex _ (Special c) = sub'special (replace Empty [c] (conv c)) > tex _ (Comment s) = sub'comment (convert s) > tex _ (Nested s) = sub'nested (convert s) > tex _ (Pragma s) = sub'pragma (convert s) > tex _ (Keyword s) = replace Empty s (sub'keyword (convert s)) > tex _ (TeX False d) = d > tex _ (TeX True d) = sub'tex d > tex _ t@(Qual ms t') = replace Empty (string t) (tex (catenate (map (\m -> tex Empty (Conid m) <> Text ".") ms)) t') > tex _ t@(Op t') = replace Empty (string t) (sub'backquoted (tex Empty t')) > where cmd | isConid t'= sub'consym > | otherwise = sub'varsym > > replace q s def = case FM.lookup s dict of > Just (_, _, [], ts) -> q <> catenate (map (tex Empty) ts) > _ -> def \NB the directives @%format a = b@ and @%format b = a@ cause a loop. \NB Only nullary macros are applied. Conversion of strings and characters. > convert :: String -> Doc > convert s = catenate (map conv s) > conv :: Char -> Doc > conv ' ' = sp > conv '\n' = nl > conv c = Text [c] lhs2tex-1.19/src/Document.lhs0000644000175000017500000000574412507035615016742 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Document type} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module Document ( module Document ) > where %endif > infixr 5 {-"\enskip"-} <> -- same fixity as `|++|' The pretty printer generate documents of type |Doc|. > data Doc = Empty > | Text String > | Doc :^: Doc > | Embedded String > | Sub String [Doc] > deriving (Eq, Show) |Embedded| is used for embedded pseudo \TeX\ text (eg in comments); |Sub s ds| is used for replacements (eg |Sub "inline" [..]|). > (<>) :: Doc -> Doc -> Doc > Empty <> d = d > d <> Empty = d > d1 <> d2 = d1 :^: d2 > > catenate :: [Doc] -> Doc > catenate = foldr (<>) Empty Substitution strings. > sub'thin = Sub "thinspace" [] > sub'space = Sub "space" [] > sub'nl = Sub "newline" [] > sub'verbnl = Sub "verbnl" [] > sub'blankline = Sub "blankline" [] > sub'dummy = Sub "dummy" [] > > sub'spaces a = Sub "spaces" [a] > sub'special a = Sub "special" [a] > sub'verb a = Sub "verb" [a] > sub'verbatim a = Sub "verbatim" [a] > sub'inline a = Sub "inline" [a] > sub'code a = Sub "code" [a] > sub'conid a = Sub "conid" [a] > sub'varid a = Sub "varid" [a] > sub'consym a = Sub "consym" [a] > sub'varsym a = Sub "varsym" [a] > sub'backquoted a = Sub "backquoted" [a] > sub'numeral a = Sub "numeral" [a] > sub'char a = Sub "char" [a] > sub'string a = Sub "string" [a] > sub'comment a = Sub "comment" [a] > sub'nested a = Sub "nested" [a] > sub'pragma a = Sub "pragma" [a] > sub'tex a = Sub "tex" [a] > sub'keyword a = Sub "keyword" [a] > sub'column1 a = Sub "column1" [a] > sub'hskip a = Sub "hskip" [a] > sub'phantom a = Sub "phantom" [a] > > sub'column3 a1 a2 a3 = Sub "column3" [a1, a2, a3] Additional substitutions for the new @poly@ formatter. Added by ks, 14.05.2003. > sub'fromto b e a = Sub "fromto" [Text b,Text e,a] > sub'column n a = Sub "column" [Text n,a] > sub'centered = Sub "centered" [] > sub'left = Sub "left" [] > sub'dummycol = Sub "dummycol" [] > sub'indent n = Sub "indent" [n] lhs2tex-1.19/src/StateT.lhs0000644000175000017500000000271412507035615016362 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{State transformer} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > {-# LANGUAGE GeneralizedNewtypeDeriving #-} > module StateT ( module StateT ) > where > > import Control.Applicative > import Control.Monad.Error > import Control.Monad.State > > import Auxiliaries %endif |IO| with internal state and error handling. %if style == math %format MkXIO (m) = m %format unXIO (m) = m %endif > newtype XIO exc st a = MkXIO (ErrorT exc (StateT st IO) a) > deriving (Functor, Applicative, Monad, MonadIO, MonadState st, MonadError exc) -- XIO exc st a ~= StateT st IO (Either exc a) -- ~= ErrorT exc (StateT st IO) a %if style /= math > unXIO (MkXIO f) = f %endif \NB The state is preserved upon failure. > toIO :: Error exc => XIO exc st a -> IO a > toIO (MkXIO m) = do > (r, _) <- runStateT (runErrorT m) > (error "no initial state supplied") > case r of Left _ -> error "unhandled error" > Right x -> return x > fromEither :: Error exc => Either exc a -> XIO exc st a > fromEither = either throwError return lhs2tex-1.19/src/Value.lhs0000644000175000017500000000541612507035615016234 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Value type} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module Value (module Value) > where %endif > data Value = Undef > | Str String > | Bool Bool > | Int Int Dynamic conversion routines. > str :: Value -> String > str Undef = "" > str (Str s) = s > str (Bool b) = if b then "True" else "" > str (Int i) = show i > > bool :: Value -> Bool > bool Undef = False > bool (Str s) = not (null s) > bool (Bool b) = b > bool (Int i) = i /= 0 > > int :: Value -> Int > int Undef = 0 > int (Str s) = case reads s of > [(i, [])] -> i > _ -> 0 > int (Bool b) = if b then 1 else 0 > int (Int i) = i Lifting unsary and binary operations to |Value|. > type Unary a = a -> a > > onStr1 :: Unary String -> Unary Value > onStr1 f = Str . f . str > > onBool1 :: Unary Bool -> Unary Value > onBool1 f = Bool . f . bool > > onInt1 :: Unary Int -> Unary Value > onInt1 f = Int . f . int %{ %format s1 %format s2 %format b1 %format b2 %format i1 %format i2 > type Binary a = a -> a -> a > > onStr2 :: Binary String -> Binary Value > onStr2 (++) v1 v2 = Str (str v1 ++ str v2) > > onBool2 :: Binary Bool -> Binary Value > onBool2 (||) v1 v2 = Bool (bool v1 || bool v2) > > onInt2 :: Binary Int -> Binary Value > onInt2 (+) v1 v2 = Int (int v1 + int v2) %align 41 {\setlength{\lwidth}{5.5cm} > onMatching f g h Undef (Str s2) = Bool (f (str Undef) s2) > onMatching f g h (Str s1) Undef = Bool (f s1 (str Undef)) > onMatching f g h (Str s1) (Str s2) = Bool (f s1 s2) > onMatching f g h Undef (Bool b2) = Bool (g (bool Undef) b2) > onMatching f g h (Bool b1) Undef = Bool (g b1 (bool Undef)) > onMatching f g h (Bool b1) (Bool b2) = Bool (g b1 b2) > onMatching f g h Undef (Int i2) = Bool (h (int Undef) i2) > onMatching f g h (Int i1) Undef = Bool (h i1 (int Undef)) > onMatching f g h (Int i1) (Int i2) = Bool (h i1 i2) > onMatching _ _ _ _ _ = Bool False } %} lhs2tex-1.19/src/Version.lhs.in0000644000175000017500000000475512507035615017217 0ustar00andresandres00000000000000%if doc \newcommand\ProgramVersion{@VERSION@} %else % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Program version information} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > module Version where > > import FileNameUtils > import Data.List > import System.Info > > version :: String > version = "@VERSION@" > numversion :: Int > numversion = @NUMVERSION@ Used internally to distinguish prereleases. > pre :: Int > pre = @PRE@ > isWindows = "win" `isPrefixOf` os || "Win" `isPrefixOf` os % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Search path} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > searchPath = "." : > [ deep (joinPath (env "HOME" : [p ++ x])) > | p <- ["","."] > , x <- lhs2TeXNames > ] ++ > [deep (joinPath [env "LHS2TEX"])] ++ > [deep stydir] ++ > [ deep (path [dir]) > | dir <- lhs2TeXNames > , path <- if isWindows then [] else > [\x -> absPath (joinPath $ ["usr","local","share"] ++ x) > ,\x -> absPath (joinPath $ ["usr","local","lib"] ++ x) > ,\x -> absPath (joinPath $ ["usr","share"] ++ x) > ,\x -> absPath (joinPath $ ["usr","lib"] ++ x) > ] > ] > > lhs2TeXNames :: [FilePath] > lhs2TeXNames = ["lhs2tex-@SHORTVERSION@" > ,"lhs2tex" > ,"lhs2TeX" > ] > > stydir = replace (replace "@stydir@" "datarootdir" "@datarootdir@") "prefix" "@prefix@" > where replace x w y | ("$" ++ w) `isPrefixOf` x = y ++ drop (length w + 1) x > | ("${" ++ w ++ "}") `isPrefixOf` x = y ++ drop (length w + 3) x > | otherwise = x %endif lhs2tex-1.19/src/MathPoly.lhs0000644000175000017500000005211112507035615016707 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Poly formatter} %-------------------------------= -------------------------------------------- ks, 28.07.2003: This is a new style that is based on the old @math@-style and is intended to replace @math@ style in a future version. Because the former @math@ style should remain compatible, I've copied the entire module. Essentially, there are the same functions here doing the same job, but there are subtle differences, and they will grow over time \dots %if codeOnly || showModuleHeader > module MathPoly ( module MathPoly, substitute, number ) > where > > import Prelude hiding ( lines ) > import Data.List ( partition, nub, insert, sort, transpose ) > import Numeric ( showFFloat ) > import Control.Applicative ( many ) > import Control.Arrow ( (>>>) ) > import Control.Monad ( MonadPlus(..), (>=>) ) > > import Verbatim ( expand, trim ) > import Typewriter ( latex ) > import MathCommon > import Document > import Directives > import HsLexer > import Parser > import qualified FiniteMap as FM > import Auxiliaries > import TeXCommands ( Lang(..) ) > -- import Debug.Trace ( trace ) %endif % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Inline and display code} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > inline :: Lang -> Formats -> Bool -> String -> Either Exc Doc > inline lang fmts auto = fmap unNL > >>> tokenize lang > >=> lift (number 1 1) > >=> when auto (lift (filter (isNotSpace . token))) > >=> lift (partition (\t -> catCode t /= White)) > >=> exprParse *** return > >=> lift (substitute fmts auto) *** return > >=> lift (uncurry merge) > >=> lift (fmap token) > >=> when auto (lift addSpaces) > >=> lift (latexs fmts) > >=> lift sub'inline > display :: Lang -> Int -> Formats -> Bool -> Int -> Int -> Stack > -> String -> Either Exc (Doc, Stack) > display lang line fmts auto sep lat stack > = lift trim > >=> lift (expand 0) > >=> tokenize lang > >=> lift (number line 1) > -- |>=> when auto (lift (filter (isNotSpace . token)))| > >=> lift (partition (\t -> catCode t /= White)) > >=> exprParse *** return > >=> lift (substitute fmts auto) *** return > >=> lift (uncurry merge) > >=> lift lines > >=> when auto (lift (fmap addSpaces)) > >=> lift (\ts -> (autoalign sep ts,ts)) > -- |>=> lift (\(x,y) -> trace ((unlines $ map show $ y) ++ "\n" ++ show x) (x,y))| > >=> lift (\(cs,ts) -> let ats = align cs sep lat ts > cs' = [("B",0)] ++ cs > ++ [("E",error "E column")] > in (autocols cs' ats,ats) > ) > >=> return *** when auto (lift (fmap (fmap (filter (isNotSpace . token))))) > -- |>=> return *** when auto (lift (fmap (fmap (addSpaces . filter (isNotSpace . token)))))| > >=> lift (\((cs,z),ats) -> (cs,(z,ats))) > >=> return *** lift (\(z,ats) -> leftIndent fmts auto z [] ats) > -- ks, 17.07.2003: i've changed "stack" into "[]" and thereby disabled > -- the global stack for now as it leads to unexepected behaviour > >=> lift (\(cs,(d,stack)) -> (sub'code (columns cs <> d),stack)) > > columns :: [(String,Doc)] -> Doc > columns = foldr (<>) Empty > . map (uncurry sub'column) % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{A very simple Haskell Parser} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - The parser is based on the Smugweb parser. This variant can handle unbalanced parentheses in some cases (see below). > exprParse :: (CToken tok, Show tok) => [Pos tok] -> Either Exc (Chunk (Pos tok)) > exprParse s = case run (chunk 0) s of > Nothing -> Left ("syntax error", show s) -- HACK: |show s| > Just e -> Right e > > chunk :: (CToken tok) => Int -> Parser (Pos tok) (Chunk (Pos tok)) > chunk d = do a <- many (atom d) > as <- many (do s <- sep; a <- many (atom d); return (Delim s : offside a)) > return (offside a ++ concat as) > where offside [] = [] > -- old: |opt a = [Apply a]| > offside (a : as) = Apply (a : bs) : offside cs > where (bs, cs) = span (\a' -> col' a < col' a') as > col' (Atom a) = col a > col' (Paren a _ _) = col a > > atom :: (CToken tok) => Int -> Parser (Pos tok) (Atom (Pos tok)) > atom d = fmap Atom noSep > `mplus` do l <- left > e <- chunk (d+1) > r <- right l > return (Paren l e r) > `mplus` if d == 0 then do r <- anyright > return (Paren (fromToken $ TeX False Empty) [] r) > else mzero ks, 09.09.2003: Added handling of unbalanced parentheses, surely not in the most elegant way. Both |chunk| and |atom| now take an integer argument indicating the nesting level. Only on the top-level unbalanced right parentheses are accepted. The end of file (end of code block) can be parsed as an arbitrary amount of right parentheses. Primitive parser. > sep, noSep, left, anyright :: (CToken tok) => Parser tok tok > sep = satisfy (\t -> catCode t == Sep) > noSep = satisfy (\t -> catCode t == NoSep) > left = satisfy (\t -> case catCode t of Del c -> c `elem` "([{"; _ -> False) > anyright = satisfy (\t -> case catCode t of Del c -> c `elem` ")]}"; _ -> False) > right l = satisfy (\c -> case (catCode l, catCode c) of > (Del o, Del c) -> (o,c) `elem` zip "([{" ")]}" > _ -> False) > `mplus` do eof > return (fromToken $ TeX False Empty) ks, 06.09.2003: Modified the |right| parser to accept the end of file, to allow for unbalanced parentheses. This behaviour is not (yet) backported to |math| style. Also added |anyright|. % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Internal alignment} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > data Line a = Blank > | Poly [((String,Int),a,Bool)] > > autoalign :: (Show tok,CToken tok) => Int -- "Trennung" > -> [[Pos tok]] -- positionierte tokens per Zeile > -> [(String,Int)] -- alignment-info (Name, Spalte) > autoalign sep toks = map (\x -> (show x,x)) > . nub > . sort > . concat > . fmap findCols > $ toks > where > findCols :: (CToken tok,Show tok) => [Pos tok] -> [Col] > findCols ts = case {- |trace (show ts)| -} > (break (\t -> not . isNotSpace . token $ t) ts) of > (_, []) -> [] -- done > (_, [v]) -> [] -- last token is whitespace, doesn't matter > (_, v:v':vs) > | row v' == 0 && col v' == 0 > -> findCols (v:vs) -- skip internal tokens (automatically added spaces) > | length (string (token v)) >= sep > -> {- |trace ("found: " ++ show (col v')) $| -} col v' : findCols (v':vs) > | otherwise -> {- |trace ("found too short")| -} findCols (v':vs) ks, 21.11.2005: I've fixed a bug that was known to me since long ago, but I never got around to investigate. When a parametrized formatting directive directly precedes a token that should be aligned, then sometimes that token was not aligned. The reason was that in |findCols| above, the recursive calls used |vs| instead of |(v':vs)|. > align :: (CToken tok) => [(String,Int)] -- alignment-info (Name, Spalte) > -> Int -- "Trennung" > -> Int -- "Traegheit" > -> [[Pos tok]] -- positionierte tokens per Zeile > -> [Line [Pos tok]] > align cs sep lat toks = fmap (\t -> {- |trace (show (map token t) ++ "\n") $| -} > let res = splitn ("B",0) False cs t > in if null [x | x <- t > , (row x /= 0 || col x /= 0) && isNotSpace (token x)] > || null res > then Blank > else Poly res > ) toks > where > splitn cc ind [] [] = [] > splitn cc ind [] ts = [(cc,ts,ind)] > splitn cc ind ((n,i):oas) ts= > case span (\t -> col t < i) ts of > ([], vs) -> splitn cc ind oas vs > (us, []) -> [(cc,us,ind)] > (us, (v:vs)) -> > let lu = head [ u | u <- reverse us, col u /= 0 || row u /= 0 ] > -- again, we skip automatically added spaces > llu = length (string (token lu)) > in case () of > _ | (lat /= 0 && isNotSpace (token lu)) || llu < lat || col v /= i > -- no alignment for this column > -> splitn cc ind oas (us ++ (v:vs)) > | not (isNotSpace (token lu)) && llu >= sep > -> (cc,us,ind) : splitn (n,i) True oas (v:vs) > | otherwise > -> (cc,us,ind) : splitn (n,i) False oas (v:vs) The function |isInternal| returns |True| iff the argument is a symbol or a special internal symbol. See @HsLexer@ for the list of special symbols. > isInternal :: (CToken tok) => tok -> Bool > isInternal t = case token t of > Consym _ -> True > Varsym _ -> True > Special _ -> True > _ -> False > > instance Functor Line where > fmap f Blank = Blank > fmap f (Poly ls) = Poly (map (\(x,y,z) -> (x,f y,z)) ls) % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Automatically determining centered columns} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - We use a simple heuristic: a column that contains only single tokens and at least one ``internal'' token is centered. For centered columns, we create an additional ``end'' column to make sure that all entries are centered on the same amount of space. > autocols :: (CToken tok, Show tok) => [(String,Int)] -- column info > -> [Line [Pos tok]] -- aligned tokens > -> ([(String,Doc)],[Col]) -- cols+alignment, plus centered columns > autocols cs ats = (\(x,y) -> (concat x,concat y)) $ unzip > $ zipWith3 (\(cn,n) ml ai -> > if ml <= 2 && ai then ([(cn,sub'centered) > ,(cn ++ "E",sub'dummycol) > ],[n]) > else ([(cn,sub'left)],[]) > ) cs maxlengths anyinternals > -- length 2, because space tokens are always there > where > cts = transpose (concatMap (deline cs) ats) > maxlengths = {- |trace (show cts) $ |-} map (maximum . map length) cts > anyinternals = map (any (any isInternal)) cts > > -- deline :: [(String,Int)] -> Line [a] -> [[[a]]] > deline cs Blank = [] > deline cs (Poly ls) = [decol cs ls] > > decol cs [] = replicate (length cs) [] > decol ((cn,_):cs) r@(((cn',_),ts,_):rs) > | cn' == cn = ts : decol cs rs > | otherwise = [] : decol cs r % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Adding spaces} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - Inserting spaces before and after keywords. We use a simple finite automata with three states: |before b| means before a keyword, |b| indicates whether to insert a space or not; |after| means immediately after a keyword (hence |before b| really means not immediately after). > addSpaces :: (CToken tok) => [tok] -> [tok] > addSpaces ts = before False ts > where > before b [] = [] > before b (t : ts) = case token t of > u | not (isNotSpace u)-> t : before b ts > | selfSpacing u -> t : before False ts > Special c > | c `elem` ",;([{" -> t : before False ts > Keyword _ -> [ fromToken (TeX False sub'space) | b ] ++ t : after ts > _ -> t : before True ts > > after [] = [] > after (t : ts) = case token t of > u | not (isNotSpace u)-> t : after ts > | selfSpacing u -> t : before False ts > Special c > | c `elem` ",;([{" -> fromToken (TeX False sub'space) : t : before False ts > Keyword _ -> fromToken (TeX False sub'space) : t : after ts > _ -> fromToken (TeX False sub'space) : t : before True ts Operators are `self spacing'. > selfSpacing :: Token -> Bool > selfSpacing (Consym _) = True > selfSpacing (Varsym _) = True > selfSpacing (Op _) = True > -- |selfSpacing (TeX _) = True| > selfSpacing _ = False \NB It's not a good idea to regard inline \TeX\ as self spacing -- consider, for example, a macro like @%format mu = "\mu "@. % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Left indentation} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - ks, 16.07.2003: I don't quite understand the meaning of |auto|. Even if |auto = False|, the stack is still updated. ks, 16.07.2003: I'm going to implement the following relatively simple heuristic for indentation. Based on my current experience with the @poly@-style I think that this is sufficient. If not, one can still indent explicitly via annotations. > type Stack = [(Col, Line [Pos Token])] The stack is a list of pairs of column numbers and tokens. The head of the list is the largest column number, and the column numbers in the list appear sorted and descending. Indentations occur at the beginning of a line, and the position of the first token of the line is relevant. First, the stack is adjusted: all elements that have a higher or equal column number than the current line are removed. In the now topmost stack element, we then look for the final token that occurs at a column less than or equal to the current element. Relative to this token, we indent. Note: this happens in \emph{all} situations, currently. Perhaps, there are a few situations where this is not a good idea, but let's see. As a final step, the current line is placed on the stack. > leftIndent :: Formats -> Bool > -> [Col] -- centered columns > -> Stack -- current stack > -> [Line [Pos Token]] > -> (Doc, Stack) > leftIndent dict auto z stack > = loop True stack > where > copy d | auto = d > | otherwise = Empty > loop :: Bool -> Stack -> [Line [Pos Token]] -> (Doc, Stack) > loop first stack [] = (Empty, stack) -- done > loop first stack (l:ls) = case l of > Blank -> loop True stack ls -- ignore blank lines > {-| Poly x || trace (show x) False -> undefined |-} > Poly [] -> loop True stack ls -- next line > Poly (((n,c),[],ind):rs) > | first -> loop True stack (Poly rs:ls) -- ignore leading blank columns > Poly p@(((n,c),ts,ind):rs) > | first -> -- check indentation > let -- step 1: shrink stack > rstack = dropWhile (\(rc,_) -> rc >= c) stack > -- step 2: find relevant column > (rn,rc) = findrel (n,c) rstack > -- step 3: place line on stack > fstack = (c,l) : rstack > in mkFromTo fstack rn n rc [fromToken $ TeX False (indent (rn,rc) (n,c))] p ls > > > | c `elem` z -> mkFromTo stack n (n ++ "E") c ts rs ls > -- treat centered lines special > Poly [((n,c),ts,ind)] -> mkFromTo stack n "E" c ts [] ls > -- last columns > Poly (((n,c),ts,ind):rs@(((nn,_),_,_):_)) > -> mkFromTo stack n nn c ts rs ls > > mkFromTo :: Stack -> String -> String -> Col -> [Pos Token] -> [((String, Int), [Pos Token], Bool)] -> [Line [Pos Token]] -> (Doc, Stack) > mkFromTo stack bn en c ts rs ls > | bn == en = -- this can happen at the beginning of a line due to indentation > (rest,stack') > | otherwise = (sub'fromto bn en (latexs dict ts) > <> (if null rs then sep ls else Empty) <> rest > ,stack' > ) > where > (rest,stack') = loop False -- not first of a line > stack > (Poly rs : ls) > > > findrel :: (String,Col) -> Stack -> (String,Col) > findrel (n,c) [] = (n,c) > findrel (n,c) ((_,Blank):r) = findrel (n,c) r -- should never happen > findrel (n,c) ((_,Poly t):_) > = case break (\((n',c'),_,_) -> c' > c) t of > ([],_) -> error "findrel: the impossible happened" > (pre,_) -> let ((rn,rc),_,_) = last pre > in (rn,rc) > > sep [] = Empty > sep (Blank : _ ) = sub'blankline > sep (_ : _) = sub'nl > > indent :: (String,Int) -> (String,Int) -> Doc > indent (n,c) (n',c') > | c /= c' = sub'indent (Text (show (c' - c))) > | otherwise = Empty % \begin{verbatim} where |a = where |Str c = [ [ ( { |(b, c) = |c@(..)= , | , ; ] ] ) } \end{verbatim} lhs2tex-1.19/src/Verbatim.lhs0000644000175000017500000000617212507035615016731 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Verbatim formatter} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module Verbatim ( module Verbatim ) > where > > import Control.Arrow ( (>>>) ) > import Data.Char > import Data.List ( intersperse ) > > import Document > import Auxiliaries %endif % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Inline and display code} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - The Boolean flag indicates whether a space should be typeset as \verb*| | (|True|) or not. > inline :: Bool -> String -> Doc > inline b = latexs b >>> sub'verb > > display :: Int -> Bool -> String -> Doc > display width b = trim > >>> expand 0 > >>> lines > >>> map (group width) > >>> map (map (latexs b)) > >>> map splice > >>> intersperse sub'verbnl > >>> catenate > >>> sub'verbatim > > splice :: [Doc] -> Doc > splice ds = Text "~" <> catenate (intersperse nl ds) > where nl = Text "!" <> sub'verbnl <> Text "!" > > latexs :: Bool -> String -> Doc > latexs b = catenate . map latex > where > latex ' ' > | b = Text "\\char32 " > latex c > | c `elem` " \t\n" = Text "~" > | isAlphaNum c = Text [c] > | otherwise = Text ("\\char" ++ show (fromEnum c) ++ "{}") ks, 11.01.2005: I've added {} after @\char@ to prevent ligatures like @--@ from applying. \NB Comments are \emph{not} typeset in \TeX, hence the name of the style. This is really a feature since the enclosed code need not be Haskell code. % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Deleting blank lines and expanding tabs} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - Delete leading and trailing blank line(s). > trim :: String -> String > trim = skip >>> reverse >>> skip >>> reverse > > skip :: String -> String > skip "" = "" > skip s | all isSpace t = skip u > | otherwise = s > where (t, u) = breakAfter (== '\n') s Expanding tabs (assuming a tabulator width of $8$ characters). > expand :: Int -> String -> String > expand n [] = [] > expand n ('\n' : s) = '\n' : expand 0 s > expand n ('\t' : s) = replicate (n' - n) ' ' ++ expand n' s > where n' = (n + 8) `div` 8 * 8 > expand n (c : s) = c : expand (n + 1) s lhs2tex-1.19/src/Parser.lhs0000644000175000017500000000716612507035615016420 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Deterministic parser} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module Parser ( Parser, run, satisfy, lit, lits, wrap, nonnull, eof ) > where > > import Data.Char ( isSpace ) > import Auxiliaries > import Control.Applicative > import Control.Monad ( MonadPlus(..), filterM, ap ) %endif Deterministische Mini-Parser. %if style == math %format (MkParser (p)) = p %format (unParser (p)) = p %else > unParser (MkParser p) = p %endif > newtype Parser tok a = MkParser ([tok] -> Maybe (a, [tok])) > > run :: Parser tok a -> [tok] -> Maybe a > run (MkParser p) inp = fmap fst (p inp) > > instance Functor (Parser tok) where > fmap f m = m >>= \a -> return (f a) > instance Monad (Parser tok) where > return a = MkParser (\inp -> Just (a, inp)) > m >>= k = MkParser (\inp -> case unParser m inp of > Nothing -> Nothing > Just (a, rest) -> unParser (k a) rest) > instance MonadPlus (Parser tok) where > mzero = MkParser (\inp -> Nothing) > m `mplus` n = MkParser (\inp -> unParser m inp `mplus` unParser n inp) > instance Applicative (Parser tok) where > pure = return > (<*>) = ap > instance Alternative (Parser tok) where > empty = mzero > (<|>) = mplus > > satisfy :: (tok -> Bool) -> Parser tok tok > satisfy pred = MkParser (\inp -> case inp of > a : rest | pred a -> Just (a, rest) > _ -> Nothing) > > lit :: (Eq tok) => tok -> Parser tok tok > lit c = satisfy (== c) ks, 06.09.2003: Adding eof that accepts succeeds only at the end of input. > eof :: Parser tok () > eof = MkParser (\inp -> case inp of > [] -> Just ((),[]) > _ -> Nothing) |lits s| corresponds to |mapM_ lit_ s|. > lits :: (Eq tok) => [tok] -> Parser tok () > lits s = MkParser (\inp -> case splitAt (length s) inp of > (s', rest) | s == s' -> Just ((), rest) > _ -> Nothing) \Todo{Better name for |wrap|.} > wrap :: ([tok] -> (a, [tok])) -> Parser tok a > wrap f = MkParser (\inp -> Just (f inp)) > > nonnull :: ([tok] -> ([a], [tok])) -> Parser tok [a] > nonnull f = mfilter (not . null) (wrap f) > mfilter p m = m >>= \a -> if p a then return a else mzero %if False > {- > lit_ :: (Eq tok) => tok -> Parser tok () > lit_ c = MkParser (\inp -> case inp of > c' : rest | c == c' -> Just ((), rest) > _ -> Nothing) > nonnull_ f = MkParser (\inp -> case f inp of > res@((_ : _) ,_) -> Just res > _ -> Nothing) > -} %endif lhs2tex-1.19/src/Math.lhs0000644000175000017500000002552612507035615016055 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Math formatter} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module Math ( module Math, substitute, number ) > where > > import Prelude hiding ( lines ) > import Data.List ( partition ) > import Numeric ( showFFloat ) > import Control.Applicative ( many ) > import Control.Arrow ( (>>>) ) > import Control.Monad ( MonadPlus(..), (>=>) ) > > import Verbatim ( expand, trim ) > import Typewriter ( latex ) > import MathCommon > import Document > import Directives > import HsLexer > import Parser > import qualified FiniteMap as FM > import Auxiliaries > import TeXCommands ( Lang(..) ) %endif % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Inline and display code} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > inline :: Lang -> Formats -> Bool -> String -> Either Exc Doc > inline lang fmts auto = fmap unNL > >>> tokenize lang > >=> lift (number 1 1) > >=> when auto (lift (filter (isNotSpace . token))) > >=> lift (partition (\t -> catCode t /= White)) > >=> exprParse *** return > >=> lift (substitute fmts auto) *** return > >=> lift (uncurry merge) > >=> lift (fmap token) > >=> when auto (lift addSpaces) > >=> lift (latexs fmts) > >=> lift sub'inline > display :: Lang -> Formats -> Bool -> (Stack, Stack) -> Maybe Int > -> String -> Either Exc (Doc, (Stack,Stack)) > display lang fmts auto sts col= lift trim > >=> lift (expand 0) > >=> tokenize lang > >=> lift (number 1 1) > >=> when auto (lift (filter (isNotSpace . token))) > >=> lift (partition (\t -> catCode t /= White)) > >=> exprParse *** return > >=> lift (substitute fmts auto) *** return > >=> lift (uncurry merge) > >=> lift lines > >=> lift (align col) > >=> when auto (lift (fmap (fmap addSpaces))) > >=> lift (leftIndent fmts auto sts) > >=> lift sub'code *** return % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{A very simple Haskell Parser} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - The parser is based on the Smugweb parser. This variant cannot handle unbalanced parentheses. > exprParse :: (CToken tok, Show tok) => [Pos tok] -> Either Exc [Item (Pos tok)] > exprParse s = case run chunk s of > Nothing -> Left ("syntax error", show s) -- HACK: |show s| > Just e -> Right e > > chunk :: (CToken tok) => Parser (Pos tok) (Chunk (Pos tok)) > chunk = do a <- many atom > as <- many (do s <- sep; a <- many atom; return (Delim s : offside a)) > return (offside a ++ concat as) > where offside [] = [] > -- old: |opt a = [Apply a]| > offside (a : as) = Apply (a : bs) : offside cs > where (bs, cs) = span (\a' -> col' a < col' a') as > col' (Atom a) = col a > col' (Paren a _ _) = col a > > atom :: (CToken tok) => Parser (Pos tok) (Atom (Pos tok)) > atom = fmap Atom noSep > `mplus` do l <- left > e <- chunk > r <- right l > return (Paren l e r) Primitive parser. > sep, noSep, left :: (CToken tok) => Parser tok tok > sep = satisfy (\t -> catCode t == Sep) > noSep = satisfy (\t -> catCode t == NoSep) > left = satisfy (\t -> case catCode t of Del c -> c `elem` "(["; _-> False) > right l = satisfy (\c -> case (catCode l, catCode c) of > (Del o, Del c) -> (o,c) `elem` zip "([" ")]" > _ -> False) % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Internal alignment} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \Todo{Internal alignment Spalte automatisch bestimmen. Vorsicht: die Position von |=| oder |::| heranzuziehen ist gef"ahrlich; wenn z.B. |let x = e| in einem |do|-Ausdruck vorkommt.} > data Line a = Blank > | Three a a a > | Multi a > > align :: (CToken tok) => Maybe Int -> [[Pos tok]] -> [Line [Pos tok]] > align c = fmap (maybe Multi split3 c) > where > split3 i ts = case span (\t -> col t < i) ts of > ([], []) -> Blank > ((_ : _), []) -> Multi ts > (us, v : vs) > | col v == i && isInternal v > -> Three us [v] vs > | null us -> Three [] [] (v : vs) > | otherwise -> Multi ts > > > isInternal :: (CToken tok) => tok -> Bool > isInternal t = case token t of > Consym _ -> True > Varsym _ -> True > Special _ -> True > _ -> False > > instance Functor Line where > fmap f Blank = Blank > fmap f (Three l c r) = Three (f l) (f c) (f r) > fmap f (Multi a) = Multi (f a) % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Adding spaces} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - Inserting spaces before and after keywords. We use a simple finite automata with three states: |before b| means before a keyword, |b| indicates whether to insert a space or not; |after| means immediately after a keyword (hence |before b| really means not immediately after). > addSpaces :: (CToken tok) => [tok] -> [tok] > addSpaces ts = before False ts > where > before b [] = [] > before b (t : ts) = case token t of > u | selfSpacing u -> t : before False ts > Special c > | c `elem` ",;([{" -> t : before False ts > Keyword _ -> [ fromToken (TeX False sub'space) | b ] ++ t : after ts > _ -> t : before True ts > > after [] = [] > after (t : ts) = case token t of > u | selfSpacing u -> t : before False ts > Special c > | c `elem` ",;([{" -> fromToken (TeX False sub'space) : t : before False ts > Keyword _ -> fromToken (TeX False sub'space) : t : after ts > _ -> fromToken (TeX False sub'space) : t : before True ts Operators are `self spacing'. > selfSpacing :: Token -> Bool > selfSpacing (Consym _) = True > selfSpacing (Varsym _) = True > selfSpacing (Op _) = True > -- |selfSpacing (TeX _) = True| > selfSpacing _ = False \NB It's not a good idea to regard inline \TeX\ as self spacing consider, for example, a macro like @%format mu = "\mu "@. % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Left indentation} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - Auch wenn |auto = False| wird der Stack auf dem laufenden gehalten. > type Stack = [(Col, Doc, [Pos Token])] > > leftIndent dict auto (lst, rst) > = loop lst rst > where > copy d | auto = d > | otherwise = Empty Die Funktion |isInternal| pr"uft, ob |v| ein spezielles Symbol wie @::@, @=@ etc~oder ein Operator wie @++@ ist. > loop lst rst [] = (Empty, (lst, rst)) > loop lst rst (l : ls) = case l of > Blank -> loop lst rst ls > Three l c r -> (sub'column3 (copy lskip <> latexs dict l) > (latexs dict c) > (copy rskip <> latexs dict r) <> sep ls <> rest, st') > where (lskip, lst') = indent l lst > (rskip, rst') = indent r rst > (rest, st') = loop lst' rst' ls -- does not work: |if null l && null c then rst' else []| > Multi m -> (sub'column1 (copy lskip <> latexs dict m) <> sep ls <> rest, st') > where (lskip, lst') = indent m lst > (rest, st') = loop lst' [] ls > > sep [] = Empty > sep (Blank : _ ) = sub'blankline > sep (_ : _) = sub'nl > > indent :: [Pos Token] -> Stack -> (Doc, Stack) > indent [] stack = (Empty, stack) > indent ts@(t : _) [] = (Empty, [(col t, Empty, ts)]) > indent ts@(t : _) (top@(c, skip, line) : stack) > = case compare (col t) c of > LT -> indent ts stack > EQ -> (skip, (c, skip, ts) : stack) > GT -> (skip', (col t, skip', ts) : top : stack) > where > skip' = case span (\u -> col u < col t) line of > (us, v : vs) | col v == col t > -> skip <> sub'phantom (latexs dict us) > -- does not work: |(us, _) -> skip ++ [Phantom (fmap token us), Skip (col t - last (c : fmap col us))]| > _ -> skip <> sub'hskip (Text em) > where em = showFFloat (Just 2) (0.5 * fromIntegral (col t - c) :: Double) "" M"ussen |v| und |t| zueinander passen? % \begin{verbatim} where |a = where |Str c = [ [ ( { |(b, c) = |c@(..)= , | , ; ] ] ) } \end{verbatim} lhs2tex-1.19/src/TeXCommands.lhs0000644000175000017500000001171712507035615017343 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Pseudo-\TeX\ Commands} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module TeXCommands ( module TeXCommands ) > where > > import Data.Maybe > import FiniteMap ( FiniteMap ) > import qualified FiniteMap as FM > import Auxiliaries %endif These don't really belong into a module named TeXCommands: > data Style = Version | Help | SearchPath | Copying | Warranty | CodeOnly | NewCode | Verb | Typewriter | Poly | Math | Pre > deriving (Eq, Show, Enum, Bounded) > data Lang = Haskell | Agda > deriving (Eq, Show, Enum, Bounded) \Todo{Better name for |Class|.} > data Class = One Char -- ordinary text > | Many String -- ditto > | Inline String -- @|..|@ > | Command Command String -- @\cmd{arg}@ > | Environment Environment String -- @\begin{cmd}..arg\end{cmd}@ > | Directive Directive String -- @%cmd arg@ > | Error Exc -- parsing error > deriving (Show) > data Command = Hs | Eval | Perform | Vrb Bool > deriving (Eq, Show) > > data Environment = Haskell_ | Code | Spec | Evaluate | Hide | Ignore | Verbatim Bool > deriving (Eq, Show) \NB |Hs|, |Haskell_|, |Hide|, and |Ignore| are obsolete. ks, 16.08.2004: added EOF. > > data Directive = Format | Include | Let | File | Options > | Align | Separation | Latency | Begin | End | Subst > | If | Elif | Else | Endif | EOF > deriving (Eq, Show) > data Numbered a = No !LineNo a > deriving (Show) > \NB The |Show| instances have been defined for debugging purposes, the |Eq| instances are necessary for |decode|. > conditional :: Directive -> Bool > conditional If = True > conditional Elif = True > conditional Else = True > conditional Endif = True > conditional EOF = True > conditional _ = False Encoding and decoding of commands, environments, and directives. \Todo{Better name for |Representation|.} > class Representation a where > representation :: [(String, a)] > instance Representation Style where > representation = [ ("tt", Typewriter), ("math", Math), ("poly", Poly), > ("verb", Verb), ("code", CodeOnly), ("newcode",NewCode), > ("pre", Pre), ("version", Version), > ("copying", Copying), ("warranty", Warranty), ("help", Help), ("searchpath", SearchPath) ] > instance Representation Lang where > representation = [ ("haskell", Haskell), ("agda", Agda) ] > instance Representation Command where > representation = [ ("hs", Hs), ("eval", Eval), > ("perform", Perform), ("verb*", Vrb True), > ("verb", Vrb False) ] > instance Representation Environment where > representation = [ ("haskell", Haskell_), ("code", Code), > ("spec", Spec), ("evaluate", Evaluate), ("hide", Hide), > ("ignore", Ignore), ("verbatim*", Verbatim True), > ("verbatim", Verbatim False) ] > instance Representation Directive where > representation = [ ("format", Format), ("include", Include), > ("if", If), ("elif", Elif), > ("else", Else), ("endif", Endif), > ("let", Let), ("file", File), > ("options", Options), ("align", Align), > ("separation", Separation), ("latency", Latency), > ("{", Begin), ("}", End), ("subst", Subst), > ("EOF",EOF) ] > > encode :: (Representation a) => String -> Maybe a > encode s = FM.lookup s (FM.fromList representation) > > decode :: (Eq a, Representation a) => a -> String > decode a = fromJust (lookup a (inverse representation)) \NB We cannot use arrays for |decode|, because |Command| is neither an enumerated nor a product type (|Vrb Bool|). lhs2tex-1.19/src/Auxiliaries.lhs0000644000175000017500000001205512507035615017434 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Auxiliaries} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > {-# LANGUAGE TypeSynonymInstances #-} > {-# LANGUAGE FlexibleInstances #-} > module Auxiliaries ( module Auxiliaries ) > where > > import Data.Char ( isSpace ) > import Control.Arrow ( (>>>), Kleisli(..) ) > import qualified Control.Arrow as A > import Control.Monad ( MonadPlus(..) ) > import Control.Monad.Error %endif > infixr 5 {-"\;"-} <| -- same fixity as `|:|' % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Operations on chars} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > unNL :: Char -> Char > unNL '\n' = ' ' > unNL c = c % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Operations on lists} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > splitOn :: (Char -> Bool) -> String -> [String] > splitOn p s = case dropWhile p s of > "" -> [] > s' -> w : splitOn p s'' > where (w,s'') = break p s' > rtake :: Int -> [a] -> [a] > rtake n = reverse . take n . reverse > inverse :: [(a, b)] -> [(b, a)] > inverse bs = [ (b, a) | (a, b) <- bs ] > merge :: (Ord a) => [a] -> [a] -> [a] > merge [] bs = bs > merge as@(a : _) [] = as > merge as@(a : as') bs@(b : bs') > | a <= b = a : merge as' bs > | otherwise = b : merge as bs' %{ %format (sub (a) (b)) = "{" a "}_{" b "}" The call |breakAfter p [sub a 1,..,sub a n]| yields |([sub a 1,..,sub a i], [sub a (i+1),..,sub a n])| such that |p (sub a i) = True| and |p (sub a j) = False| for |j < i|. %} > breakAfter :: (a -> Bool) -> [a] -> ([a], [a]) > breakAfter p [] = ([], []) > breakAfter p (a : as) > | p a = ([a], as) > | otherwise = a <| breakAfter p as > breaks :: ([a] -> Bool) -> [a] -> ([a], [a]) > breaks p [] = ([], []) > breaks p as@(a : as') > | p as = ([], as) > | otherwise = a <| breaks p as' > -- isPrefix :: (Eq a) => [a] -> [a] -> Bool > -- p `isPrefix` as = p == take (length p) as > withoutSpaces :: String -> String > withoutSpaces s = filter (not . isSpace) s > group :: Int -> [a] -> [[a]] > group n = repSplit (repeat n) >>> takeWhile (not . null) > repSplit :: [Int] -> [a] -> [[a]] > repSplit [] xs = [] > repSplit (n : ns) xs = ys : repSplit ns zs > where (ys, zs) = splitAt n xs % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Monad utilities} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > lift :: (Monad m) => (a -> b) -> (a -> m b) > lift f a = return (f a) > (***) :: (Monad m) => (a -> m a') -> (b -> m b') -> (a, b) -> m (a', b') > f *** g = runKleisli (Kleisli f A.*** Kleisli g) > fromRight :: Either a b -> b > fromRight (Left _) = error "fromRight" > fromRight (Right b) = b % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Miscellaneous} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - Some useful type abbreviations. > type LineNo = Int > type Message = String > type Exc = (Message, String) > instance Error Exc where > noMsg = ("unknown error", "") > strMsg s = (s, "") Reverse Composition. > (<|) :: a -> ([a], b) -> ([a], b) > a <| (as, b) = (a : as, b) > > impossible :: String -> a > impossible name = error ("The `impossible' happened in \"" > ++ name ++ "\"") % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Obsolete code} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > command :: String -> String -> String > command name arg = "\\" ++ name ++ "{" ++ arg ++ "}" > > environment :: String -> String -> String > environment name m = "\\begin{" ++ name ++ "}" ++ m > ++ "\\end{" ++ name ++ "}" lhs2tex-1.19/src/State.lhs0000644000175000017500000001105412507035615016233 0ustar00andresandres00000000000000 > module State > where > > import System.IO > import System.Process > > import Version > import TeXCommands > import qualified Math > import qualified MathPoly as Poly > import Directives > import qualified FiniteMap as FM > import Auxiliaries > type CondInfo = (FilePath, LineNo, Bool, Bool) > > data State = State { style :: Style, > lang :: Lang, -- Haskell or Agda, currently > verbose :: Bool, > searchpath :: [FilePath], > file :: FilePath, -- also used for `hugs' > lineno :: LineNo, > ofile :: FilePath, > olineno :: LineNo, > atnewline :: Bool, > fldir :: Bool, -- file/linenumber directives > pragmas :: Bool, -- generate LINE pragmas? > output :: Handle, > opts :: String, -- options for `hugs' > files :: [(FilePath, LineNo)], -- includees (?) > path :: FilePath, -- for relative includes > fmts :: Formats, > subst :: Substs, > stack :: [Formats], -- for grouping > toggles :: Toggles, -- @%let@ defined toggles > conds :: [CondInfo], -- for conditional directives > align :: Maybe Int, -- math: internal alignment column > stacks :: (Math.Stack, Math.Stack), -- math: indentation stacks > separation :: Int, -- poly: separation > latency :: Int, -- poly: latency > pstack :: Poly.Stack, -- poly: indentation stack > externals :: Externals -- catchErrors for external processes (hugs,ghci) > } > > type Externals = FM.FiniteMap Char ProcessInfo > type ProcessInfo = (Handle, Handle, Handle, ProcessHandle) Initial state. > state0 :: State > state0 = State { lang = Haskell, > verbose = False, > searchpath = searchPath, > lineno = 0, > olineno = 0, > atnewline = True, > fldir = False, > pragmas = True, > output = stdout, > opts = "", > files = [], > path = "", > fmts = FM.empty, > subst = FM.empty, > stack = [], > conds = [], > align = Nothing, > stacks = ([], []), > separation = 2, > latency = 2, > pstack = [], > -- ks, 03.01.04: added to prevent warnings during compilation > style = error "uninitialized style", > file = error "uninitialized filename", > ofile = error "uninitialized filename", > toggles = error "uninitialized toggles", > externals = FM.empty > } lhs2tex-1.19/src/HsLexer.lhs0000644000175000017500000004130012507035615016522 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{A Haskell lexer} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > {-# LANGUAGE NPlusKPatterns #-} > module HsLexer ( module HsLexer ) --Token(..), isVarid, isConid, isNotSpace, string, tokenize ) > where > import Data.Char ( isSpace, isUpper, isLower, isDigit, isAlphaNum, isPunctuation ) > import qualified Data.Char ( isSymbol ) > import Control.Monad > import Control.Monad.Error () > import Document > import Auxiliaries > import TeXCommands ( Lang(..) ) %endif A Haskell lexer, based on the Prelude function \hs{lex}. > data Token = Space String > | Conid String > | Varid String > | Consym String > | Varsym String > | Numeral String > | Char String > | String String > | Special Char > | Comment String > | Nested String > | Pragma String > | Keyword String > | TeX Bool Doc -- for inline \TeX (True) and format replacements (False) > | Qual [String] Token > | Op Token > deriving (Eq, Show) ks, 03.09.2003: Modified the |Qual| case to contain a list of strings rather than a single string, to add support for hierarchical modules. Also added Pragma. > isVarid, isConid, isNotSpace :: Token -> Bool > isVarid (Varid _) = True > isVarid (Qual _ t) = isVarid t > isVarid _ = False > > isConid (Conid _) = True > isConid (Qual _ t) = isConid t > isConid _ = False > > isNotSpace (Space _) = False > isNotSpace _ = True > string :: Token -> String > string (Space s) = s > string (Conid s) = s > string (Varid s) = s > string (Consym s) = s > string (Varsym s) = s > string (Numeral s) = s > string (Char s) = s > string (String s) = s > string (Special c) = [c] > string (Comment s) = "--" ++ s > string (Nested s) = "{-" ++ s ++ "-}" > string (Pragma s) = "{-#" ++ s ++ "#-}" > string (Keyword s) = s > string (TeX True (Text s)) = "{-\"" ++ s ++ "\"-}" > string (TeX False (Text s)) = "\"" ++ s ++ "\"" This change is by ks, 14.05.2003, to make the @poly@ formatter work. This should probably be either documented better or be removed again. > string (TeX _ _) = "" -- |impossible "string"| > string (Qual m s) = concatMap (++".") m ++ string s > string (Op s) = "`" ++ string s ++ "`" The main function. > tokenize :: Lang -> String -> Either Exc [Token] > tokenize lang = lift tidyup <=< lift qualify <=< lexify lang % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Phase 1} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - %{ %format lex' = "\Varid{lex}" ks, 28.08.2008: New: Agda and Haskell modes. > lexify :: Lang -> [Char] -> Either Exc [Token] > lexify lang [] = return [] > lexify lang s@(_ : _) = case lex' lang s of > Nothing -> Left ("lexical error", s) > Just (t, s') -> do ts <- lexify lang s'; return (t : ts) > > lex' :: Lang -> String -> Maybe (Token, String) > lex' lang "" = Nothing > lex' lang ('\'' : s) = do let (t, u) = lexLitChar s > v <- match "\'" u > return (Char ("'" ++ t ++ "'"), v) > lex' lang ('"' : s) = do let (t, u) = lexLitStr s > v <- match "\"" u > return (String ("\"" ++ t ++ "\""), v) > lex' lang ('-' : '-' : s) > | not (null s') && isSymbol lang (head s') > = case s' of > (c : s'') -> return (varsymid lang ("--" ++ d ++ [c]), s'') > | otherwise = return (Comment t, u) > where (d, s') = span (== '-') s > (t, u) = break (== '\n') s' > lex' lang ('{' : '-' : '"' : s) > = do let (t, u) = inlineTeX s > v <- match "\"-}" u > return (TeX True (Text t), v) > lex' lang ('{' : '-' : '#' : s) > = do let (t, u) = nested 0 s > v <- match "#-}" u > return (Pragma t, v) > lex' lang ('{' : '-' : s) = do let (t, u) = nested 0 s > v <- match "-}" u > return (Nested t, v) > lex' lang (c : s) > | isSpace c = let (t, u) = span isSpace s in return (Space (c : t), u) > | isSpecial lang c = Just (Special c, s) > | isUpper c = let (t, u) = span (isIdChar lang) s in return (Conid (c : t), u) > | isLower c || c == '_' = let (t, u) = span (isIdChar lang) s in return (classify (c : t), u) > | c == ':' = let (t, u) = span (isSymbol lang) s in return (consymid lang (c : t), u) > | isDigit c = do let (ds, t) = span isDigit s > (fe, u) <- lexFracExp t > return (numeral lang (c : ds ++ fe), u) > | isSymbol lang c = let (t, u) = span (isSymbol lang) s in return (varsymid lang (c : t), u) > | otherwise = Nothing > where > numeral Agda = Varid > numeral Haskell = Numeral > classify s > | s `elem` keywords lang > = Keyword s > | otherwise = Varid s > > > lexFracExp :: String -> Maybe (String, String) > lexFracExp s = do t <- match "." s > (ds, u) <- lexDigits' t > (e, v) <- lexExp u > return ('.' : ds ++ e, v) > `mplus` lexExp s > > lexExp :: String -> Maybe (String, String) > lexExp (e:s) > | e `elem` "eE" = do (c : t) <- Just s > unless (c `elem` "+-") Nothing > (ds, u) <- lexDigits' t > return (e : c : ds, u) > `mplus` do (ds, t) <- lexDigits' s > return (e : ds, t) > lexExp s = Just ("", s) > > lexDigits' :: String -> Maybe (String, String) > lexDigits' s = do (cs@(_ : _), t) <- Just (span isDigit s); return (cs, t) > varsymid Agda = Varid > varsymid Haskell = Varsym > consymid Agda = Conid > consymid Haskell = Consym %} \NB `@'@' serves as an escape symbol in inline \TeX. > inlineTeX :: String -> (String, String) > inlineTeX [] = ([], []) > inlineTeX ('\'' : 'n' : s) = '\n' <| inlineTeX s > inlineTeX ('\'' : 'd' : s) = '"' <| inlineTeX s -- added 18.03.2001 > inlineTeX ('\'' : c : s) = c <| inlineTeX s > inlineTeX ('"' : s) = ([], '"' : s) > inlineTeX (c : s) = c <| inlineTeX s > > nested :: Int -> String -> (String, String) > nested _ [] = ([], []) > nested 0 ('#' : '-' : '}' : s) > = ([], '#':'-':'}':s) > nested 0 ('-' : '}' : s) = ([], '-':'}':s) > nested (n+1) ('-' : '}' : s) = '-' <| '}' <| nested n s > nested n ('{' : '-' : s) = '{' <| '-' <| nested (n + 1) s > nested n (c : s) = c <| nested n s ks, 03.09.2003: The above definition of nested will actually incorrectly reject programs that contain comments like the following one: {- start normal, but close as pragma #-} ... I don't expect this to be a problem, though. > lexLitChar, lexLitStr :: String -> (String, String) > lexLitChar [] = ([], []) > lexLitChar ('\'' : s) = ([], '\'' : s) > lexLitChar ('\\' : c : s) = '\\' <| c <| lexLitChar s > lexLitChar (c : s) = c <| lexLitChar s > > lexLitStr [] = ([], []) > lexLitStr ('"' : s) = ([], '"' : s) > lexLitStr ('\\' : c : s) = '\\' <| c <| lexLitStr s > lexLitStr (c : s) = c <| lexLitStr s > isSpecial :: Lang -> Char -> Bool > isIdChar, isSymbol :: Lang -> Char -> Bool > isSpecial Haskell c = c `elem` ",;()[]{}`" > isSpecial Agda c = c `elem` ";(){}" > isSymbol Haskell c = not (isSpecial Haskell c) && notElem c "'\"" && > (c `elem` "!@#$%&*+./<=>?\\^|:-~" || > Data.Char.isSymbol c || Data.Char.isPunctuation c) > isSymbol Agda c = isIdChar Agda c > isIdChar Haskell c = isAlphaNum c || c `elem` "_'" > isIdChar Agda c = not (isSpecial Agda c || isSpace c) > match :: String -> String -> Maybe String > match p s > | p == t = Just u > | otherwise = Nothing > where (t, u) = splitAt (length p) s Keywords > keywords :: Lang -> [String] > keywords Haskell = [ "case", "class", "data", "default", > "deriving", "do", "else", "if", > "import", "in", "infix", "infixl", > "infixr", "instance", "let", "module", > "newtype", "of", "then", "type", > "where" ] > keywords Agda = [ "let", "in", "where", "field", "with", > "postulate", "primitive", "open", "import", > "module", "data", "codata", "record", "infix", > "infixl", "infixr", "mutual", "abstract", > "private", "forall", "using", "hiding", > "renaming", "public" ] % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Phase 2} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - Merging qualified names. ks, 27.06.2003: I have modified the fifth case of |qualify| to only match if the |Varsym| contains at least one symbol besides the dot. Otherwise the dot is an operator, not part of a qualified name. ks, 03.09.2003: Deal with hierarchical module names. This could be made more efficient if that seems necessary. > qualify :: [Token] -> [Token] > qualify [] = [] > qualify (Conid m : Varsym "." : t@(Conid _) : ts) > = qualify (Qual [m] t : ts) > qualify (Conid m : Varsym "." : t@(Varid _) : ts) > = Qual [m] t : qualify ts > qualify (Conid m : Varsym ('.' : s@(':' : _)) : ts) > = Qual [m] (Consym s) : qualify ts > qualify (Conid m : Varsym ('.' : s@(_ : _)) : ts) > = Qual [m] (Varsym s) : qualify ts > qualify (Qual m (Conid m') : Varsym "." : t@(Conid _) : ts) > = qualify (Qual (m ++ [m']) t : qualify ts) > qualify (Qual m (Conid m') : Varsym "." : t@(Varid _) : ts) > = Qual (m ++ [m']) t : qualify ts > qualify (Qual m (Conid m') : Varsym ('.' : s@(':' : _)) : ts) > = Qual (m ++ [m']) (Consym s) : qualify ts > qualify (Qual m (Conid m') : Varsym ('.' : s@(_ : _)) : ts) > = Qual (m ++ [m']) (Varsym s) : qualify ts > qualify (t : ts) = t : qualify ts Join backquoted ids -- because @`Prelude.div`@ is allowed, we do this after |qualify|. > tidyup :: [Token] -> [Token] > tidyup [] = [] > tidyup (Special '`' : t@(Varid _) : Special '`' : ts) > = Op t : tidyup ts > tidyup (Special '`' : t@(Conid _) : Special '`' : ts) > = Op t : tidyup ts > tidyup (Special '`' : t@(Qual _ (Varid _)) : Special '`' : ts) > = Op t : tidyup ts > tidyup (Special '`' : t@(Qual _ (Conid _)) : Special '`' : ts) > = Op t : tidyup ts > tidyup (String s : ts) = strItems s ++ tidyup ts > tidyup (Space s : ts) = splitSpace s ++ tidyup ts > tidyup (t : ts) = t : tidyup ts Note: @` div `@ is not joined; in such a case, a potential format statement @%format `div` = ...@ is ignored. Breaking a string into string items. > strItems :: String -> [Token] > strItems [] = impossible "strItems" > strItems (c : s) = case breaks isGap s of > (item, '\\' : s') -> String (c : item ++ "\\") : Space white : strItems rest > where (white, rest) = span isSpace s' > _ -> [String (c : s)] > > isGap :: String -> Bool > isGap ('\\' : '\n' : _) = True > isGap _ = False ks, 12.01.2004: changed the definition of |isGap| to be |True| only if the character following a backslash is a newline. Otherwise, the sequence |"\\ "| will be incorrectly treated as a string gap. I am not convinced that the special treatment of string gaps is a good thing at all. String gaps don't work in newcode style, as it is right now. > splitSpace :: String -> [Token] > splitSpace [] = [] > splitSpace s = Space t : splitSpace u > where (t, u) = breakAfter (== '\n') s % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{A token class} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - We distinguish between white space, separators, delimiters and non-separators. > data CatCode = White > | Sep > | Del Char > | NoSep > deriving (Eq) \Todo{Is the class |CToken| still necessary?} > class CToken tok where > catCode :: tok -> CatCode > token :: tok -> Token > inherit :: tok -> Token -> tok > fromToken :: Token -> tok |inherit old t| adds |old|'s attributes (eg positional information) to |t|. ks, 29.08.2008: Made the non-backwards compatible change to add curly braces to the set of parentheses. I did this because it's necessary for Agda, but I also never understood why it isn't the case for Haskell. This affects spacing of some constructs in Haskell mode, but I think it's an improvement. > instance CToken Token where > catCode (Space _) = White > catCode (Conid _) = NoSep > catCode (Varid _) = NoSep > catCode (Consym _) = Sep -- Sep is necessary for correct Haskell formatting > catCode (Varsym _) = Sep -- in Agda mode, Consym/Varsym don't occur > catCode (Numeral _) = NoSep > catCode (Char _) = NoSep > catCode (String _) = NoSep > catCode (Special c) > | c `elem` "([{}])" = Del c > | otherwise = Sep \NB Only @([])@ are classified as delimiters; @{}@ are separators since they do not bracket expressions. > catCode (Comment _) = White > catCode (Nested _) = White > catCode (Pragma _) = White > catCode (Keyword _) = Sep > catCode (TeX _ (Text _)) = White The following change is by ks, 14.05.2003. This is related to the change above in function |string|. > catCode (TeX _ _) = NoSep -- |impossible "catCode"| > catCode (Qual _ t) = catCode t > catCode (Op _) = Sep > token = id > inherit _ t = t > fromToken = id lhs2tex-1.19/src/FiniteMap.lhs0000644000175000017500000000607312507035615017034 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Finite maps} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module FiniteMap ( FiniteMap, empty, fromList, add, lookup, (!), keys) > where > import Prelude hiding ( lookup ) > import Data.Maybe %endif > type FiniteMap key val = Trie key val > > data Trie key val = Leaf [key] val > | Node [(key, Trie key val)] (Maybe val) The value associated with the empty sequence is contained in the |Maybe b| part. \NB |Node [('a', empty)] Nothing| is not legal. > empty :: Trie key val > empty = Node [] Nothing > > fromList :: (Ord key) => [([key], val)] -> Trie key val > fromList = foldr add empty > > add :: (Ord a) => ([a], b) -> Trie a b -> Trie a b > add (x, v) t = insert t x v > > lookup :: (Ord a) => [a] -> Trie a b -> Maybe b > lookup x (Leaf y w) > | x == y = Just w > | otherwise = Nothing > lookup [] (Node ts w) = w > lookup (a : x) (Node ts w) = lookupList ts > where > lookupList [] = Nothing > lookupList ((b, t) : ts) = case compare b a of > LT -> lookupList ts > EQ -> lookup x t > GT -> Nothing > keys :: (Ord a) => Trie a b -> [[a]] > keys = keys' [] > where > keys' acc (Leaf x _) = [acc ++ x] > keys' acc (Node xs v) = maybe [] (const [acc]) v ++ > concatMap (\ (x,t) -> keys' (acc ++ [x]) t) xs Derived functions. > (!) :: (Ord a) => Trie a b -> [a] -> b > t ! k = fromJust (lookup k t) Auxiliary functions. %{ %align 41 > insert :: (Ord a) => Trie a b -> [a] -> b -> Trie a b > insert (Leaf [] _) [] v = Leaf [] v > insert (Leaf (b : y) w) [] v = Node [(b, Leaf y w)] (Just v) > insert (Leaf [] w) (a : x) v = Node [(a, Leaf x v)] (Just w) > insert (Leaf (b : y) w) (a : x) v = case compare b a of > LT -> Node [(b, Leaf y w), (a, Leaf x v)] Nothing > EQ -> Node [(a, insert (Leaf y w) x v)] Nothing > GT -> Node [(a, Leaf x v), (b, Leaf y w)] Nothing > insert (Node ts w) [] v = Node ts (Just v) > insert (Node ts w) (a : x) v = Node (insList ts) w > where > insList [] = [(a,Leaf x v)] > insList ((b, t) : ts) = case compare b a of > LT -> (b, t) : insList ts > EQ -> (b, insert t x v) : ts > GT -> (a, Leaf x v) : (b, t) : ts %} lhs2tex-1.19/src/License.lhs0000644000175000017500000005323112507035615016540 0ustar00andresandres00000000000000 > module License > where > import Version GPL-related program information > programInfo :: String > programInfo = > "lhs2TeX " ++ version ++ ", Copyright (C) 1997-2015 Ralf Hinze, Andres Loeh\n\n\ > \lhs2TeX comes with ABSOLUTELY NO WARRANTY;\n\ > \for details type `lhs2TeX --warranty'.\n\ > \This is free software, and you are welcome to redistribute it\n\ > \under certain conditions; type `lhs2TeX --copying' for details." > copying :: String > copying = > "\t\t GNU GENERAL PUBLIC LICENSE\n\ > \\t\t Version 2, June 1991\n\ > \\n\ > \ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n\ > \ 59 Temple Place - Suite 330\n\ > \ Boston, MA 02111-1307, USA.\n\ > \ Everyone is permitted to copy and distribute verbatim copies\n\ > \ of this license document, but changing it is not allowed.\n\ > \\n\ > \\t\t\t Preamble\n\ > \\n\ > \ The licenses for most software are designed to take away your\n\ > \freedom to share and change it. By contrast, the GNU General Public\n\ > \License is intended to guarantee your freedom to share and change free\n\ > \software--to make sure the software is free for all its users. This\n\ > \General Public License applies to most of the Free Software\n\ > \Foundation's software and to any other program whose authors commit to\n\ > \using it. (Some other Free Software Foundation software is covered by\n\ > \the GNU Library General Public License instead.) You can apply it to\n\ > \your programs, too.\n\ > \\n\ > \ When we speak of free software, we are referring to freedom, not\n\ > \price. Our General Public Licenses are designed to make sure that you\n\ > \have the freedom to distribute copies of free software (and charge for\n\ > \this service if you wish), that you receive source code or can get it\n\ > \if you want it, that you can change the software or use pieces of it\n\ > \in new free programs; and that you know you can do these things.\n\ > \\n\ > \ To protect your rights, we need to make restrictions that forbid\n\ > \anyone to deny you these rights or to ask you to surrender the rights.\n\ > \These restrictions translate to certain responsibilities for you if you\n\ > \distribute copies of the software, or if you modify it.\n\ > \\n\ > \ For example, if you distribute copies of such a program, whether\n\ > \gratis or for a fee, you must give the recipients all the rights that\n\ > \you have. You must make sure that they, too, receive or can get the\n\ > \source code. And you must show them these terms so they know their\n\ > \rights.\n\ > \\n\ > \ We protect your rights with two steps: (1) copyright the software, and\n\ > \(2) offer you this license which gives you legal permission to copy,\n\ > \distribute and/or modify the software.\n\ > \\n\ > \ Also, for each author's protection and ours, we want to make certain\n\ > \that everyone understands that there is no warranty for this free\n\ > \software. If the software is modified by someone else and passed on, we\n\ > \want its recipients to know that what they have is not the original, so\n\ > \that any problems introduced by others will not reflect on the original\n\ > \authors' reputations.\n\ > \\n\ > \ Finally, any free program is threatened constantly by software\n\ > \patents. We wish to avoid the danger that redistributors of a free\n\ > \program will individually obtain patent licenses, in effect making the\n\ > \program proprietary. To prevent this, we have made it clear that any\n\ > \patent must be licensed for everyone's free use or not licensed at all.\n\ > \\n\ > \ The precise terms and conditions for copying, distribution and\n\ > \modification follow.\n\ > \\f\n\ > \\t\t GNU GENERAL PUBLIC LICENSE\n\ > \ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\ > \\n\ > \ 0. This License applies to any program or other work which contains\n\ > \a notice placed by the copyright holder saying it may be distributed\n\ > \under the terms of this General Public License. The \"Program\", below,\n\ > \refers to any such program or work, and a \"work based on the Program\"\n\ > \means either the Program or any derivative work under copyright law:\n\ > \that is to say, a work containing the Program or a portion of it,\n\ > \either verbatim or with modifications and/or translated into another\n\ > \language. (Hereinafter, translation is included without limitation in\n\ > \the term \"modification\".) Each licensee is addressed as \"you\".\n\ > \\n\ > \Activities other than copying, distribution and modification are not\n\ > \covered by this License; they are outside its scope. The act of\n\ > \running the Program is not restricted, and the output from the Program\n\ > \is covered only if its contents constitute a work based on the\n\ > \Program (independent of having been made by running the Program).\n\ > \Whether that is true depends on what the Program does.\n\ > \\n\ > \ 1. You may copy and distribute verbatim copies of the Program's\n\ > \source code as you receive it, in any medium, provided that you\n\ > \conspicuously and appropriately publish on each copy an appropriate\n\ > \copyright notice and disclaimer of warranty; keep intact all the\n\ > \notices that refer to this License and to the absence of any warranty;\n\ > \and give any other recipients of the Program a copy of this License\n\ > \along with the Program.\n\ > \\n\ > \You may charge a fee for the physical act of transferring a copy, and\n\ > \you may at your option offer warranty protection in exchange for a fee.\n\ > \\n\ > \ 2. You may modify your copy or copies of the Program or any portion\n\ > \of it, thus forming a work based on the Program, and copy and\n\ > \distribute such modifications or work under the terms of Section 1\n\ > \above, provided that you also meet all of these conditions:\n\ > \\n\ > \ a) You must cause the modified files to carry prominent notices\n\ > \ stating that you changed the files and the date of any change.\n\ > \\n\ > \ b) You must cause any work that you distribute or publish, that in\n\ > \ whole or in part contains or is derived from the Program or any\n\ > \ part thereof, to be licensed as a whole at no charge to all third\n\ > \ parties under the terms of this License.\n\ > \\n\ > \ c) If the modified program normally reads commands interactively\n\ > \ when run, you must cause it, when started running for such\n\ > \ interactive use in the most ordinary way, to print or display an\n\ > \ announcement including an appropriate copyright notice and a\n\ > \ notice that there is no warranty (or else, saying that you provide\n\ > \ a warranty) and that users may redistribute the program under\n\ > \ these conditions, and telling the user how to view a copy of this\n\ > \ License. (Exception: if the Program itself is interactive but\n\ > \ does not normally print such an announcement, your work based on\n\ > \ the Program is not required to print an announcement.)\n\ > \\f\n\ > \These requirements apply to the modified work as a whole. If\n\ > \identifiable sections of that work are not derived from the Program,\n\ > \and can be reasonably considered independent and separate works in\n\ > \themselves, then this License, and its terms, do not apply to those\n\ > \sections when you distribute them as separate works. But when you\n\ > \distribute the same sections as part of a whole which is a work based\n\ > \on the Program, the distribution of the whole must be on the terms of\n\ > \this License, whose permissions for other licensees extend to the\n\ > \entire whole, and thus to each and every part regardless of who wrote it.\n\ > \\n\ > \Thus, it is not the intent of this section to claim rights or contest\n\ > \your rights to work written entirely by you; rather, the intent is to\n\ > \exercise the right to control the distribution of derivative or\n\ > \collective works based on the Program.\n\ > \\n\ > \In addition, mere aggregation of another work not based on the Program\n\ > \with the Program (or with a work based on the Program) on a volume of\n\ > \a storage or distribution medium does not bring the other work under\n\ > \the scope of this License.\n\ > \\n\ > \ 3. You may copy and distribute the Program (or a work based on it,\n\ > \under Section 2) in object code or executable form under the terms of\n\ > \Sections 1 and 2 above provided that you also do one of the following:\n\ > \\n\ > \ a) Accompany it with the complete corresponding machine-readable\n\ > \ source code, which must be distributed under the terms of Sections\n\ > \ 1 and 2 above on a medium customarily used for software interchange; or,\n\ > \\n\ > \ b) Accompany it with a written offer, valid for at least three\n\ > \ years, to give any third party, for a charge no more than your\n\ > \ cost of physically performing source distribution, a complete\n\ > \ machine-readable copy of the corresponding source code, to be\n\ > \ distributed under the terms of Sections 1 and 2 above on a medium\n\ > \ customarily used for software interchange; or,\n\ > \\n\ > \ c) Accompany it with the information you received as to the offer\n\ > \ to distribute corresponding source code. (This alternative is\n\ > \ allowed only for noncommercial distribution and only if you\n\ > \ received the program in object code or executable form with such\n\ > \ an offer, in accord with Subsection b above.)\n\ > \\n\ > \The source code for a work means the preferred form of the work for\n\ > \making modifications to it. For an executable work, complete source\n\ > \code means all the source code for all modules it contains, plus any\n\ > \associated interface definition files, plus the scripts used to\n\ > \control compilation and installation of the executable. However, as a\n\ > \special exception, the source code distributed need not include\n\ > \anything that is normally distributed (in either source or binary\n\ > \form) with the major components (compiler, kernel, and so on) of the\n\ > \operating system on which the executable runs, unless that component\n\ > \itself accompanies the executable.\n\ > \\n\ > \If distribution of executable or object code is made by offering\n\ > \access to copy from a designated place, then offering equivalent\n\ > \access to copy the source code from the same place counts as\n\ > \distribution of the source code, even though third parties are not\n\ > \compelled to copy the source along with the object code.\n\ > \\f\n\ > \ 4. You may not copy, modify, sublicense, or distribute the Program\n\ > \except as expressly provided under this License. Any attempt\n\ > \otherwise to copy, modify, sublicense or distribute the Program is\n\ > \void, and will automatically terminate your rights under this License.\n\ > \However, parties who have received copies, or rights, from you under\n\ > \this License will not have their licenses terminated so long as such\n\ > \parties remain in full compliance.\n\ > \\n\ > \ 5. You are not required to accept this License, since you have not\n\ > \signed it. However, nothing else grants you permission to modify or\n\ > \distribute the Program or its derivative works. These actions are\n\ > \prohibited by law if you do not accept this License. Therefore, by\n\ > \modifying or distributing the Program (or any work based on the\n\ > \Program), you indicate your acceptance of this License to do so, and\n\ > \all its terms and conditions for copying, distributing or modifying\n\ > \the Program or works based on it.\n\ > \\n\ > \ 6. Each time you redistribute the Program (or any work based on the\n\ > \Program), the recipient automatically receives a license from the\n\ > \original licensor to copy, distribute or modify the Program subject to\n\ > \these terms and conditions. You may not impose any further\n\ > \restrictions on the recipients' exercise of the rights granted herein.\n\ > \You are not responsible for enforcing compliance by third parties to\n\ > \this License.\n\ > \\n\ > \ 7. If, as a consequence of a court judgment or allegation of patent\n\ > \infringement or for any other reason (not limited to patent issues),\n\ > \conditions are imposed on you (whether by court order, agreement or\n\ > \otherwise) that contradict the conditions of this License, they do not\n\ > \excuse you from the conditions of this License. If you cannot\n\ > \distribute so as to satisfy simultaneously your obligations under this\n\ > \License and any other pertinent obligations, then as a consequence you\n\ > \may not distribute the Program at all. For example, if a patent\n\ > \license would not permit royalty-free redistribution of the Program by\n\ > \all those who receive copies directly or indirectly through you, then\n\ > \the only way you could satisfy both it and this License would be to\n\ > \refrain entirely from distribution of the Program.\n\ > \\n\ > \If any portion of this section is held invalid or unenforceable under\n\ > \any particular circumstance, the balance of the section is intended to\n\ > \apply and the section as a whole is intended to apply in other\n\ > \circumstances.\n\ > \\n\ > \It is not the purpose of this section to induce you to infringe any\n\ > \patents or other property right claims or to contest validity of any\n\ > \such claims; this section has the sole purpose of protecting the\n\ > \integrity of the free software distribution system, which is\n\ > \implemented by public license practices. Many people have made\n\ > \generous contributions to the wide range of software distributed\n\ > \through that system in reliance on consistent application of that\n\ > \system; it is up to the author/donor to decide if he or she is willing\n\ > \to distribute software through any other system and a licensee cannot\n\ > \impose that choice.\n\ > \\n\ > \This section is intended to make thoroughly clear what is believed to\n\ > \be a consequence of the rest of this License.\n\ > \\f\n\ > \ 8. If the distribution and/or use of the Program is restricted in\n\ > \certain countries either by patents or by copyrighted interfaces, the\n\ > \original copyright holder who places the Program under this License\n\ > \may add an explicit geographical distribution limitation excluding\n\ > \those countries, so that distribution is permitted only in or among\n\ > \countries not thus excluded. In such case, this License incorporates\n\ > \the limitation as if written in the body of this License.\n\ > \\n\ > \ 9. The Free Software Foundation may publish revised and/or new versions\n\ > \of the General Public License from time to time. Such new versions will\n\ > \be similar in spirit to the present version, but may differ in detail to\n\ > \address new problems or concerns.\n\ > \\n\ > \Each version is given a distinguishing version number. If the Program\n\ > \specifies a version number of this License which applies to it and \"any\n\ > \later version\", you have the option of following the terms and conditions\n\ > \either of that version or of any later version published by the Free\n\ > \Software Foundation. If the Program does not specify a version number of\n\ > \this License, you may choose any version ever published by the Free Software\n\ > \Foundation.\n\ > \\n\ > \ 10. If you wish to incorporate parts of the Program into other free\n\ > \programs whose distribution conditions are different, write to the author\n\ > \to ask for permission. For software which is copyrighted by the Free\n\ > \Software Foundation, write to the Free Software Foundation; we sometimes\n\ > \make exceptions for this. Our decision will be guided by the two goals\n\ > \of preserving the free status of all derivatives of our free software and\n\ > \of promoting the sharing and reuse of software generally.\n\ > \\n" > ++ warranty ++ > "\n\n\ > \\t\t END OF TERMS AND CONDITIONS\n\ > \\f\n\ > \\t How to Apply These Terms to Your New Programs\n\ > \\n\ > \ If you develop a new program, and you want it to be of the greatest\n\ > \possible use to the public, the best way to achieve this is to make it\n\ > \free software which everyone can redistribute and change under these terms.\n\ > \\n\ > \ To do so, attach the following notices to the program. It is safest\n\ > \to attach them to the start of each source file to most effectively\n\ > \convey the exclusion of warranty; and each file should have at least\n\ > \the \"copyright\" line and a pointer to where the full notice is found.\n\ > \\n\ > \ \n\ > \ Copyright (C) 19yy \n\ > \\n\ > \ This program is free software; you can redistribute it and/or modify\n\ > \ it under the terms of the GNU General Public License as published by\n\ > \ the Free Software Foundation; either version 2 of the License, or\n\ > \ (at your option) any later version.\n\ > \\n\ > \ This program is distributed in the hope that it will be useful,\n\ > \ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ > \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ > \ GNU General Public License for more details.\n\ > \\n\ > \ You should have received a copy of the GNU General Public License\n\ > \ along with this program; see the file COPYING. If not, write to\n\ > \ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n\ > \ Boston, MA 02111-1307, USA.\n\ > \\n\ > \Also add information on how to contact you by electronic and paper mail.\n\ > \\n\ > \If the program is interactive, make it output a short notice like this\n\ > \when it starts in an interactive mode:\n\ > \\n\ > \ Gnomovision version 69, Copyright (C) 19yy name of author\n\ > \ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n\ > \ This is free software, and you are welcome to redistribute it\n\ > \ under certain conditions; type `show c' for details.\n\ > \\n\ > \The hypothetical commands `show w' and `show c' should show the appropriate\n\ > \parts of the General Public License. Of course, the commands you use may\n\ > \be called something other than `show w' and `show c'; they could even be\n\ > \mouse-clicks or menu items--whatever suits your program.\n\ > \\n\ > \You should also get your employer (if you work as a programmer) or your\n\ > \school, if any, to sign a \"copyright disclaimer\" for the program, if\n\ > \necessary. Here is a sample; alter the names:\n\ > \\n\ > \ Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n\ > \ `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\ > \\n\ > \ , 1 April 1989\n\ > \ Ty Coon, President of Vice\n\ > \\n\ > \This General Public License does not permit incorporating your program into\n\ > \proprietary programs. If your program is a subroutine library, you may\n\ > \consider it more useful to permit linking proprietary applications with the\n\ > \library. If this is what you want to do, use the GNU Library General\n\ > \Public License instead of this License." > warranty :: String > warranty = > "\t\t\t NO WARRANTY\n\ > \\n\ > \ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n\ > \FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n\ > \OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n\ > \PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n\ > \OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n\ > \MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n\ > \TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n\ > \PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n\ > \REPAIR OR CORRECTION.\n\ > \\n\ > \ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n\ > \WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n\ > \REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n\ > \INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n\ > \OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n\ > \TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n\ > \YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n\ > \PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n\ > \POSSIBILITY OF SUCH DAMAGES." lhs2tex-1.19/src/Directives.lhs0000644000175000017500000003105012507035615017252 0ustar00andresandres00000000000000%-------------------------------= -------------------------------------------- \subsection{Directives} %-------------------------------= -------------------------------------------- %if codeOnly || showModuleHeader > module Directives ( Formats, parseFormat, Equation, Substs, Subst, parseSubst, Toggles, eval, define, value, nrargs ) > where > > import Control.Applicative ( many, optional ) > import Control.Monad > import Data.Char ( isSpace, isAlpha, isDigit ) > import Data.List > import Parser > import TeXCommands > import TeXParser > import HsLexer > import FiniteMap ( FiniteMap, (!) ) > import qualified FiniteMap as FM > import Auxiliaries > import Document > import Value %endif % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{@%format@ directives} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > type Formats = FiniteMap Char Equation > type Equation = (Bool, [Bool], [String], [Token]) ks, 20.07.03: The |Equation| type contains the following information: does the definition have surrounding parentheses, do the arguments have surrounding parentheses, what are the names of the arguments, and the tokens to replace the macro with. ks, 06.09.03: Adding the |nrargs| function that yields the number of arguments a formatting directive expects. > nrargs :: Equation -> Int > nrargs (_,_,args,_) = length args \NB Die Substution wird nicht als Funktion |[[Token]] -> [Token]| repr"asentiert, da math |Pos Token| verlangt. > > parseFormat :: Lang -> String -> Either Exc (String, Equation) > parseFormat lang s = parse lang (equation lang) (convert s) Format directives. \NB @%format ( = "(\;"@ is legal. > equation :: Lang -> Parser Token (String, Equation) > equation lang = do (opt, (f, opts, args)) <- optParen lhs > _ <- varsym lang "=" > r <- many item > return (f, (opt, opts, args, r)) > `mplus` do f <- item > _ <- varsym lang "=" > r <- many item > return (string f, (False, [], [], r)) > -- no RHS, try implicit formatting rules > `mplus` do f <- satisfy isVarid `mplus` satisfy isConid > return (string f, (False, [], [], tex f)) \Todo{@%format `div1`@ funktioniert nicht.} > where > agda = lang == Agda > tex (Varid s) | agda = operator s > tex (Conid s) | agda = operator s > tex (Varid s) = subscript Varid s > tex (Conid s) = subscript Conid s > tex (Qual [] s) = tex s > tex (Qual (m:ms) s) = Conid m : tex (Qual ms s) > -- ks, 03.09.2003: was "tex (Qual m s) = Conid m : tex s"; > -- seems strange though ... > subscript f s > | null t && not (null w) && (null v || head w == '_') > = underscore f s > | otherwise = [f (reverse w) > , TeX False > (Text ((if not (null v) > then "_{" ++ reverse v ++ "}" > else "" > ) ++ reverse t)) > ] > where s' = reverse s > (t, u) = span (== '\'') s' > (v, w) = span isDigit u > operator s = let parts = splitOn (=='_') s > start = "_" `isPrefixOf` s > end = "_" `isSuffixOf` s > in (if start then [Varid "_"] else []) ++ > Data.List.intersperse (Varid "_") (map Varid parts) ++ > (if end then [Varid "_"] else []) ks, 02.02.2004: I have added implicit formatting via |underscore|. The above condition should guarantee that it is (almost) only used in cases where previously implicit formatting did not do anything useful. The function |underscore| typesets an identifier such as |a_b_c| as $a_{b_{c}}$. TODO: Instead of hard-coded subscripting a substitution directive should be invoked here. > underscore f s > = [f t] > ++ if null u then [] > else [TeX False (Text "_{")] > ++ > proc_u > ++ > [TeX False (Text "}")] > where (t, u) = break (== '_') s > tok_u = tokenize lang (tail u) > proc_u = case tok_u of > Left _ -> [f (tail u)] -- should not happen > Right t -> t > lhs :: Parser Token (String, [Bool], [String]) > lhs = do f <- varid `mplus` conid > as <- many (optParen varid) > let (opts, args) = unzip as > return (f, opts, args) > optParen :: Parser Token a -> Parser Token (Bool, a) > optParen p = do _ <- open'; a <- p; _ <- close'; return (True, a) > `mplus` do a <- p ; return (False, a) > > item = satisfy (const True) > convert [] = [] > convert ('"' : '"' : s) = '"' : convert s > convert ('"' : s) = '{' : '-' : '"' : convert' s > convert (c : s) = c : convert s > > convert' [] = [] > convert' ('"' : '"' : s) = '"' : convert' s > convert' ('"' : s) = '"' : '-' : '}' : convert s > convert' (c : s) = c : convert' s % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{@%subst@ directives} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > type Substs = FiniteMap Char Subst > type Subst = [Doc] -> Doc > parseSubst :: Lang -> String -> Either Exc (String, Subst) > parseSubst lang s = parse lang (substitution lang) (convert s) > > substitution :: Lang -> Parser Token (String, Subst) > substitution lang = do s <- varid > args <- many varid > _ <- varsym lang "=" > rhs <- many (satisfy isVarid `mplus` satisfy isTeX) > return (s, subst args rhs) > where > subst :: [String] -> [Token] -> Subst > subst args rhs ds = catenate (map sub rhs) > where sub (TeX _ d) = d > sub (Varid x) = FM.fromList (zip args ds) ! x > -- TODO: The above lookup can fail badly if unknown variables are used on the rhs of a subst. \Todo{unbound variables behandeln.} ks, 24.10.2008: A bit messy: For Agda, we explicitly exclude "=" from the set of varids accepted on the lhs of a directive, because according to the Agda lexer, "=" is both a varid and a varsym. This shouldn't matter for Haskell, because "=" will never occur in a Varid constructor. > varid = do x <- satisfy (\ x -> isVarid x && x /= Varid "="); return (string x) > conid = do x <- satisfy isConid; return (string x) > varsym Agda s = satisfy (\ x -> x == Varsym s || x == Varid s) -- Agda has no symbol/id distinction > varsym Haskell s = satisfy (== (Varsym s)) > > isTeX (TeX _ _) = True > isTeX _ = False % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - \subsubsection{Conditional directives} % - - - - - - - - - - - - - - - = - - - - - - - - - - - - - - - - - - - - - - - > type Toggles = FiniteMap Char Value Auswertung Boole'scher Ausdr"ucke. > eval :: Lang -> Toggles -> String -> Either Exc Value > eval lang togs = parse lang (expression lang togs) > > expression :: Lang -> Toggles -> Parser Token Value > expression lang togs = expr > where > expr = do e1 <- appl > e2 <- optional (do op <- varsym' lang; e <- expr; return (op, e)) > return (maybe e1 (\(op, e2) -> sys2 op e1 e2) e2) > appl = do f <- optional not' > e <- atom > return (maybe e (\_ -> onBool1 not e) f) > atom = do Varid x <- satisfy isVarid; return (value togs x) > `mplus` do _ <- true'; return (Bool True) > `mplus` do _ <- false'; return (Bool False) > `mplus` do s <- satisfy isString; return (Str (read (string s))) > `mplus` do s <- satisfy isNumeral; return (Int (read (string s))) > `mplus` do _ <- open'; e <- expr; _ <- close'; return e > > sys2 "&&" = onBool2 (&&) > sys2 "||" = onBool2 (||) > sys2 "==" = onMatching (==) (==) (==) > sys2 "/=" = onMatching (/=) (/=) (/=) > sys2 "<" = onMatching (<) (<) (<) > sys2 "<=" = onMatching (<=) (<=) (<=) > sys2 ">=" = onMatching (>=) (>=) (>=) > sys2 ">" = onMatching (>) (>) (>) > sys2 "++" = onStr2 (++) > sys2 "+" = onInt2 (+) > sys2 "-" = onInt2 (-) > sys2 "*" = onInt2 (*) > sys2 "/" = onInt2 div > sys2 _ = \_ _ -> Undef Definierende Gleichungen. > define :: Lang -> Toggles -> String -> Either Exc (String, Value) > define lang togs = parse lang (definition lang togs) > > definition :: Lang -> Toggles -> Parser Token (String, Value) > definition lang togs = do Varid x <- satisfy isVarid > _ <- equal' lang > b <- expression lang togs > return (x, b) Primitive Parser. > not', true', false', open', close' > :: Parser Token Token > equal' :: Lang -> Parser Token Token > equal' lang = varsym lang "=" > not' = satisfy (== (Varid "not")) > true' = satisfy (== (Conid "True")) > false' = satisfy (== (Conid "False")) > open' = satisfy (== (Special '(')) > close' = satisfy (== (Special ')')) > varsym' lang = do x <- satisfy (isVarsym lang); return (string x) > isVarsym _ (Varsym _) = True > isVarsym Agda (Varid _) = True -- for Agda > isVarsym _ _ = False > isString (String _) = True > isString _ = False > isNumeral (Numeral _) = True > isNumeral _ = False Hilfsfunktionen. > parse :: Lang -> Parser Token a -> String -> Either Exc a > parse lang p str = do ts <- tokenize lang str > let ts' = map (\t -> case t of TeX _ x -> TeX False x; _ -> t) . > filter (\t -> catCode t /= White || isTeX t) $ ts > maybe (Left msg) Right (run p ts') > where msg = ("syntax error in directive", str) Hack: |isTeX t| f"ur |parseSubst|. > value :: Toggles -> String -> Value > value togs x = case FM.lookup x togs of > Nothing -> Undef > Just b -> b lhs2tex-1.19/src/FileNameUtils.lhs0000644000175000017500000001602212507035615017654 0ustar00andresandres00000000000000> {-# LANGUAGE ScopedTypeVariables #-} > > module FileNameUtils ( extension > , expandPath > , chaseFile > , readTextFile > , openOutputFile > , modifySearchPath > , deep, env > , absPath > , module System.FilePath > ) where > > import Prelude > import System.IO ( openFile, IOMode(..), hPutStrLn, stderr, > hSetEncoding, hGetContents, utf8, Handle() ) > import System.IO.Error ( isDoesNotExistError, isPermissionError ) > import System.Directory > import System.Environment > import Data.List > import Control.Monad (filterM) > import Control.Exception as E > ( try, catch, IOException ) > import System.FilePath > import System.Info > > import Auxiliaries A searchpath can be added to the front or to the back of the current path by pre- or postfixing it with a path separator. Otherwise the new search path replaces the current one. > modifySearchPath :: [FilePath] -> String -> [FilePath] > modifySearchPath p np > | isSearchPathSeparator (head np) = p ++ split > | isSearchPathSeparator (last np) = split ++ p > | otherwise = split > where split = splitOn isSearchPathSeparator np > -- relPath = joinpath > -- absPath ps = directorySeparator : relPath ps > isWindows = "win" `isPrefixOf` os || "Win" `isPrefixOf` os || "mingw" `isPrefixOf` os > absPath :: FilePath -> FilePath > absPath = if isWindows then > (("C:" ++ [pathSeparator]) ++) > else > (pathSeparator :) > deep :: FilePath -> FilePath > deep = (++(replicate 2 pathSeparator)) > env :: String -> FilePath > env x = "{" ++ x ++ "}" > extension :: FilePath -> Maybe String > extension fn = case takeExtension fn of > "" -> Nothing > (_:ext) -> Just ext > -- dirname = takeDirectory > -- filename = takeFilePath > -- basename = takeBaseName |expandPath| does two things: it replaces curly braced strings with environment entries, if present; furthermore, if the path ends with more than one directory separator, all subpaths are added ... > expandPath :: [String] -> IO [String] > expandPath s = do let s' = concatMap splitSearchPath s > s'' <- mapM expandEnvironment s' > s''' <- mapM findSubPaths (concat s'') > return (nub $ concat s''') > findSubPaths :: String -> IO [String] > findSubPaths "" = return [] > findSubPaths s = let rs = reverse s > (sep,rs') = span isPathSeparator rs > s' = reverse rs' > sep' = reverse sep > in if null s' > then return [[head sep']] {- we don't descend from root -} > else if length sep < 2 > then return [s] > else descendFrom s' > descendFrom :: String -> IO [String] > descendFrom s = E.catch (do d <- getDirectoryContents s > {- no hidden files, no parents -} > let d' = map (\x -> s x) > . filter ((/='.') . head) . filter (not . null) $ d > d'' <- filterM doesDirectoryExist d' > d''' <- mapM descendFrom d'' > return (s : concat d''') > ) > (\ (_ :: IOException) -> return [s]) > expandEnvironment :: String -> IO [String] > expandEnvironment s = case break (=='{') s of > (s',"") -> return [s] > (s','{':r) -> case break (=='}') r of > (e,"") -> return [s] > (e,'}':r') -> findEnvironment e s' r' > where findEnvironment :: String -> String -> String -> IO [String] > findEnvironment e a o = do er <- try (getEnv e) > return $ either (\ (_ :: IOException) -> []) > (map (\x -> a ++ x ++ o) . splitOn isSearchPathSeparator) > er > readTextFile :: FilePath -> IO String > readTextFile f = do h <- openFile f ReadMode > hSetEncoding h utf8 > hGetContents h > openOutputFile :: FilePath -> IO Handle > openOutputFile f = do h <- openFile f WriteMode > hSetEncoding h utf8 > return h > chaseFile :: [String] {- search path -} > -> FilePath -> IO (String,FilePath) > chaseFile p fn | isAbsolute fn= E.catch (t fn) (handle fn (err ".")) > | p == [] = chaseFile ["."] fn > | otherwise = s $ map (\ d -> md d ++ fn) p > where > md cs | isPathSeparator (last cs) > = cs > | otherwise = addTrailingPathSeparator cs > t f = readTextFile f >>= \x -> return (x,f) > s [] = err $ " in search path:\n" ++ showpath > s (x:xs) = E.catch (t x) (handle x (s xs)) > err extra = ioError > $ userError $ "File `" ++ fn ++ "' not found or not readable" ++ extra > handle :: FilePath -> IO (String,FilePath) -> IOException -> IO (String,FilePath) > handle x k e = > if isDoesNotExistError e then k > else if isPermissionError e then do > hPutStrLn stderr $ "Warning: could not access " ++ x ++ " due to permission error." > k > else ioError e > showpath = concatMap (\x -> " " ++ x ++ "\n") p lhs2tex-1.19/cata.snip0000644000175000017500000000225012507035615015455 0ustar00andresandres00000000000000%format map = "\textbf{map}" We start by defining a datatype for constructing fixed points of unary type constructors: %format Mu = "\mu " %format In = "\textbf{In}" > data Mu f = In (f (Mu f)) Ideally, we would like to view the |In| constructor as an isomorphism of |f (Mu f)| and |Mu f| with the inverse isomorphism given by: %format out = "\textbf{out}" > out :: Mu f -> f (Mu f) > out (In x) = x %format (cata (x)) = "\llparenthesis " x "\rrparenthesis " %format (ana (x)) = "\llbracket " x "\rrbracket " %format phi = "\varphi " %format psi = "\psi " The general definitions of catamorphisms and anamorphisms denoted by |cata phi| and |ana psi| respectively, can be expressed directly in this framework: > cata :: (Functor m) => (m a -> a) -> (Mu m -> a) > cata phi = phi . map (cata phi) . out > > ana :: (Functor m) => (a -> m a) -> (a -> Mu m) > ana psi = In . map (ana psi) . psi lhs2tex-1.19/AUTHORS0000644000175000017500000000056712507035615014733 0ustar00andresandres00000000000000Ralf Hinze (original version) Daniel James (improvements to the documentation) Andres Loeh (poly mode, maintainer) Stefan Wehr (adjust patch) Brian Smith (Cabal/Windows patch) Acknowledgements: Neil Mitchell (bug reports) Jeremy Gibbons (bug reports) Justin Bailey (line numbering improvements) If you are not listed here, but feel that you should be, please let me know. lhs2tex-1.19/spec.snip0000644000175000017500000000160412507035615015501 0ustar00andresandres00000000000000First, the resulting list must be ordered. %format a1 = "\Varid{a}_1" %format a2 = "\Varid{a}_2" > ordered :: (Ord a) => [a] -> Bool > ordered [] = True > ordered [a] = True > ordered (a1 : a2 : as) = a1 <= a2 && ordered (a2 : as) Second, the resulting list must be a rearrangement of the input. %format Bag.empty = "\emptyset " %format (Bag.single (a)) = "\mathopen{\lbag}" a "\mathclose{\rbag}" %format `Bag.union` = "\uplus " < bag :: [a] -> Bag a < bag [] = Bag.empty < bag (a : as) = Bag.single(a) `Bag.union` bag as Using |ordered| and |bag| we may specify sorting as follows. % \begin{equation} |ordered (sort M.x) = True /\ bag (sort M.x) = bag M.x| \end{equation} lhs2tex-1.19/common.mk0000644000175000017500000000056712507035615015504 0ustar00andresandres00000000000000 .SUFFIXES : .tex .dvi .pdf .ps .tex.dvi: sh -c ' \ $(LATEX) $(LATEX_OPTS) $<; \ while grep -c "Warning.*Rerun" $(<:.tex=.log); \ do $(LATEX) $(LATEX_OPTS) $<; done;' .tex.pdf: sh -c ' \ $(PDFLATEX) $(PDFLATEX_OPTS) $<; \ while grep -c "Warning.*Rerun" $(<:.tex=.log); \ do $(PDFLATEX) $(PDFLATEX_OPTS) $<; done;' .dvi.ps: $(DVIPS) -D600 -o $@ $< lhs2tex-1.19/config.mk.in0000644000175000017500000000210412507035615016053 0ustar00andresandres00000000000000 PACKAGE_TARNAME := @PACKAGE_TARNAME@ PACKAGE_VERSION := @PACKAGE_VERSION@ DISTDIR := $(PACKAGE_TARNAME)-$(PACKAGE_VERSION) bindir = @bindir@ datarootdir = @datarootdir@ datadir = @datadir@ stydir = @stydir@ docdir = @docdir@ mandir = @mandir@ prefix = @prefix@ exec_prefix = @exec_prefix@ # binpath := $(HOME)/bin GHC = @GHC@ # GHCFLAGS := -Wall -O -recomp GHCFLAGS = -O HUGS = @HUGS@ INSTALL = @INSTALL@ MV = @MV@ CP = @CP@ RM = @RM@ MKDIR = @MKDIR@ TOUCH = @TOUCH@ DIFF = @DIFF@ FIND = @FIND@ LN_S = @LN_S@ LATEX = @LATEX@ PDFLATEX = @PDFLATEX@ XDVI = @XDVI@ GV = @GV@ DVIPS = @DVIPS@ SED = @SED@ GREP = @GREP@ SORT = @SORT@ UNIQ = @UNIQ@ polydir = @texmf@/tex/latex/polytable texdir = @texmf@/tex/latex/lhs2tex INSTALL_POLYTABLE = @POLYTABLE_INSTALL@ MKTEXLSR = @MKTEXLSR@ lhs2tex-1.19/Setup.hs0000644000175000017500000004742212507035615015320 0ustar00andresandres00000000000000{-# LANGUAGE PackageImports #-} import Distribution.Simple.Setup (CopyDest(..),ConfigFlags(..),BuildFlags(..), CopyFlags(..),RegisterFlags(..),InstallFlags(..), defaultRegisterFlags,fromFlagOrDefault,Flag(..), defaultCopyFlags) import Distribution.Simple import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..),absoluteInstallDirs) import Distribution.Simple.Configure (configCompilerAux) import Distribution.PackageDescription (PackageDescription(..)) import Distribution.Simple.InstallDirs (InstallDirs(..)) import Distribution.Simple.Program (Program(..),ConfiguredProgram(..),ProgramConfiguration(..), ProgramLocation(..),simpleProgram,lookupProgram, rawSystemProgramConf) import Distribution.Simple.Utils import Distribution.Verbosity import Data.Char (isSpace, showLitChar) import Data.List (isSuffixOf,isPrefixOf) import Data.Maybe (listToMaybe,isJust) import Data.Version import Control.Exception (try) import Control.Monad (when,unless) import "regex-compat" Text.Regex (matchRegex,matchRegexAll,mkRegex,mkRegexWithOpts,subRegex) import Text.ParserCombinators.ReadP (readP_to_S) import System.Exit (ExitCode) import System.IO (hGetContents,hClose,hPutStr,stderr) import System.Process (runInteractiveProcess,waitForProcess) import System.Directory import System.Info (os) lhs2tex = "lhs2TeX" minPolytableVersion = [0,8,2] shortversion = show (numversion `div` 100) ++ "." ++ show (numversion `mod` 100) version = shortversion ++ if ispre then "pre" ++ show pre else "" numversion = 119 ispre = False pre = 2 main = defaultMainWithHooks lhs2texHooks sep = if isWindows then ";" else ":" lhs2texBuildInfoFile :: FilePath lhs2texBuildInfoFile = "." `joinFileName` ".setup-lhs2tex-config" generatedFiles = ["src" `joinFileName` "Version.lhs", "lhs2TeX.1", "doc" `joinFileName` "InteractiveHugs.lhs", "doc" `joinFileName` "InteractivePre.lhs"] data Lhs2texBuildInfo = Lhs2texBuildInfo { installPolyTable :: Maybe String, rebuildDocumentation :: Bool } deriving (Show, Read) lhs2texHooks = simpleUserHooks { hookedPrograms = [simpleProgram "hugs", simpleProgram "kpsewhich", simpleProgram "pdflatex", simpleProgram "mktexlsr"], postConf = lhs2texPostConf, postBuild = lhs2texPostBuild, postCopy = lhs2texPostCopy, postInst = lhs2texPostInst, regHook = lhs2texRegHook, cleanHook = lhs2texCleanHook } lhs2texPostConf a cf pd lbi = do let v = fromFlagOrDefault normal (configVerbosity cf) -- check polytable tmft <- do let kpseExists = lookupProgram (simpleProgram "kpsewhich") (withPrograms lbi) case kpseExists of Nothing -> return Nothing Just _ -> do (_,b,_) <- runKpseWhichVar "TEXMFLOCAL" b <- return . stripQuotes . stripNewlines $ b ex <- return (not . all isSpace $ b) -- or check if directory exists? b <- if ex then return b else do (_,b,_) <- (runKpseWhichVar "TEXMFMAIN") return . stripQuotes . stripNewlines $ b if not . all isSpace $ b -- or check if directory exists? then return (Just b) else return Nothing i <- case tmft of Just b -> do (_,p,_) <- runKpseWhich "polytable.sty" p <- return . stripNewlines $ p ex <- doesFileExist p nec <- if ex then do info v $ "Found polytable package at: " ++ p x <- readFile p let vp = do vs <- matchRegex (mkRegexWithOpts " v(.*) .polytable. package" True True) x listToMaybe [ r | v <- vs, (r,"") <- readP_to_S parseVersion v ] let (sv,nec) = case vp of Just n -> (showVersion n,versionBranch n < minPolytableVersion) Nothing -> ("unknown",True) info v $ "Package polytable version: " ++ sv return nec else return True info v $ "Package polytable installation necessary: " ++ showYesNo nec when nec $ info v $ "Using texmf tree at: " ++ b return (if nec then Just b else Nothing) Nothing -> do warn v "No texmf tree found, polytable package cannot be installed" return Nothing -- check documentation ex <- doesFileExist $ "doc" `joinFileName` "Guide2.dontbuild" r <- if ex then do info v "Documentation will not be rebuilt unless you remove the file \"doc/Guide2.dontbuild\"" return False else do let mProg = lookupProgram (simpleProgram "pdflatex") (withPrograms lbi) case mProg of Nothing -> info v "Documentation cannot be rebuilt without pdflatex" >> return False Just _ -> return True unless r $ info v $ "Using pre-built documentation" writePersistLhs2texBuildConfig (Lhs2texBuildInfo { installPolyTable = i, rebuildDocumentation = r }) mapM_ (\f -> do info v $ "Creating " ++ f let hugsExists = lookupProgram (simpleProgram "hugs") (withPrograms lbi) hugs <- case hugsExists of Nothing -> return "" Just _ -> fmap fst (getProgram "hugs" (withPrograms lbi)) let lhs2texDir = buildDir lbi `joinFileName` lhs2tex let lhs2texBin = lhs2texDir `joinFileName` lhs2tex readFile (f ++ ".in") >>= return . -- these paths could contain backslashes, so we -- need to escape them. replace "@prefix@" (escapeChars $ prefix (absoluteInstallDirs pd lbi NoCopyDest)) . replace "@stydir@" (escapeChars $ datadir (absoluteInstallDirs pd lbi NoCopyDest)) . replace "@LHS2TEX@" lhs2texBin . replace "@HUGS@" hugs . replace "@VERSION@" version . replace "@SHORTVERSION@" shortversion . replace "@NUMVERSION@" (show numversion) . replace "@SEP@" sep . replace "@PRE@" (show pre) >>= writeFile f) generatedFiles where runKpseWhich v = runCommandProgramConf silent "kpsewhich" (withPrograms lbi) [v] runKpseWhichVar v = runKpseWhich $ "-expand-var='$" ++ v ++ "'" lhs2texPostBuild a bf@(BuildFlags { buildVerbosity = vf }) pd lbi = do let v = fromFlagOrDefault normal vf ebi <- getPersistLhs2texBuildConfig let lhs2texDir = buildDir lbi `joinFileName` lhs2tex let lhs2texBin = lhs2texDir `joinFileName` lhs2tex let lhs2texDocDir = lhs2texDir `joinFileName` "doc" callLhs2tex v lbi ["--code", "lhs2TeX.sty.lit"] (lhs2texDir `joinFileName` "lhs2TeX.sty") callLhs2tex v lbi ["--code", "lhs2TeX.fmt.lit"] (lhs2texDir `joinFileName` "lhs2TeX.fmt") createDirectoryIfMissing True lhs2texDocDir if rebuildDocumentation ebi then lhs2texBuildDocumentation a bf pd lbi else copyFileVerbose v ("doc" `joinFileName` "Guide2.pdf") (lhs2texDocDir `joinFileName` "Guide2.pdf") lhs2texBuildDocumentation a (BuildFlags { buildVerbosity = vf }) pd lbi = do let v = fromFlagOrDefault normal vf let lhs2texDir = buildDir lbi `joinFileName` lhs2tex let lhs2texBin = lhs2texDir `joinFileName` lhs2tex let lhs2texDocDir = lhs2texDir `joinFileName` "doc" snippets <- do guide <- readFile $ "doc" `joinFileName` "Guide2.lhs" let s = matchRegexRepeatedly (mkRegexWithOpts "^.*input\\{(.*)\\}.*$" True True) guide return s mapM_ (\s -> do let snippet = "doc" `joinFileName` (s ++ ".lhs") c <- readFile $ snippet let inc = maybe ["poly"] id (matchRegex (mkRegexWithOpts "^%include (.*)\\.fmt" True True) c) -- rewrite the path to ghc/hugs, and to the preprocessor writeFile (lhs2texDir `joinFileName` snippet) ( -- replace "^%options ghc" "%options ghc" . -- replace "^%options hugs" "%options hugs" . -- TODO: replace or replaceEscaped replace "-pgmF \\.\\./lhs2TeX" ("-pgmF " ++ lhs2texBin ++ " -optF-Pdoc" ++ sep) $ c ) let incToStyle ["verbatim"] = "verb" incToStyle ["stupid"] = "math" incToStyle ["tex"] = "poly" incToStyle ["polytt"] = "poly" incToStyle ["typewriter"] = "tt" incToStyle [x] = x incToStyle [] = "poly" callLhs2tex v lbi ["--" ++ incToStyle inc , "-Pdoc" ++ sep, lhs2texDir `joinFileName` snippet] (lhs2texDocDir `joinFileName` s ++ ".tex") ) snippets callLhs2tex v lbi ["--poly" , "-Pdoc" ++ sep, "-Psrc" ++ sep, "doc" `joinFileName` "Guide2.lhs"] (lhs2texDocDir `joinFileName` "Guide2.tex") copyFileVerbose v ("polytable" `joinFileName` "polytable.sty") (lhs2texDocDir `joinFileName` "polytable.sty") copyFileVerbose v ("polytable" `joinFileName` "lazylist.sty") (lhs2texDocDir `joinFileName` "lazylist.sty") d <- getCurrentDirectory setCurrentDirectory lhs2texDocDir -- call pdflatex as long as necessary let loop = do rawSystemProgramConf v (simpleProgram "pdflatex") (withPrograms lbi) ["Guide2.tex"] x <- readFile "Guide2.log" case matchRegex (mkRegexWithOpts "Warning.*Rerun" True True) x of Just _ -> loop Nothing -> return () loop setCurrentDirectory d lhs2texPostCopy a (CopyFlags { copyDest = cdf, copyVerbosity = vf }) pd lbi = do let v = fromFlagOrDefault normal vf let cd = fromFlagOrDefault NoCopyDest cdf ebi <- getPersistLhs2texBuildConfig let dataPref = datadir (absoluteInstallDirs pd lbi cd) createDirectoryIfMissing True dataPref let lhs2texDir = buildDir lbi `joinFileName` lhs2tex -- lhs2TeX.{fmt,sty} mapM_ (\f -> installOrdinaryFile v (lhs2texDir `joinFileName` f) (dataPref `joinFileName` f)) ["lhs2TeX.fmt","lhs2TeX.sty"] -- lhs2TeX library fmts <- fmap (filter (".fmt" `isSuffixOf`)) (getDirectoryContents "Library") mapM_ (\f -> installOrdinaryFile v ("Library" `joinFileName` f) (dataPref `joinFileName` f)) fmts -- documentation difficult due to lack of docdir let lhs2texDocDir = lhs2texDir `joinFileName` "doc" let docDir = if isWindows then dataPref `joinFileName` "Documentation" else docdir (absoluteInstallDirs pd lbi cd) `joinFileName` "doc" let manDir = if isWindows then dataPref `joinFileName` "Documentation" else datadir (absoluteInstallDirs pd lbi cd) `joinFileName` ".." `joinFileName` "man" `joinFileName` "man1" createDirectoryIfMissing True docDir installOrdinaryFile v (lhs2texDocDir `joinFileName` "Guide2.pdf") (docDir `joinFileName` "Guide2.pdf") when (not isWindows) $ do createDirectoryIfMissing True manDir installOrdinaryFile v ("lhs2TeX.1") (manDir `joinFileName` "lhs2TeX.1") -- polytable case (installPolyTable ebi) of Just texmf -> do let texmfDir = texmf ptDir = texmfDir `joinFileName` "tex" `joinFileName` "latex" `joinFileName` "polytable" createDirectoryIfMissing True ptDir stys <- fmap (filter (".sty" `isSuffixOf`)) (getDirectoryContents "polytable") mapM_ (\f -> installOrdinaryFile v ("polytable" `joinFileName` f) (ptDir `joinFileName` f)) stys Nothing -> return () lhs2texPostInst a (InstallFlags { installPackageDB = db, installVerbosity = v }) pd lbi = do lhs2texPostCopy a (defaultCopyFlags { copyDest = Flag NoCopyDest, copyVerbosity = v }) pd lbi lhs2texRegHook pd lbi Nothing (defaultRegisterFlags { regPackageDB = db, regVerbosity = v }) lhs2texRegHook pd lbi _ (RegisterFlags { regVerbosity = vf }) = do let v = fromFlagOrDefault normal vf ebi <- getPersistLhs2texBuildConfig when (isJust . installPolyTable $ ebi) $ do rawSystemProgramConf v (simpleProgram "mktexlsr") (withPrograms lbi) [] return () lhs2texCleanHook pd lbi v pshs = do cleanHook simpleUserHooks pd lbi v pshs tryIO $ removeFile lhs2texBuildInfoFile mapM_ (tryIO . removeFile) generatedFiles matchRegexRepeatedly re str = case matchRegexAll re str of Just (_,_,r,[s]) -> s : matchRegexRepeatedly re r Nothing -> [] replace re t x = subRegex (mkRegexWithOpts re True True) x (escapeRegex t) where -- subRegex requires us to escape backslashes escapeRegex [] = [] escapeRegex ('\\':xs) = '\\':'\\': escapeRegex xs escapeRegex (x:xs) = x : escapeRegex xs escapeChars :: String -> String escapeChars t = foldr showLitChar [] t showYesNo :: Bool -> String showYesNo p | p = "yes" | otherwise = "no" stripNewlines :: String -> String stripNewlines = filter (/='\n') stripQuotes :: String -> String stripQuotes ('\'':s@(_:_)) = init s stripQuotes x = x callLhs2tex v lbi params outf = do let lhs2texDir = buildDir lbi `joinFileName` lhs2tex let lhs2texBin = lhs2texDir `joinFileName` lhs2tex let args = [ "-P" ++ lhs2texDir ++ sep ] ++ [ "-o" ++ outf ] ++ (if v == deafening then ["-v"] else []) ++ params (ex,_,err) <- runCommand v lhs2texBin args hPutStr stderr (unlines . lines $ err) maybeExit (return ex) runCommandProgramConf :: Verbosity -- ^ verbosity -> String -- ^ program name -> ProgramConfiguration -- ^ lookup up the program here -> [String] -- ^ args -> IO (ExitCode,String,String) runCommandProgramConf v progName programConf extraArgs = do (prog,args) <- getProgram progName programConf runCommand v prog (args ++ extraArgs) getProgram :: String -> ProgramConfiguration -> IO (String, [String]) getProgram progName programConf = do let mProg = lookupProgram (simpleProgram progName) programConf case mProg of Just (ConfiguredProgram { programLocation = UserSpecified p, programDefaultArgs = args }) -> return (p,args) Just (ConfiguredProgram { programLocation = FoundOnSystem p, programDefaultArgs = args }) -> return (p,args) _ -> (die (progName ++ " command not found")) -- | Run a command in a specific environment and return the output and errors. runCommandInEnv :: Verbosity -- ^ verbosity -> String -- ^ the command -> [String] -- ^ args -> [(String,String)] -- ^ the environment -> IO (ExitCode,String,String) runCommandInEnv v cmd args env = do when (v >= verbose) $ putStrLn (cmd ++ concatMap (' ':) args) let env' = if null env then Nothing else Just env (cin,cout,cerr,pid) <- runInteractiveProcess cmd args Nothing env' hClose cin out <- hGetContents cout err <- hGetContents cerr stringSeq out (hClose cout) stringSeq err (hClose cerr) exit <- waitForProcess pid return (exit,out,err) -- | Run a command and return the output and errors. runCommand :: Verbosity -- ^ verbosity -> String -- ^ the command -> [String] -- ^ args -> IO (ExitCode,String,String) runCommand v cmd args = runCommandInEnv v cmd args [] -- | Completely evaluates a string. stringSeq :: String -> b -> b stringSeq [] c = c stringSeq (x:xs) c = stringSeq xs c getPersistLhs2texBuildConfig :: IO Lhs2texBuildInfo getPersistLhs2texBuildConfig = do e <- doesFileExist lhs2texBuildInfoFile let dieMsg = "error reading " ++ lhs2texBuildInfoFile ++ "; run \"setup configure\" command?\n" when (not e) (die dieMsg) str <- readFile lhs2texBuildInfoFile case reads str of [(bi,_)] -> return bi _ -> die dieMsg writePersistLhs2texBuildConfig :: Lhs2texBuildInfo -> IO () writePersistLhs2texBuildConfig lbi = do writeFile lhs2texBuildInfoFile (show lbi) tryIO :: IO a -> IO (Either IOError a) tryIO = try -- HACKS because the Cabal API isn't sufficient: -- Distribution.Compat.FilePath is supposed to be hidden in future -- versions, so we need our own version of it: joinFileName :: String -> String -> FilePath joinFileName "" fname = fname joinFileName "." fname = fname joinFileName dir "" = dir joinFileName dir fname | isPathSeparator (last dir) = dir++fname | otherwise = dir++pathSeparator:fname where isPathSeparator :: Char -> Bool isPathSeparator | isWindows = ( `elem` "/\\" ) | otherwise = ( == '/' ) pathSeparator | isWindows = '\\' | otherwise = '/' -- It would be nice if there'd be a predefined way to detect this isWindows = "mingw" `isPrefixOf` os || "win" `isPrefixOf` os lhs2tex-1.19/Examples/0000755000175000017500000000000012507035615015431 5ustar00andresandres00000000000000lhs2tex-1.19/Examples/HelloWorld.lhs0000644000175000017500000000033112507035615020211 0ustar00andresandres00000000000000\documentclass{article} %include polycode.fmt \begin{document} This is the famous ``Hello world'' example, written in Haskell: \begin{code} main :: IO () main = putStrLn "Hello, world!" \end{code} \end{document} lhs2tex-1.19/Examples/UnlitP.lhs0000644000175000017500000001011412507035615017351 0ustar00andresandres00000000000000% lhs2TeX --poly UnlitP.lhs > UnlitP.tex \documentclass{article} \usepackage[german]{babel} %-------------------------------= -------------------------------------------- %include lhs2TeX.sty %include lhs2TeX.fmt %-------------------------------= -------------------------------------------- \begin{document} %-------------------------------= -------------------------------------------- \section{\texttt{unlit}} %-------------------------------= -------------------------------------------- Literate-Skripte, die Bird-Tracks verwenden, in Skripte "uberf"uhren, die die Pseudo-\TeX-Kommandos \verb|\begin{code}|, \verb|\end{code}| verwenden. Das Programm realisiert einen einfachen UNIX-Filter. Synopsis: % \begin{verbatim} unlit unlit \end{verbatim} %-------------------------------= -------------------------------------------- %if code || showModuleHeader > module Main ( main ) > where > > import Char ( isSpace ) > import System ( getArgs ) > import Auxiliaries ( (.>) ) %endif > data Class = Program LineNo Line > | Spec LineNo Line > | Blank LineNo Line > | Comment LineNo Line > > type LineNo = Int > type Line = String > beginCode, endCode, > beginSpec, endSpec :: Line > beginCode = "\\begin{code}" > endCode = "\\end\&{code}" > beginSpec = "\\begin{spec}" > endSpec = "\\end{spec}" \NB Damit \verb|"\\end{code}"| nicht das Codesegment beendet, wird ein Nullstring eingef"ugt: \verb|"\\end\&{code}"|. > main :: IO () > main = do args <- getArgs > unlit args > > unlit [] = getContents >>= (putStr . convert) > unlit (filePath : _) = readFile filePath >>= (putStr . convert) Fehlt: Fehlerbehandlung, wenn die Datei nicht vorhanden oder nicht lesbar ist. > convert :: String -> String > convert = lines > .> zip [1 ..] -- number > .> map classify > .> format > .> unlines > classify :: (LineNo, Line) -> Class > classify (n, '>' : s) = Program n (' ' : s) > classify (n, '<' : s) = Spec n (' ' : s) > classify (n, s) > | all isSpace s = Blank n s > classify (n, s) = Comment n s Die Formatierung wird mit einem einfachen endlichen Automaten mit f"unf Zust"anden vorgenommen. Es wird darauf geachtet, da"s die Anzahl der Zeilen nicht ver"andert wird. \rightcolumn{52}% > format :: [Class] -> [Line] > format [] = [] > format (Program _ a : x) = (beginCode ++ a) : inProgram x > format (Spec _ a : x) = (beginSpec ++ a) : inSpec x > format (Blank _ a : x) = inBlank a x > format (Comment _ a : x) = a : inComment x \rightcolumn{45}% \rightcolumn{37}% > inBlank :: Line -> [Class] -> [Line] > inBlank a [] = [a] > inBlank a (Program _ b : x) = beginCode : b : inProgram x > inBlank a (Spec _ b : x) = beginSpec : b : inSpec x > inBlank a (Blank _ b : x) = a : inBlank b x > inBlank a (Comment _ b : x) = a : b : inComment x \rightcolumn{45}% \rightcolumn{37}% > inProgram :: [Class] -> [Line] > inProgram [] = [endCode] > inProgram (Program _ a : x) = a : inProgram x > inProgram (Spec n a : x) = message n "program line" "specification line" > inProgram (Blank _ a : x) = endCode : format x > inProgram (Comment n a : x) = message n "program line" "comment" \rightcolumn{45}% \rightcolumn{37}% > inSpec :: [Class] -> [Line] > inSpec [] = [endSpec] > inSpec (Program n a : x) = message n "specification line" "program line" > inSpec (Spec _ a : x) = a : inSpec x > inSpec (Blank _ a : x) = endSpec : format x > inSpec (Comment n a : x) = message n "specification line" "comment" > inComment :: [Class] -> [Line] > inComment [] = [] > inComment (Program n a : x) = message n "comment" "program line" > inComment (Spec n a : x) = message n "comment" "specification line" > inComment (Blank _ a : x) = inBlank a x > inComment (Comment _ a : x) = a : inComment x > message :: LineNo -> String -> String -> a > message n x y = error ("line " ++ show n ++ ": " > ++ x ++ " next to " ++ y ++ "\n") \end{document} lhs2tex-1.19/Examples/lhs2TeXpre0000755000175000017500000000046612507035615017365 0ustar00andresandres00000000000000#! /bin/sh # wrapper for use with GHC/GHCi # -pgmF lhs2TeXpre -F LHSHOME=.. if [ "$1" == "$2" ]; then cp "$2" "$3" else if grep -q "^%include" "$1"; then TARGET=$3 # echo Calling with TARGET=${TARGET} ${LHSHOME}/lhs2TeX --newcode -P${LHSHOME}: $1 > ${TARGET} else cp "$2" "$3" fi fi lhs2tex-1.19/Examples/FormatAlign.lhs0000644000175000017500000000263512507035615020352 0ustar00andresandres00000000000000\documentclass{article} %include lhs2TeX.fmt %include lhs2TeX.sty %include spacing.fmt \begin{document} It is irrelevant how typ is formatted, but it must be a parametrized format for the bug to be triggered. %format typ(a) = a This is a @lhs2TeX@ bug. The double colons are not aligned, although they should be. \begin{code} map ^^ typ( a1 :: *, a2 :: * ) :: (map ^^ typ(a1,a2)) => a1 -> a2 zipWith^^ typ( a1 :: *, a2 :: *, a3 :: * ) :: (zipWith ^^ typ(a1,a2,a3)) => a1 -> a2 -> a3 collect^^ typ( a :: * | b :: * ) :: (collect ^^ typ(a | b)) => a -> [c] equal ^^ typ( a :: * ) :: ( enum ^^ typ(a), equal ^^ typ(a)) => a -> a -> Bool ^^. \end{code} This is a workaround: \begin{code} map ^^ typ( a1 :: *, a2 :: * ) ^ :: (map ^^ typ(a1,a2)) => a1 -> a2 zipWith^^ typ( a1 :: *, a2 :: *, a3 :: * ) ^ :: (zipWith ^^ typ(a1,a2,a3)) => a1 -> a2 -> a3 collect^^ typ( a :: * | b :: * ) ^ :: (collect ^^ typ(a | b)) => a -> [c] equal ^^ typ( a :: * ) ^ :: ( enum ^^ typ(a), equal ^^ typ(a)) => a -> a -> Bool ^^. \end{code} \end{document} lhs2tex-1.19/Examples/Unlit.lhs0000644000175000017500000000770612507035615017246 0ustar00andresandres00000000000000% lhs2TeX -math -align 33 Unlit.lhs > Unlit.tex \documentclass{article} \usepackage[german]{babel} %-------------------------------= -------------------------------------------- %include ../lhs2TeX.sty %include ../lhs2TeX.fmt %-------------------------------= -------------------------------------------- \begin{document} %-------------------------------= -------------------------------------------- \section{\texttt{unlit}} %-------------------------------= -------------------------------------------- Literate-Skripte, die Bird-Tracks verwenden, in Skripte "uberf"uhren, die die Pseudo-\TeX-Kommandos \verb|\begin{code}|, \verb|\end{code}| verwenden. Das Programm realisiert einen einfachen UNIX-Filter. Synopsis: % \begin{verbatim} unlit unlit \end{verbatim} %-------------------------------= -------------------------------------------- %if code || showModuleHeader > module Main ( main ) > where > > import Char ( isSpace ) > import System ( getArgs ) > import Auxiliaries ( (.>) ) %endif > data Class = Program LineNo Line > | Spec LineNo Line > | Blank LineNo Line > | Comment LineNo Line > > type LineNo = Int > type Line = String > beginCode, endCode, > beginSpec, endSpec :: Line > beginCode = "\\begin{code}" > endCode = "\\end\&{code}" > beginSpec = "\\begin{spec}" > endSpec = "\\end{spec}" \NB Damit \verb|"\\end{code}"| nicht das Codesegment beendet, wird ein Nullstring eingef"ugt: \verb|"\\end\&{code}"|. > main :: IO () > main = do args <- getArgs > unlit args > > unlit [] = getContents >>= (putStr . convert) > unlit (filePath : _) = readFile filePath >>= (putStr . convert) Fehlt: Fehlerbehandlung, wenn die Datei nicht vorhanden oder nicht lesbar ist. > convert :: String -> String > convert = lines > .> zip [1 ..] -- number > .> map classify > .> format > .> unlines > classify :: (LineNo, Line) -> Class > classify (n, '>' : s) = Program n (' ' : s) > classify (n, '<' : s) = Spec n (' ' : s) > classify (n, s) > | all isSpace s = Blank n s > classify (n, s) = Comment n s Die Formatierung wird mit einem einfachen endlichen Automaten mit f"unf Zust"anden vorgenommen. Es wird darauf geachtet, da"s die Anzahl der Zeilen nicht ver"andert wird. > format :: [Class] -> [Line] > format [] = [] > format (Program _ a : x) = (beginCode ++ a) : inProgram x > format (Spec _ a : x) = (beginSpec ++ a) : inSpec x > format (Blank _ a : x) = inBlank a x > format (Comment _ a : x) = a : inComment x > inBlank :: Line -> [Class] -> [Line] > inBlank a [] = [a] > inBlank a (Program _ b : x) = beginCode : b : inProgram x > inBlank a (Spec _ b : x) = beginSpec : b : inSpec x > inBlank a (Blank _ b : x) = a : inBlank b x > inBlank a (Comment _ b : x) = a : b : inComment x > inProgram :: [Class] -> [Line] > inProgram [] = [ endCode ] > inProgram (Program _ a : x) = a : inProgram x > inProgram (Spec n a : x) = message n "program line" "specification line" > inProgram (Blank _ a : x) = endCode : format x > inProgram (Comment n a : x) = message n "program line" "comment" > inSpec :: [Class] -> [Line] > inSpec [] = [ endSpec ] > inSpec (Program n a : x) = message n "specification line" "program line" > inSpec (Spec _ a : x) = a : inSpec x > inSpec (Blank _ a : x) = endSpec : format x > inSpec (Comment n a : x) = message n "specification line" "comment" > inComment :: [Class] -> [Line] > inComment [] = [] > inComment (Program n a : x) = message n "comment" "program line" > inComment (Spec n a : x) = message n "comment" "specification line" > inComment (Blank _ a : x) = inBlank a x > inComment (Comment _ a : x) = a : inComment x > message :: LineNo -> String -> String -> a > message n x y = error ("line " ++ show n ++ ": " > ++ x ++ " next to " ++ y ++ "\n") \end{document} lhs2tex-1.19/Examples/MaxSegment.lhs0000644000175000017500000000456612507035615020224 0ustar00andresandres00000000000000% lhs2TeX -verb MaxSegment.lhs > MaxSegment.tex % lhs2TeX -math -align 33 MaxSegment.lhs > MaxSegment.tex \documentclass{article} \usepackage[german]{babel} %-------------------------------= -------------------------------------------- %include ../lhs2TeX.sty %include ../lhs2TeX.fmt %-------------------------------= -------------------------------------------- %if style == math %format alpha = "\alpha " %format a1 %format an = a "_n" %elif style == verb %format a1 = "a$_1$" %format an = "a$_n$" %endif \begin{document} So ist |\x -> x + 1| die Nachfolgerfunktion. Diese Aufgabe ist dem Artikel `Proofs as Programs' von Bates und Constable entnommen. Gegeben ist eine Folge von ganzen Zahlen |[a1, ..., an]|. Finde die zusammenh"angende Teilfolge, deren Summe maximal ist unter allen zusammenh"angenden Teilfolgen. F"ur die Folge > seg :: [Integer] > seg = [-3, 2, -5, 3, -1, 2] ist die Teilfolge |[3, -1, 2]| mit der Summe |4| maximal. Die Funktion |segments x| berechnet alle zusammenh"angenden Segmente der Liste |x|. > type Segment alpha = [alpha] > segments :: [a] -> [Segment a] > segments x = s ++ t > where (s, t) = segments' x Ist das Ergebnis der Hilfsfunktion |segments x| das Tupel |(s, t)|, so enth"alt |s| alle echten Pr"afixe von |x| und |t| alle "ubrigen Segmente von |x|. > segments' :: [a] -> ([Segment a], [Segment a]) > segments' [] = ([], []) > segments' (a : x) = ([a] : [ a : y | y <- s ], s ++ t) > where (s, t) = segments' x Die Funktion |maxSegment x| berechnet auf effiziente Weise die L"osung f"ur das oben genannte Problem, d.h. sie realisiert die folgende Spezifikation. < maxSegment :: (Num a, Ord a) => [a] -> a < maxSegment x = maximum [ sum s | s <- segments x ] Die Vorgehensweise entspricht im wesentlichen dem oben geschilderten Verfahren. Beachte, da"s |maxSegment []| undefiniert ist. > maxSegment :: (Num a, Ord a) => [a] -> a > maxSegment x = snd (maxSegment' x) > > maxSegment' :: (Num a, Ord a) => [a] -> (a, a) > maxSegment' [a] = (a, a) > maxSegment' (a : x) = (n, m `max` n) > where (l, m) = maxSegment' x > n = a `max` (a + l) Zur "Ubung: erweitere |maxSegment|, so da"s nicht nur die Summe, sondern zus"atzlich, das dazugeh"orige Segment zur"uckgegeben wird. < min a b | a <= b = a -- vordefiniert < | otherwise = b \end{document} lhs2tex-1.19/lhs2tex.cabal0000644000175000017500000000550512507035615016235 0ustar00andresandres00000000000000cabal-version: >=1.10 name: lhs2tex version: 1.19 license: GPL license-file: LICENSE author: Ralf Hinze , Andres Loeh maintainer: Andres Loeh stability: stable homepage: http://www.andres-loeh.de/lhs2tex/ synopsis: Preprocessor for typesetting Haskell sources with LaTeX description: Preprocessor for typesetting Haskell sources with LaTeX category: Development, Language build-type: Custom extra-source-files: AUTHORS CHANGELOG INSTALL TODO doc/*.lhs doc/*.fmt doc/Guide2.lhs doc/Guide2.pdf doc/Makefile doc/lhs2TeXpre Examples/*.lhs Examples/lhs2TeXpre Library/*.fmt polytable/*.sty polytable/*.pdf src/Version.lhs.in Testsuite/*.snip Testsuite/*.lhs Testsuite/Makefile sorts.snip id.snip cata.snip spec.snip lhs2TeX.fmt.lit lhs2TeX.sty.lit lhs2TeX.1.in Makefile common.mk config.mk.in configure mkinstalldirs install-sh executable lhs2TeX main-is: Main.lhs hs-source-dirs: src default-language: Haskell98 other-extensions: ScopedTypeVariables NPlusKPatterns GeneralizedNewtypeDeriving TypeSynonymInstances build-depends: base >= 4.2 && < 5, regex-compat, mtl, filepath, directory, process other-modules: Auxiliaries Directives Document FileNameUtils FiniteMap HsLexer License MathCommon Math MathPoly NewCode Parser State StateT TeXCommands TeXParser Typewriter Value Verbatim Version lhs2tex-1.19/doc/0000755000175000017500000000000012507035615014420 5ustar00andresandres00000000000000lhs2tex-1.19/doc/ImplicitIn.lhs0000644000175000017500000000050212507035615017166 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format omega = "\omega" >|[omega, omega13, omega', omega13']|\par >%format omega13 >|[omega, omega13, omega', omega13']|\par >%format omega' >|[omega, omega13, omega', omega13']|\par >%format omega13' >|[omega, omega13, omega', omega13']| \endgroup lhs2tex-1.19/doc/SaveRestore.lhs0000644000175000017500000000057412507035615017400 0ustar00andresandres00000000000000%include poly.fmt \begingroup \savecolumns \begin{code} intersperse :: a -> [a] -> [a] intersperse _ [] = [] intersperse _ [x] = [x] \end{code} The only really interesting case is the one for lists containing at least two elements: \restorecolumns \begin{code} intersperse sep (x:xs) = x : sep : intersperse sep xs \end{code} \endgroup lhs2tex-1.19/doc/verbatim.fmt0000644000175000017500000003001512507035615016740 0ustar00andresandres00000000000000%subst verb a = "\text{\tt " a "}" %subst verbatim a = "\begin{tabbing}\tt'n" a "'n\end{tabbing}'n" %subst verbnl = "\\'n\tt " %if style == tt %subst inline a = "\text{\texfamily " a "}" %subst thinspace = "\Sp " %subst code a = "\begin{tabbing}\texfamily'n" a "'n\end{tabbing}'n" %subst comment a = "{\rmfamily-{}- " a "}" %subst nested a = "{\rmfamily\enskip\{- " a " -\}\enskip}" %subst pragma a = "{\rmfamily\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %subst spaces a = a %subst special a = a %subst space = "~" %subst newline = "\\'n\texfamily " %subst conid a = "{\itshape " a "}" %subst varid a = a %subst consym a = a %subst varsym a = a %subst numeral a = a %subst char a = "''" a "''" %subst string a = "\char34 " a "\char34 " %if underlineKeywords %subst keyword a = "\uline{" a "}" %else %subst keyword a = "{\bfseries " a "}" %endif %format \ = "\char''10" %format . = "\char''00" %if not spacePreserving %format alpha = "\char''02" %format beta = "\char''03" %format gamma = "\char''11" %format delta = "\char''12" %format pi = "\char''07" %format infty = "\char''16" %format intersect = "\char''22" %format union = "\char''23" %format forall = "\char''24" %format exists = "\char''25" %format not = "\char''05" %format && = "\char''04" %format || = "\char''37" %format <- = "\char''06" %format -> = "\char''31" %format == = "\char''36" %format /= = "\char''32" %format <= = "\char''34" %format >= = "\char''35" %endif %if meta %format M.a = "\ensuremath{a}" %format M.b = "\ensuremath{b}" %format M.c = "\ensuremath{c}" %format M.d = "\ensuremath{d}" %format M.e = "\ensuremath{e}" %format M.f = "\ensuremath{f}" %format M.g = "\ensuremath{g}" %format M.h = "\ensuremath{h}" %format M.i = "\ensuremath{i}" %format M.j = "\ensuremath{j}" %format M.k = "\ensuremath{k}" %format M.l = "\ensuremath{l}" %format M.m = "\ensuremath{m}" %format M.n = "\ensuremath{n}" %format M.o = "\ensuremath{o}" %format M.p = "\ensuremath{p}" %format M.q = "\ensuremath{q}" %format M.r = "\ensuremath{r}" %format M.s = "\ensuremath{s}" %format M.t = "\ensuremath{t}" %format M.u = "\ensuremath{u}" %format M.v = "\ensuremath{v}" %format M.w = "\ensuremath{w}" %format M.x = "\ensuremath{x}" %format M.y = "\ensuremath{y}" %format M.z = "\ensuremath{z}" %format M.A = "\ensuremath{A}" %format M.B = "\ensuremath{B}" %format M.C = "\ensuremath{C}" %format M.D = "\ensuremath{D}" %format M.E = "\ensuremath{E}" %format M.F = "\ensuremath{F}" %format M.G = "\ensuremath{G}" %format M.H = "\ensuremath{H}" %format M.I = "\ensuremath{I}" %format M.J = "\ensuremath{J}" %format M.K = "\ensuremath{K}" %format M.L = "\ensuremath{L}" %format M.M = "\ensuremath{M}" %format M.N = "\ensuremath{N}" %format M.O = "\ensuremath{O}" %format M.P = "\ensuremath{P}" %format M.Q = "\ensuremath{Q}" %format M.R = "\ensuremath{R}" %format M.S = "\ensuremath{S}" %format M.T = "\ensuremath{T}" %format M.U = "\ensuremath{U}" %format M.V = "\ensuremath{V}" %format M.W = "\ensuremath{W}" %format M.X = "\ensuremath{X}" %format M.Y = "\ensuremath{Y}" %format M.Z = "\ensuremath{Z}" %format M.alpha = "\ensuremath{\alpha}" %format M.beta = "\ensuremath{\beta}" %format M.gamma = "\ensuremath{\gamma}" %format M.delta = "\ensuremath{\delta}" %format M.epsilon = "\ensuremath{\epsilon}" %format M.zeta = "\ensuremath{\zeta}" %format M.eta = "\ensuremath{\eta}" %format M.theta = "\ensuremath{\theta}" %format M.iota = "\ensuremath{\iota}" %format M.kappa = "\ensuremath{\kappa}" %format M.lambda = "\ensuremath{\lambda}" %format M.mu = "\ensuremath{\mu}" %format M.nu = "\ensuremath{\nu}" %format M.xi = "\ensuremath{\xi}" %format M.pi = "\ensuremath{\pi}" %format M.rho = "\ensuremath{\rho}" %format M.sigma = "\ensuremath{\sigma}" %format M.tau = "\ensuremath{\tau}" %format M.upsilon = "\ensuremath{\upsilon}" %format M.phi = "\ensuremath{\phi}" %format M.chi = "\ensuremath{\chi}" %format M.psi = "\ensuremath{\psi}" %format M.omega = "\ensuremath{\omega}" %format M.Gamma = "\ensuremath{\Gamma}" %format M.Delta = "\ensuremath{\Delta}" %format M.Theta = "\ensuremath{\Theta}" %format M.Lambda = "\ensuremath{\Lambda}" %format M.Xi = "\ensuremath{\Xi}" %format M.Pi = "\ensuremath{\Pi}" %format M.Sigma = "\ensuremath{\Sigma}" %format M.Upsilon = "\ensuremath{\Upsilon}" %format M.Phi = "\ensuremath{\Phi}" %format M.Psi = "\ensuremath{\Psi}" %format M.Omega = "\ensuremath{\Omega}" %format M.forall = "\ensuremath{\forall}" %format M.exists = "\ensuremath{\exists}" %format M.not = "\ensuremath{\neg}" %format ==> = "\ensuremath{\Longrightarrow}" %format <== = "\ensuremath{\Longleftarrow}" %format /\ = "\ensuremath{\wedge}" %format \/ = "\ensuremath{\vee}" %format M.= = "\ensuremath{=}" %format M./= = "\ensuremath{\neq}" %format M.< = "\ensuremath{<}" %format M.<= = "\ensuremath{\leq}" %format M.>= = "\ensuremath{\geq}" %format M.> = "\ensuremath{>}" %endif %elif style == newcode %subst comment a = "-- " a %subst nested a = "{- " a " -}" %subst code a = a "'n" %subst newline = "'n" %subst dummy = %subst pragma a = "{-# " a " #-}" %subst tex a = %subst numeral a = a %subst keyword a = a %subst spaces a = a %subst special a = a %subst space = " " %subst conid a = a %subst varid a = a %subst consym a = a %subst varsym a = a %subst char a = "''" a "''" %subst string a = "'d" a "'d" %format # = "#" %format $ = "$" %format % = "%" %format & = "&" %elif style == math %subst phantom a = "\phantom{" a "\mbox{}}" %subst comment a = "\mbox{\qquad-{}- " a "}" %subst nested a = "\mbox{\enskip\{- " a " -\}\enskip}" %if array %subst code a = "\[\begin{array}{@{}lcl}'n\hspace{\lwidth}&\hspace{\cwidth}&\\[-10pt]'n" a "'n\end{array}\]" %subst column3 l c r = "{}" l " & " c " & {" r "}" %subst column1 a = "\multicolumn{3}{@{}l}{" a "}" %else %subst code a = "\begin{tabbing}'n\qquad\=\hspace{\lwidth}\=\hspace{\cwidth}\=\+\kill'n" a "'n\end{tabbing}" %subst column3 l c r = "$" l "$ \> \makebox[\cwidth]{$" c "$} \> ${" r "}$" %subst column1 a = "${" a "}$" %endif %subst newline = "\\'n" %subst blankline = "\\[1mm]'n" %let anyMath = True %elif style == poly %subst comment a = "\mbox{\onelinecomment " a "}" %subst nested a = "\mbox{\commentbegin " a " \commentend}" %if array %subst code a = "\['n\begin{parray}\SaveRestoreHook'n" a "\ColumnHook'n\end{parray}'n\]\resethooks'n" %else %subst code a = "\begingroup\par\noindent\advance\leftskip\mathindent\('n\begin{pboxed}\SaveRestoreHook'n" a "\ColumnHook'n\end{pboxed}'n\)\par\noindent\endgroup\resethooks'n" %endif %subst column c a = "\column{" c "}{" a "}'n" %subst fromto b e t = "\fromto{" b "}{" e "}{{}" t "{}}'n" %subst left = "@{}l@{}" %subst centered = "@{}c@{}" %subst dummycol = "@{}l@{}" %subst newline = "\nextline'n" %subst blankline = "\nextline[\blanklineskip]'n" %subst indent n = "\hsindent{" n "}" %let anyMath = True %endif %if anyMath %let autoSpacing = True %subst dummy = "\cdot " %subst inline a = "\ensuremath{" a "}" %subst hskip a = "\hskip" a "em\relax" %subst pragma a = "\mbox{\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %if latex209 %subst numeral a = "{\mathrm " a "}" %subst keyword a = "{\mathbf " a "}" %else %subst numeral a = "\mathrm{" a "}" %subst keyword a = "\mathbf{" a "}" %endif %subst spaces a = a %subst special a = a %subst space = "\;" %subst conid a = "\Conid{" a "}" %subst varid a = "\Varid{" a "}" %subst consym a = "\mathbin{" a "}" %subst varsym a = "\mathbin{" a "}" %subst char a = "\text{\tt ''" a "''}" %subst string a = "\text{\tt \char34 " a "\char34}" %format _ = "\anonymous " %format -> = "\to " %format <- = "\leftarrow " %format => = "\Rightarrow " %format \ = "\lambda " %format | = "\mid " %format { = "\{\mskip1.5mu " %format } = "\mskip1.5mu\}" %format [ = "[\mskip1.5mu " %format ] = "\mskip1.5mu]" %format = = "\mathrel{=}" %format .. = "\mathinner{\ldotp\ldotp}" %format ~ = "\mathord{\sim}" %format @ = "\mathord{@}" %format . = "\mathbin{\circ}" %format !! = "\mathbin{!!}" %format ^ = "\mathbin{\uparrow}" %format ^^ = "\mathbin{\uparrow\uparrow}" %format ** = "\mathbin{**}" %format / = "\mathbin{/}" %format `quot` = "\mathbin{\Varid{`quot`}}" %format `rem` = "\mathbin{\Varid{`rem`}}" %format `div` = "\mathbin{\Varid{`div`}}" %format `mod` = "\mathbin{\Varid{`mod`}}" %format :% = "\mathbin{:\%}" %format % = "\mathbin{\%}" %format : = "\mathbin{:}" %format ++ = "\plus " %format == = "\equiv " %% ODER: format == = "\mathrel{==}" %format /= = "\not\equiv " %% ODER: format /= = "\neq " %format <= = "\leq " %format >= = "\geq " %format `elem` = "\in " %format `notElem` = "\notin " %format && = "\mathrel{\wedge}" %format || = "\mathrel{\vee}" %format >> = "\sequ " %format >>= = "\bind " %format $ = "\mathbin{\$}" %format `seq` = "\mathbin{\Varid{`seq`}}" %format ! = "\mathbin{!}" %format // = "\mathbin{//}" %format undefined = "\bot " %format not = "\neg " %if meta %format M.a = "a" %format M.b = "b" %format M.c = "c" %format M.d = "d" %format M.e = "e" %format M.f = "f" %format M.g = "g" %format M.h = "h" %format M.i = "i" %format M.j = "j" %format M.k = "k" %format M.l = "l" %format M.m = "m" %format M.n = "n" %format M.o = "o" %format M.p = "p" %format M.q = "q" %format M.r = "r" %format M.s = "s" %format M.t = "t" %format M.u = "u" %format M.v = "v" %format M.w = "w" %format M.x = "x" %format M.y = "y" %format M.z = "z" %format M.A = "A" %format M.B = "B" %format M.C = "C" %format M.D = "D" %format M.E = "E" %format M.F = "F" %format M.G = "G" %format M.H = "H" %format M.I = "I" %format M.J = "J" %format M.K = "K" %format M.L = "L" %format M.M = "M" %format M.N = "N" %format M.O = "O" %format M.P = "P" %format M.Q = "Q" %format M.R = "R" %format M.S = "S" %format M.T = "T" %format M.U = "U" %format M.V = "V" %format M.W = "W" %format M.X = "X" %format M.Y = "Y" %format M.Z = "Z" %format M.alpha = "\alpha " %format M.beta = "\beta " %format M.gamma = "\gamma " %format M.delta = "\delta " %format M.epsilon = "\epsilon " %format M.zeta = "\zeta " %format M.eta = "\eta " %format M.theta = "\theta " %format M.iota = "\iota " %format M.kappa = "\kappa " %format M.lambda = "\lambda " %format M.mu = "\mu " %format M.nu = "\nu " %format M.xi = "\xi " %format M.pi = "\pi " %format M.rho = "\rho " %format M.sigma = "\sigma " %format M.tau = "\tau " %format M.upsilon = "\upsilon " %format M.phi = "\phi " %format M.chi = "\chi " %format M.psi = "\psi " %format M.omega = "\omega " %format M.Gamma = "\Gamma " %format M.Delta = "\Delta " %format M.Theta = "\Theta " %format M.Lambda = "\Lambda " %format M.Xi = "\Xi " %format M.Pi = "\Pi " %format M.Sigma = "\Sigma " %format M.Upsilon = "\Upsilon " %format M.Phi = "\Phi " %format M.Psi = "\Psi " %format M.Omega = "\Omega " %format M.forall = "\forall " %format M.exists = "\exists " %format M.not = "\neg " %format ==> = "\enskip\Longrightarrow\enskip " %format <== = "\enskip\Longleftarrow\enskip " %format /\ = "\enskip\mathrel{\wedge}\enskip " %format \/ = "\enskip\mathrel{\vee}\enskip " %format M.= = "=" %format M./= = "\neq " %format M.< = "<" %format M.<= = "\leq " %format M.>= = "\geq " %format M.> = ">" %endif %endif %subst verbatim a = "\begin{colorverb}'n\tt " a "\end{colorverb}'n" lhs2tex-1.19/doc/PolyPrelude.lhs0000644000175000017500000000024612507035615017376 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >\documentclass{article} >%include polycode.fmt >\begin{document} > >\end{document} \endgrouplhs2tex-1.19/doc/ZipPoly.lhs0000644000175000017500000000113312507035615016534 0ustar00andresandres00000000000000%include poly.fmt %subst code a = "\begin{colorcode}'n" a "\end{colorcode}\resethooks'n" \begin{code} zip :: [a] -> [b] -> [(a,b)] zip = zipWith (\a b -> (a,b)) zipWith :: (a->b->c) -> [a]->[b]->[c] zipWith z (a:as) (b:bs) = z a b : zipWith z as bs zipWith _ _ _ = [] partition :: (a -> Bool) -> [a] -> ([a],[a]) partition p xs = foldr select ([],[]) xs where select x (ts,fs) | p x = (x:ts,fs) | otherwise = (ts,x:fs) \end{code} lhs2tex-1.19/doc/Zip.lhs0000644000175000017500000000110212507035615015664 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt\makebox[0pt]{\phantom{X}}} \begin{code} zip :: [a] -> [b] -> [(a,b)] zip = zipWith (\a b -> (a,b)) zipWith :: (a->b->c) -> [a]->[b]->[c] zipWith z (a:as) (b:bs) = z a b : zipWith z as bs zipWith _ _ _ = [] partition :: (a -> Bool) -> [a] -> ([a],[a]) partition p xs = foldr select ([],[]) xs where select x (ts,fs) | p x = (x:ts,fs) | otherwise = (ts,x:fs) \end{code} \endgroup lhs2tex-1.19/doc/CardIn.lhs0000644000175000017500000000041412507035615016267 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format abs (a) = "\mathopen{|}" a "\mathclose{|}" >%format ~> = "\leadsto" >The |abs| function computes the absolute value of >an integer: >\begin{code} >abs(-2) ~> 2 >\end{code} \endgroup lhs2tex-1.19/doc/InteractiveGhci.lhs0000644000175000017500000000052412507035615020201 0ustar00andresandres00000000000000%include poly.fmt %if False > module InteractiveGhci where %endif %format . = "." %format forall a = "\forall" a %options ghci -XRankNTypes -fprint-explicit-foralls > fix :: forall a. (a -> a) -> a > fix f = f (fix f) This function is of type \eval{:t fix}, and |take 10 (fix ('x':))| evaluates to \eval{take 10 (fix ('x':))}. lhs2tex-1.19/doc/SpacingOps.lhs0000644000175000017500000000021312507035615017172 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} \begin{code} %format ^ = " " %format ^^ = "\;" \end{code} \endgroup lhs2tex-1.19/doc/PlusDefinition.lhs0000644000175000017500000000017312507035615020065 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >\newcommand{\plus}{\mathbin{+\!\!\!+}} \endgroup lhs2tex-1.19/doc/ImplicitUnderscore.lhs0000644000175000017500000000053312507035615020735 0ustar00andresandres00000000000000%include poly.fmt %format a_i %format a_j %format left = "\leftarrow " %format right = "\rightarrow " %format a_left %format a_right %format a_let %format a_where %format a_x_1 %format a_x_2 %format y_1 %format y_2 %format a_y_1 %format a_y_2 %format a_y1 %format a_i' |[a_i,a_j,a_left,a_right,a_let,a_where,a_x_1,a_x_2,a_y_1,a_y_2,a_y1,a_i']| lhs2tex-1.19/doc/AccidentalC.lhs0000644000175000017500000000063612507035615017267 0ustar00andresandres00000000000000%include poly.fmt %format <| = "\lhd " > options :: [String] -> ([Class],[String]) > options = foldr (<|) ([],[]) > where "-align" <| (ds,s: as) = (Dir Align s : ds, as) > ('-':'i':s) <| (ds, as) = (Dir Include s : ds, as) > ('-':'l':s) <| (ds, as) = (Dir Let s : ds, as) > s <| (ds, as) = ( ds,s : as) lhs2tex-1.19/doc/HelloWorldBirdInput.lhs0000644000175000017500000000022012507035615021016 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} > >> main :: IO () >> main = putStrLn "Hello, world!" > \endgroup lhs2tex-1.19/doc/RawSearchPath.lhs0000644000175000017500000000074112507035615017626 0ustar00andresandres00000000000000\begin{code} . {HOME}/lhs2tex-1.19// {HOME}/lhs2tex// {HOME}/lhs2TeX// {HOME}/.lhs2tex-1.19// {HOME}/.lhs2tex// {HOME}/.lhs2TeX// {LHS2TEX}// /usr/local/share/lhs2tex-1.19// /usr/local/share/lhs2tex-1.19// /usr/local/lib/lhs2tex-1.19// /usr/share/lhs2tex-1.19// /usr/lib/lhs2tex-1.19// /usr/local/share/lhs2tex// /usr/local/lib/lhs2tex// /usr/share/lhs2tex// /usr/lib/lhs2tex// /usr/local/share/lhs2TeX// /usr/local/lib/lhs2TeX// /usr/share/lhs2TeX// /usr/lib/lhs2TeX// \end{code} lhs2tex-1.19/doc/Accidental.lhs0000644000175000017500000000063212507035615017160 0ustar00andresandres00000000000000%include poly.fmt %format <| = "\lhd " > options :: [String] -> ([Class],[String]) > options = foldr (<|) ([],[]) > where "-align" <| (ds,s: as) = (Dir Align s : ds, as) > ('-':'i':s) <| (ds, as) = (Dir Include s : ds, as) > ('-':'l':s) <| (ds, as) = (Dir Let s : ds, as) > s <| (ds, as) = ( ds,s : as) lhs2tex-1.19/doc/MkTeXLsrCall.lhs0000644000175000017500000000016212507035615017374 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} \begin{code} $ mktexlsr \end{code} \endgroup lhs2tex-1.19/doc/ParensExampleIn.lhs0000644000175000017500000000037512507035615020170 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format ^^ = "\;" >%format (ptest (a) b (c)) = ptest ^^ a ^^ b ^^ c >\begin{code} >ptest a b c >(ptest (a) (b) (c)) >((ptest((a)) ((b)) ((c)))) >\end{code} \endgroup lhs2tex-1.19/doc/ZipMath.lhs0000644000175000017500000000115012507035615016501 0ustar00andresandres00000000000000%let array=True %include stupid.fmt %subst code a = "\begin{colorarray}{@{}lcl@{}}'n" a "\end{colorarray}'n" %align 28 \begin{code} zip :: [a] -> [b] -> [(a,b)] zip = zipWith (\a b -> (a,b)) zipWith :: (a->b->c) -> [a]->[b]->[c] zipWith z (a:as) (b:bs) = z a b : zipWith z as bs zipWith _ _ _ = [] partition :: (a -> Bool) -> [a] -> ([a],[a]) partition p xs = foldr select ([],[]) xs where select x (ts,fs) | p x = (x:ts,fs) | otherwise = (ts,x:fs) \end{code} lhs2tex-1.19/doc/AlignColumnSyntax.lhs0000644000175000017500000000331612507035615020552 0ustar00andresandres00000000000000%include tex.fmt \newcommand*{\bslash}{@\@} \newcommand*{\atsym}{\texttt{\char64}} %format \ = "\bslash " %format @ = "\atsym " %format @@ = @ @ %format > = "\texttt{>}" %format < = "\texttt{<}" %format columnspec = "\Varid{column\text{\itshape -}specifier}" \invisiblecomments \begin{code} term(\aligncolumn){ent(integer)}{ent(columnspec)} \end{code} The |ent(integer)| denotes the number (i.e.~as displayed by the editor) of a column. Note that @lhs2TeX@ starts counting columns at 1. As |ent(columnspec)| one can use about the same strings that one can use to format a column in a @tabular@ environment using the \LaTeX\ @array@~\cite{array} package. Table~\ref{columnspec} has a short (and not necessarily complete) overview. \begin{table} \centering \begin{colorsurround} \begin{tabularx}{\linewidth}{cX} @l@ & left-align column \\ @c@ & center column \\ @r@ & right-align column \\ |term(p){ent(dimen)}| & make column of fixed width |ent(dimen)| \\ |@@{ent(tex)}| & can be used before or after the letter specifying alignment to suppress inter-column space and typeset |ent(tex)| instead; note that this is usually achieved using just one \texttt{\atsym}, but as @lhs2TeX@ interprets the \texttt{\atsym}, it must be escaped \\ |>{ent(tex)}| & can be used before the letter specifying the alignment to insert |ent(tex)| directly in front of the entry of the column \\ |<{ent(tex)}| & can be used after the letter specifying the alignment to insert |ent(tex)| directly after the entry of the column \end{tabularx} \end{colorsurround} \caption{Column specifiers for @\aligncolumn@}\label{columnspec} \end{table} lhs2tex-1.19/doc/HelloWorld.lhs0000644000175000017500000000023712507035615017205 0ustar00andresandres00000000000000%include poly.fmt This is the famous ``Hello world'' example, written in Haskell: \begin{code} main :: IO () main = putStrLn "Hello, world!" \end{code} lhs2tex-1.19/doc/InteractivePreIn.lhs0000644000175000017500000000107612507035615020347 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} %if style == newcode module InteractivePre where %endif \begin{code} %format SPL(x) = $ ( x ) %if style == newcode %format QU(x) = [ | x | ] %format ^^ = " " %else %format QU(x) = "\llbracket " x "\rrbracket " %format ^^ = "\; " %endif %options ghci -fth -pgmL ../lhs2TeX -optL--pre This is a rather stupid way of computing |42| using Template Haskell: > answer = SPL(foldr1 (\x y -> QU(SPL(x) + SPL(y))) (replicate 21 ^^ QU(2))) The answer is indeed \eval{answer}. \end{code} \endgroup lhs2tex-1.19/doc/SpacingOpsCond.lhs0000644000175000017500000000031312507035615017777 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} \begin{code} %if style == newcode %format ^ = %format ^^ = " " %else %format ^ = " " %format ^^ = "\;" %endif \end{code} \endgroup lhs2tex-1.19/doc/ParensExample2.lhs0000644000175000017500000000045512507035615017762 0ustar00andresandres00000000000000%include poly.fmt \begingroup \setlength{\abovedisplayskip}{1pt} \setlength{\belowdisplayskip}{1pt} %format eval a = "\llbracket " a "\rrbracket " \begin{code} size (eval (2 + 2)) \end{code} %format (eval (a)) = "\llbracket " a "\rrbracket " \begin{code} size (eval (2 + 2)) \end{code} \endgroup lhs2tex-1.19/doc/Indent3.lhs0000644000175000017500000000013712507035615016435 0ustar00andresandres00000000000000%include poly.fmt %format foo = verylongfoo \begin{code} test 1 foo bar 2 \end{code} lhs2tex-1.19/doc/ZipPolyTT.lhs0000644000175000017500000000122312507035615017004 0ustar00andresandres00000000000000%include polytt.fmt %subst code a = "\begin{colorcode}\thinmuskip=10mu\medmuskip=10mu\thickmuskip=10mu\relax'n" a "\end{colorcode}\resethooks'n" \begin{code} zip :: [a] -> [b] -> [(a,b)] zip = zipWith (\a b -> (a,b)) zipWith :: (a->b->c) -> [a]->[b]->[c] zipWith z (a:as) (b:bs) = z a b : zipWith z as bs zipWith _ _ _ = [] partition :: (a -> Bool) -> [a] -> ([a],[a]) partition p xs = foldr select ([],[]) xs where select x (ts,fs) | p x = (x:ts,fs) | otherwise = (ts,x:fs) \end{code} lhs2tex-1.19/doc/Guide2.lhs0000644000175000017500000022046612507035615016261 0ustar00andresandres00000000000000\documentclass[10pt]{scrartcl} % save linebreak; see below \let\origlinebreak=\\ \renewcommand{\sectfont}{\bf} %let framed = False \usepackage[english]{babel} %\usepackage[fleqn]{amsmath} \usepackage{stmaryrd} \usepackage{hyperref} %\usepackage[T1]{fontenc} \usepackage{mathpazo} %\usepackage[scaled=0.9]{luximono} \usepackage{colortbl} \usepackage{calc} %\usepackage{pifont} \usepackage{paralist} \usepackage{ifthen} \usepackage{relsize} \usepackage{xspace} \usepackage{tabularx} %if framed \usepackage{framed} \FrameSep=2\fboxsep %endif \newcommand*{\PDF}{{\smaller{PDF}}\xspace} \newcommand*{\CTAN}{{\smaller{CTAN}}\xspace} %format lhs2TeX = "\text{\textrm{lhs}\textsf{2}\TeX}" \setdefaultitem{\textbf{--}}{}{}{} %let doc = True %include lhs2TeX.fmt %include Version.lhs \newlength{\lwidth} \newlength{\cwidth} \setlength{\lwidth}{0pt} \setlength{\cwidth}{0pt} %separation 2 %latency 2 \let\origcolor=\color \newcommand{\dep}[1]{{\origcolor{red}#1}} \def\swgt#1{\switch[\value{step}>#1]}% \def\ro#1{\ifthenelse{\value{step}=#1}{\origcolor{red}}{}}% %\usepackage[display]{texpower} %hyperref needs some setup, especially after pdfscreen \hypersetup{% colorlinks=True,% pdfmenubar=True,% pdfcenterwindow=False,% pdffitwindow=False}% %fixed lengths are better ... % \AtBeginDocument{% % \setlength{\abovedisplayskip}{6pt plus 0pt minus 0pt}% originally 10.0pt plus 2.0pt minus 5.0pt % \setlength{\belowdisplayskip}{6pt plus 0pt minus 0pt}% originally 10.0pt plus 2.0pt minus 5.0pt % } % \setlength{\belowdisplayshortskip}{6pt plus 0pt minus 0pt}% % \setlength{\abovedisplayshortskip}{6pt plus 0pt minus 0pt}% % \setlength{\smallskipamount}{2pt} % \setlength{\medskipamount}{5pt} % \setlength{\bigskipamount}{10pt} % % % \setlength\pltopsep{2pt} % \setlength\plitemsep{1pt} % \setlength\parskip{0pt} \newcounter{pagesave} % redefining the lhs2TeX code command is needed because % TeXpower seems to tamper with \\ in some nasty way ... % This one works: %%subst code a = "\begingroup\parskip=\abovedisplayskip\par\advance\leftskip\mathindent\let\\=\origlinebreak\('n\begin{pboxed}\SaveRestoreHook'n" a "\ColumnHook'n\end{pboxed}'n\)\parskip=\belowdisplayskip\par\endgroup\resethooks'n" % This one is with color: %subst code a = "\begin{colorcode}'n" a "\end{colorcode}\resethooks'n" \definecolor{rlcolor}{gray}{.8} \arrayrulecolor{rlcolor} \definecolor{hcolor}{gray}{.7} % \newenvironment{colorcode}{% % \parskip=\abovedisplayskip\par\noindent % \begingroup\small% small changes displayskips! % %if color % \tabular{@@{}>{\columncolor{codecolor}}p{\linewidth}@@{}}% % %elif framed % \framed % %else % \tabular{@@{}||p{\linewidth-2\arraycolsep-2\arrayrulewidth-2pt}||@@{}}% % \hline \\[-1.5ex] % \let\myendofline=\\ % %endif % \let\\=\origlinebreak % \(% % \pboxed\SaveRestoreHook}{% % \ColumnHook\endpboxed % \)% % %if not color && not framed % \myendofline[.5ex]\hline % %endif % %if framed % \endframed % %else % \endtabular % %endif % \endgroup % \parskip=\belowdisplayskip\par\noindent % \ignorespacesafterend} \newenvironment{colorcode}{% \colorsurround \(% \pboxed\SaveRestoreHook}{% \ColumnHook\endpboxed \)% \endcolorsurround} % \newenvironment{colorsurround}{% % \parskip=\abovedisplayskip\par\noindent % \begingroup\small% small changes displayskips! % %if color % \tabular{@@{}>{\columncolor{codecolor}}p{\linewidth}@@{}}% % %elif framed % \framed % %else % \tabular{@@{}||p{\linewidth-2\arraycolsep-2\arrayrulewidth-2pt}||@@{}}% % \hline \\[-1.5ex] % \let\myendofline=\\ % %endif % \let\\=\origlinebreak}{% % %if not color && not framed % \myendofline[.5ex]\hline % %endif % %if framed % \endframed % %else % \endtabular % %endif % \endgroup % \parskip=\belowdisplayskip\par\noindent % \ignorespacesafterend} \newenvironment{colorsurround}{\colorverb}{\endcolorverb} % \newenvironment{colorarray}{% % \parskip=\abovedisplayskip\par\noindent % \begingroup\small% small changes displayskips! % %if color % \tabular{@@{}>{\columncolor{codecolor}}p{\linewidth}@@{}}% % %elif framed % \framed % %else % \tabular{@@{}||p{\linewidth-2\arraycolsep-2\arrayrulewidth-2pt}||@@{}}% % \hline \\[-1.5ex] % \let\myendofline=\\ % %endif % \let\\=\origlinebreak % \(% % \array}{% % \endarray % \)% % %if not color && not framed % \myendofline[.5ex]\hline % %endif % %if framed % \endframed % %else % \endtabular % %endif % \endgroup % \parskip=\belowdisplayskip\par\noindent % \ignorespacesafterend} \newenvironment{colorarray}{% \colorsurround \(% \array}{% \endarray \)% \endcolorsurround} \makeatletter \newenvironment{colorverb}{% \parskip=\abovedisplayskip\par\noindent \begingroup\small% small changes displayskips! %if color \tabular{@@{}>{\columncolor{codecolor}}p{\linewidth}@@{}}% %elif framed \framed %else \tabular{@@{}||p{\linewidth-2\arraycolsep-2\arrayrulewidth-2pt}||@@{}}% \hline \\[-1.5ex] \let\myendofline=\\ %endif \let\\=\origlinebreak}{% %if not color && not framed \myendofline[.5ex]\hline %endif %if framed \endframed %else \endtabular %endif \endgroup \parskip=\belowdisplayskip\par\noindent \ignorespacesafterend} \makeatother %%% %%% "IMPORTANT" ENVIRONMENT %%% \newenvironment{important}[1][Important]% {\colorsurround \centering \bfseries\textsc{#1:}\ }% {\endcolorsurround} %\definecolor{codecolor}{rgb}{.982, .902, .902}% original %\definecolor{codecolor}{rgb}{1,.898,.667}% so'n orange \definecolor{codecolor}{rgb}{1,1,.667} %format forall(a) = "\forall " a "\relax" %\usepackage{fonttabl} \begin{document} %\begingroup %\texfamily %\fonttable %\endgroup \title{Guide to |lhs2TeX|\\ \smaller (for version \ProgramVersion)} \author{{Ralf Hinze}\\ \smaller \tabular{c} Computing Laboratory, University of Oxford\\ %Wolfson Building, Parks Road, Oxford, OX1 3QD, England\\ \verb|ralf.hinze@comlab.ox.ac.uk| \endtabular \and {Andres L\"oh}\\ \smaller \tabular{c} Well-Typed LLP\\ %Institute of Information and Computing Sciences\\ %Utrecht University, P.O.~Box 80.089\\ %3508 TB Utrecht, The Netherlands\\ \verb|mail@andres-loeh.de| \endtabular}% \date{\today} \maketitle \tableofcontents %--------------------------------------------------------------------------- \section{About |lhs2TeX|} \label{sec:about} %--------------------------------------------------------------------------- The program |lhs2TeX| is a preprocessor that takes a literate Haskell source file as input (or something sufficiently alike) and produces a formatted file that can be processed further by \LaTeX. For example, consider the following input file: \input{HelloWorldInput} If we run the following two commands on it \input{HelloWorldDialogue} then the resulting \PDF file will look similar to \begin{colorsurround} \input{HelloWorld} %if color \vspace*{-2\baselineskip}% %endif \end{colorsurround} %if color \vspace*{\belowdisplayskip}% \par\noindent %endif The behaviour of |lhs2TeX| is highly customizable. The main mode of operation of |lhs2TeX| is called the \textbf{style}. By default, |lhs2TeX| operates in \textbf{poly} style. Other styles can be selected via command line flags. Depending on the selected style, |lhs2TeX| can perform quite different tasks. Here is a brief overview: % \begin{compactitem} \item \textbf{verb} (verbatim): format code completely verbatim \item \textbf{tt} (typewriter): format code verbatim, but allow special formatting of keywords, characters, some functions, \dots \item \textbf{math}: mathematical formatting with basic alignment, highly customizable \item \textbf{poly}: mathematical formatting with mutliple alignments, highly customizable, supersedes \textbf{math} \item \textbf{code}: delete all comments, extract sourcecode \item \textbf{newcode} (new code): delete all comments, extract sourcecode, but allow for formatting, supersedes \textbf{code} \end{compactitem} The name of the style is also the name of the flag you have to pass to |lhs2TeX| in order to activate the style. For example, call @lhs2TeX --newcode@ to use |lhs2TeX| in \textbf{newcode} style. %%% %%% %--------------------------------------------------------------------------- \section{Installing |lhs2TeX|} %--------------------------------------------------------------------------- There are three options for installing |lhs2TeX| (ordered by ease): \begin{compactitem} \item Using Hackage \item Using Cabal. \item Classic configure/make. \end{compactitem} \subsection{Using Hackage to install |lhs2TeX|} The Haskell Platform~\cite{platform} is the easiest way to get started with programming Haskell. It is also the easiest way to build, install, and manage Haskell packages, through Hackage~\cite{hackage}: \input{HackageInstallation}% The first command downloads the latest package list, and the second installs (along with any dependencies) the latest version of |lhs2TeX|. \subsection{Using Cabal to install |lhs2TeX|} If you have downloaded a source distribution, which is a valid Cabal package, you can install |lhs2TeX| using Cabal (this requires Cabal 1.2 or later). Begin by unpacking the archive. Assuming that it has been unpacked into directory @/somewhere@, then say \input{CabalInstallation}% The install step requires write access to the installation location and the \LaTeX\ filename database. (Hint: use \texttt{sudo} if necessary.) \subsection{configure/make} The following instructions apply to Unix-like environments. However, |lhs2TeX| does run on Windows systems, too. (If you would like to add installation instructions or facilitate the installation procedure for Windows systems, please contact the authors.) Begin by unpack the archive. Assuming that it has been unpacked into directory @/somewhere@, then say \input{InstallationInstructions}% You might need administrator permissions to perform the @make install@ step. Alternatively, you can select your own installation location by passing the @--prefix@ argument to @configure@: \input{ConfigureCall} There are a couple of library files that come with |lhs2TeX| (containing basic |lhs2TeX| formatting directives) that need to be found by the |lhs2TeX| binary. The default search path is as follows: \input{SearchPath}% \label{defaultsearchpath}% Here, @{HOME}@ and @{LHS2TEX}@ denote the current values of the environment variables @HOME@ and @LHS2TEX@. The double slash at the end of each dir means that subdirectories are also scanned. If |lhs2TeX| is installed to a non-standard path, you might want to set the environment variable @LHS2TEX@ to point to the directory where @lhs2TeX.fmt@ and the other library files have been installed to. \begin{important} To be able to use ``poly'' style, the two \LaTeX\ packages\\ @polytable.sty@ and @lazylist.sty@ are required! \end{important} % Both are included in the |lhs2TeX| distribution (they are not part of standard \LaTeX\ distributions, although they are available from \CTAN~\cite{polytable,lazylist}), and are usually installed during the normal procedure. The @configure@ script will determine whether a suitably recent version of @polytable@ is installed on your system, and if necessary, install both @polytable.sty@ and @lazylist.sty@ to your \TeX\ system. If this is not desired or fails (because the script cannot detect your \TeX\ installation properly), the installation of these files can be disabled by passing the option @--disable-polytable@ to @configure@. In this case, the two files must be manually installed to a location where your \TeX\ distribution will find them. Assuming that you have a local \TeX\ tree at @/usr/local/share/texmf@, this can usually be achieved by placing the files in the directory @/usr/local/share/texmf/tex/latex/polytable@ and subsequently running \input{MkTeXLsrCall}% to update the \TeX\ filename database. %%% %%% %--------------------------------------------------------------------------- \section{How to hit the ground running with |lhs2TeX|} %--------------------------------------------------------------------------- When run on a literate Haskell source file, |lhs2TeX| classifies the input into different blocks. \paragraph{\bf Bird-style code blocks} % In the Bird-style of literate Haskell programming, all lines starting with @>@ are interpreted as code. (To be good literate code, you must always leave a blank line before and after the code block.) % \input{HelloWorldBirdInput}% % These lines are considered by |lhs2TeX| as \textbf{code blocks} and are processed as such. Lines beginning with @>@ will be treated as code to be formatted by |lhs2TeX| and code to be compiled by the compiler. If you wish to hide code from the compiler, but not from |lhs2TeX|, you can flip the @>@ characters around. % \input{HelloWorldBirdSpecInput}% % There is no change in the output of |lhs2TeX| (with the exception of code extraction through the \textbf{code} and \textbf{newcode} styles). \paragraph{\bf \LaTeX-style code blocks} % The \LaTeX-style of literate programming is to surround code blocks with @\begin{code}@ and @\end{code}@. % \input{HelloWorldCodeInput}% % These lines will be treated by |lhs2TeX| (and a Haskell compiler) in the same way as lines beginning with @>@. The equivalent to lines beginning with @<@, is to surround the lines with @\begin{spec}@ and @\end{spec}@. % \input{HelloWorldSpecInput}% % Unlike a Haskell compiler, |lhs2TeX| does not care if both styles of literate programming are used in the same file. \emph{But}, if you are using the \textbf{code} and \textbf{newcode} styles to produce Haskell source files, the initial characters @>@ and @<@ will be replaced by spaces, which means that you have to indent @code@ environments in order to create a properly indented Haskell module. \paragraph{\bf Inline verbatim} % Text between two \verb+@+ characters that is not in a code block is considered inline verbatim. If you actually want a \verb+@+ character to appear in the text, it needs to be escaped: \verb+@@+. There is no need to escape \verb+@+'s in code blocks. For example, \verb+@id :: a -> a@+ appears as @id :: a -> a@. \paragraph{\bf Inline code} % Text between two @|@ characters that is not in a code block is considered inline code. Again, @|@ characters that should appear literally outside of code blocks need to be escaped: @||@. For example, \verb+|id :: a -> a|+ appears as |id :: a -> a|. \paragraph{\bf Directives} % A \verb+%+ that is followed by the name of an |lhs2TeX| directive is considered as a \textbf{directive} and may cause |lhs2TeX| to take special actions. Directives are described in detail in Section~\ref{sec:directives}. \paragraph{\bf Special commands} % Some commands are treated specially, such as occurrences of the \TeX\ commands @\eval@, @\perform@, @\verb@ or of the \LaTeX\ environment @verbatim@. % The treatment of the @\eval@ and @\perform@ commands is covered in Section~\ref{sec:call-interp}. % The @\verb@ command and the @verbatim@ environment are intercepted by |lhs2TeX|, however, they will behave as they would without |lhs2TeX|. \paragraph{\bf Everything else} % Everything in the input file that does not fall into one of the above cases is is classified as \textbf{plain text} and will simply pass straight through |lhs2TeX|. %--------------------------------------------------------------------------- \section{Using |lhs2TeX| with style} \label{sec:styles} %--------------------------------------------------------------------------- In this section, we will walk though an example to illustrate how to utilize the styles of |lhs2TeX|. As we noted in Section~\ref{sec:about}, |lhs2TeX| operates in the \textbf{poly} style by default. Appendix~\ref{sec:deprecatedstyles} contains summaries of the more simplistic and deprecated styles: \textbf{verb}, \textbf{tt} and \textbf{math}. For each style, there will also be a short summary. Some of the points listed in the summary are simply defaults for the particular style and can actually be changed. %%% %%% \subsection{Achieving complex layouts with the ``poly'' style} The \textbf{poly} style permits multiple alignments and thus it is possible to construct complex layouts. The style supersedes the \textbf{math} style and lifts the alignment restrictions that the \textbf{math} style has. % We will demonstrate the \textbf{poly} style with the following example as our input to |lhs2TeX|: % \input{ZipPolyIn}% % This results in the following output: % \input{ZipPoly}% % If run in \textbf{poly} style, |lhs2TeX| produces \LaTeX\ code that makes use of the @polytable@ package, a package that has been specifically designed to fit the needs that arise while formatting Haskell code. (If you are interested in the package or think that it might be useful for other purposes, you are welcome to look at the documentation for @polytable@~\cite[also distributed with |lhs2TeX| as @polytable.pdf@ in the @polytable@ directory]{polytable}.) Beyond the advanced alignment options, \textbf{poly} style has all the functionality of its ancestor style. If \textbf{poly} style works for you, you should use it. \paragraph{``poly'' summary} \begin{compactitem} \item all formatting directives are obeyed \item conditionals and includes are handled \item inline verbatim is typeset as verbatim, whereas inline code and code blocks are typeset using a proportional font, using mathematical symbols to represent many Haskell operators. \item alignment can be flexibly specified; complex layouts are possible \item plain text is copied unchanged \end{compactitem} %%% %%% \subsection{Customizing the ``poly'' style} The following example demonstrates that the visual appearance of ``poly'' style is in no way dictated by |lhs2TeX|. There are several possibilities to modify the output by means of formatting directives. Here, we try to mimic the legacy \textbf{tt} style (see Section~\ref{sec:tt-style}) by choosing a typewriter font again and using the same symbols that are default in \textbf{tt} style. % \input{ZipPolyTT}% % The spaces in the code of the source file are \emph{not} preserved---the alignment is generated by the @polytable@ package. This is in contrast to the \textbf{tt} style we are imitating, where the spacing of the output is the spacing of the input. %%% %%% \subsection{Producing code with the ``code'' and ``newcode'' styles} These two styles are not for producing a \LaTeX\ source file, but instead are for producing a Haskell file again. Everything that is not code is thrown away. In addition, the \textbf{newcode} style has a few extra features. It applies formatting directives, which can be used as simple macros on the Haskell source level, and it generates line pragmas for the Haskell compiler that will result in error messages pointing to the original file (before processing with |lhs2TeX|). The plain \textbf{code} style does not have this extra functionality. Again, \textbf{code} is mainly intended for compatibility with old documents. You should use \textbf{newcode} where possible. \paragraph{``code'' summary} \begin{compactitem} \item formatting directives are ignored \item conditionals and includes are handled \item code blocks that are not specifications are copied unchanged \item plain text, inline code, specification code, and inline verbatim are discarded \end{compactitem} \paragraph{``new code'' summary} \begin{compactitem} \item all formatting directives are obeyed \item conditionals and includes are handled \item code blocks that are not specifications are, after applying formatting directives, copied unchanged and prefixed by a line pragma indicating the original source location of the code block \item plain text, inline code, specification code, and inline verbatim are discarded \end{compactitem} %%% %%% %--------------------------------------------------------------------------- \section{Directives} \label{sec:directives} %--------------------------------------------------------------------------- There are a number of directives that are understood by |lhs2TeX|. Some of these are specific to styles, and others are ignored in some styles. Directives can occur on all non-code lines and start with a @%@, the \TeX\ comment character, immediately followed by the name of the directive, plus a list of potential arguments. While |lhs2TeX| will remove directives that it has interpreted, it will simply ignore all normal \TeX\ comments that are no directives. Therefore, if a directive is accidentally misspelled, no error message will be raised, in general. Table~\ref{directives} is a complete list of the directives that |lhs2TeX| knows about. % \begin{table} \input{CompleteDirectives}% \caption{All |lhs2TeX| directives}\label{directives} \end{table} % Many of these directive will be explained in more detail in the following sections: \begin{compactitem} \item See Section~\ref{sec:include} for the @%include@ directive. \item See Section~\ref{sec:format} for the @%format@ directive. \item See Section~\ref{subsec:group-directive} for the @%{@ and @%}@ directives. \item See Section~\ref{subsec:poly-alignment} for the @%separation@ and @%latency@ directives. \item See Section~\ref{sec:variables} for the @%let@ directive. \item See Section~\ref{sec:conditionals} for the @%if@, @%elif@, @%else@ and @%endif@ directives. \item See Section~\ref{sec:call-interp} for the @%options@ directive. \item See Section~\ref{sec:subst} for the @%subst@ directive. \end{compactitem} %--------------------------------------------------------------------------- \section{Including files} \label{sec:include} %--------------------------------------------------------------------------- Other files can be included by |lhs2TeX|; this is what the @%include@ directive is for: % \input{IncludeSyntax}% % The specified file is searched for in the |lhs2TeX| source path, which can be modified using environment variables or the @-P@ command line option (see also page~\pageref{defaultsearchpath}). % The include directive causes the indicated file to be read and processed, exactly as if its contents had been inserted in the current file at that point. It is the |lhs2TeX| equivalent of the \TeX\ command @\input@. % The include mechanism of |lhs2TeX| is entirely independent of \TeX\ or Haskell includes/imports. \begin{important}[Warning] Although relative and absolute pathnames can be specified as part of a filename in an @%include@ directive, the use of this feature is strongly discouraged. Set the search path using the @-P@ command line option to detect files to include. \end{important} If the @-v@ command line flag is set, |lhs2TeX| will print the paths of the files it is reading on screen while processing a file. %%% %%% \subsection{The |lhs2TeX| ``prelude''} Several aspects of the behaviour of |lhs2TeX| are not hardcoded, but configurable via directives. As a consequence, a minimal amount of functionality has to be defined for |lhs2TeX| to be able to operate normally. Essential definitions are collected in the file @polycode.fmt@. You should include this file at the start of your document: % \input{PolyPrelude} % This is the appropriate prelude to use for the default \textbf{poly} style and the \textbf{newcode} style. If you intend to use one of the other styles, you should instead include the file @lhs2TeX.fmt@. % \input{IncludePrelude}% % The reason for this is that some of the defaults in @lhs2TeX.fmt@ are sub-optimal for the \textbf{poly} or \textbf{newcode} styles; the @polycode.fmt@ prelude file has been tailored specifically for them. One of the two files @lhs2TeX.fmt@ or @polycode.fmt@ should be included---directly or indirectly---in every file to be processed by |lhs2TeX|! % \begin{important}[Note to users of previous versions] There used to be a file @lhs2TeX.sty@ that also contained a part of the prelude declarations. This file still exists for compatibility reasons, but it is now deprecated; it should \emph{not} be included in any of your documents anymore. \end{important} % It is perfectly possible to design your own libraries that replace or extend these basic files and to include these libraries instead. It is not recommended, though, to edit @polycode.fmt@ or@lhs2TeX.fmt@ files directly. If you are not satisfied with some of the default definitions, create your own file to redefine selected parts. This way, if |lhs2TeX| is updated, you will still be able to benefit from improvements and changes in the `prelude' files. It is possible to use |lhs2TeX| in a setup where a \TeX\ document is split into several files. In this case, each of the files will be processed separately by |lhs2TeX|, so you should must include @polycode.fmt@ (or @lhs2TeX.fmt@) in every single source file. \begin{important}[Warning] Note that both @polycode.fmt@ and @lhs2TeX.fmt@ contain |lhs2TeX| directives, and therefore \emph{cannot} be included using \TeX\ or \LaTeX\ include mechanisms such as @\input@ or @\usepackage@. \end{important} %%% %%% % End of introduction part -- begin of reference %%% %%% %%% %%% %%% %%% %--------------------------------------------------------------------------- \section{Formatting} \label{sec:format} %--------------------------------------------------------------------------- The @%format@ directive is a powerful tool for transforming the source file. The complete syntax that is supported by |lhs2TeX| is quite complex, but we will break it down by looking in detail at many different use cases. % \input{FormatSyntax}% % There are three different forms of the formatting statement. The first can be used to change the appearance of most functions and operators and a few other symbols (cf. Section~\ref{subsec:format-single}). The second form is restricted to named identifiers (both qualified and unqualified, but no symbolic operators); in turn, such formatting directives can be parametrized (cf. Section~\ref{subsec:format-param}). Finally, the third form provides a syntactically lightweight way of formatting certain identifiers using some heuristics (cf. Section~\ref{subsec:format-implicit}). Let us begin by looking at the first form. %%% %%% \subsection{Formatting single tokens} \label{subsec:format-single} The most important use for @%format@ is to assign a symbol to an identifier or an operator. The input % \input{FormatGreekIn}% % produces output similar to the following: % \input{FormatGreekOut}% % The occurrences of @alpha@ within the Haskell code portions of the input file are replaced by the \TeX\ command @\alpha@ and thus appear as ``$\alpha$'' in the output. A lot of formatting directives for frequently used identifiers or operators are already defined in the |lhs2TeX| prelude. For instance, @++@ is formatted as ``|++|'', @undefined@ is formatted as ``|undefined|'', and @not@ is formatted as ``|not|''. If you look at @lhs2TeX.fmt@, you will find the following directives that do the job: % \input{FormatIdentifierExamples}% % Here, @\plus@ refers to a \LaTeX\ macro defined in the lhs2\TeX\ prelude: % \input{PlusDefinition}% % If you are not satisfied with any of the default definitions, just redefine them (by overriding, not replacing them). A @%format@ directive scopes over the rest of the input, and if multiple directives for the same token are defined, the last one is used. Thus, after % \input{FormatIdentifierRedefs}% %{ %format ++ = "\mathbin{\mathbf{+}}" %format undefined = "\Varid{undefined}" %format not = "!" you get ``|++|'', ``|undefined|'', and ``|not|'', respectively. Note that @\Varid@ is a macro defined in the lhs2\TeX\ prelude that can be used to typeset identifier names. It is predefined to be the same as @\mathit@, but can be changed. Do not use identifier names in \TeX\ replacements directly. For instance, % \input{FormatIdentifierWrong}% %{ %format undefined = "undefined" will cause @undefined@ to be typeset as ``|undefined|'', which looks by far less nice than %} ``|undefined|''. %} It is also possible to define a symbol for infix uses of a function. The file @lhs2TeX.fmt@ contains: % \input{FormatElem}% % This causes @2 `elem` [1,2]@ to be typeset as ``|2 `elem` [1,2]|'', whereas @elem 2 [1,2]@ will still be typeset as ``|elem 2 [1,2]|''. %%% %%% \subsection{Nested formatting} The right hand sides of formatting directives are not restricted to (\TeX-)strings. They can in fact be sequences of such strings or other tokens, separated by space. Such other tokens will be replaced by their formatting again. For example, if you have already defined a specific formatting % \input{FormatArrow}% %format ~> = "\leadsto " then you can later reuse that formatting while defining variants: % \input{FormatArrow2}% %format ~>* = ~> "^{" * "}" As you can see, in this definition we reuse both the current formatting for @~>@ and for @*@. We now get ``|~>*|'' for @~>*@, but should we decide to define % \input{FormatStar}% %format * = "\star " later, we then also get ``|~>*|''. Of course, you can use the same mechanism for non-symbolic identifiers: % \input{FormatId}% %{ %format new = "\mathbf{new}" %format text0 = text %format text_new = text "_{" new "}" will cause @text0@ to be typeset as ``|text0|'', and @text_new@ will appear as ``|text_new|''. %} \begin{important}[Warning] There is no check for recursion in the formatting directives. Formatting directives are expanded on-demand, therefore a directive such as % \input{FormatRecurse}% % will not produce ``$\mathsf{text}$'' for @text@, but rather cause an infinite loop in |lhs2TeX| once used. \end{important} %%% %%% \subsection{Parametrized formatting directives} \label{subsec:format-param} Formatting directives can be parametrized. The parameters may occur one or more times on the right hand side. This form of the format directive is only available for alphanumeric identifiers. For example, the input % \input{CardIn}% % produces output similar to % \begin{colorsurround} \input{Card} \end{colorsurround} % If the function is used with too few arguments as in the text, a default symbol is substituted (usually a @\cdot@, but that is customizable, cf. Section~\ref{sec:subst}). %%% %%% \subsection{(No) nesting with parametrized directives} You cannot use a parametrized directive on the right hand side of another directive. In summary, the right-hand sides of formatting directives are processed as follows: % \begin{compactitem} \item A string, enclosed in @"@, will be reproduced literally (without the quotes). \item A name, if it is the name of a parameter, will be replaced by the actual (formatted) argument. \item A name, if it is the name of a non-parametrized formatting directive, will be replaced by that directive's replacement. \item Any other name will be replaced by its standard formatting. \end{compactitem} % Note that the spaces between the tokens do not occur in the output. If you want spaces, insert them explicitly with quotes. %%% %%% \subsection{Parentheses} Sometimes, due to formatting an identifier as a symbol, parentheses around arguments, or the entire function, become unnecessary. Therefore, |lhs2TeX| can be instructed to drop parentheses around an argument by enclosing the argument on the left hand side of the directive in parentheses. Parentheses around the entire function are dropped if the entire left hand side of the directive is enclosed in parentheses. Let us look at another example: % \input{ParensExampleIn}% % The above input produces the following output: % \begin{colorsurround} \input{ParensExample} \end{colorsurround} % In the first line there are no parentheses to drop. In the second line, the parentheses around the arguments @a@ and @b@ are dropped, as are the parentheses around the function @ptest@. In the third line, the source has double parentheses around each argument as well as the function. One set of parentheses are dropped in each case, except for the @b@ argument. Note that in this example, a special purpose operator, @^^@, is used to facilitate the insertion of spaces on the right hand side of a formatting directive. You can read more about influencing spacing using formatting directives in Section~\ref{spacing}. Let us consider another example involving parentheses with the following input: % \input{ParensExample2In}% % This results in % \begin{colorsurround} \input{ParensExample2} \end{colorsurround} % In the second format directive we have redefined the eval function to drop the redundant parentheses. %%% %%% \subsection{Local formatting directives} \label{subsec:group-directive} Usually, formatting directives scope over the rest of the input. If that is not desired, formatting directives can be placed into \textbf{groups}. Groups look as follows: % \input{GroupSyntax}% % Formatting directives that are defined in a group only scope over the remainder of that group. Groups can also be nested. (Groups in |lhs2TeX| do not interact with \TeX\ groups, so these different kinds of groups do not have to occur properly nested.) Let us demonstrate the effect of groups with the following example input: % \input{GroupExampleIn}% % This is appears as: % \begin{colorsurround} \input{GroupExample}% \end{colorsurround} % On the first line, the string ``one'' has been formatted in italics as |lhs2TeX| has treated it, by default, as a Haskell identifier. On the second line of output, the first format directive from the source file has come into effect, so ``one'' has been rendered as a numeral in a sans-serif font. On the third line, the corresponding source is inside the group and second formatting directive is in effect. Thus, ``one'' has been rendered in a sans-serif font. Finally, on the fourth line, the group has closed, along with the scope of the second format directive. The original format directive applies again (as its scope extends to the end of the source file), thus, ``one'' has again been rendered as a numeral in a sans-serif font. %%% %%% \subsection{Implicit formatting} \label{subsec:format-implicit} The third syntactic form of the formatting directive, which lacks a right hand side, can be used to easily format a frequently occurring special case, where a token is to be given a numeric subscript, or is primed. % Only a variable (or constructor) name that ends in a number or a prime @'@ can be used in an implicit formatting statement. The prefix will then be formatted as determined by the formatting directives in the input so far. The number will be added as an index, the prime character as itself. Let us demonstrate implicit formatting with the follow input: % \input{ImplicitIn}% % The corresponding output is: % \begin{colorsurround} \input{Implicit}% \end{colorsurround} Another form of implicit formatting only takes place only if the token to be formatted does not end in primes, and only if digits at the end are immediately preceded by an underscore. The reason for these conditions is compatibility. If the conditions are met, then the token is split at underscores, and the part to the right of an underscore is typeset as subscript to the part on the left, recursively. Again, let us look at an example: % \input{ImplicitUnderscoreIn}% % And its output: % \begin{colorsurround} \input{ImplicitUnderscore}% \end{colorsurround} %%% %%% \subsection{Formatting behaviour in different styles} \begin{compactitem} \item Formatting directives are applied in \textbf{math}, \textbf{poly}, and \textbf{newcode} styles. \item In \textbf{tt} style, only non-parametrized directives apply. \item In \textbf{verb} and \textbf{code} styles, formatting directives are ignored. \end{compactitem} % A document can be prepared for processing in different styles using conditionals (cf.~Section~\ref{sec:conditionals}). %%% %%% %--------------------------------------------------------------------------- \section{Alignment in ``poly'' style} %--------------------------------------------------------------------------- While the ability to transform the appearance of the source file is probably the most important feature of |lhs2TeX|, certainly the next most important is the ability to maintain alignment of code elements, while using a proportional font. Using this feature is relatively simple: % \begin{compactitem} \item Alignment is computed per code block. \item All tokens that start on the same column and are preceded by at least \textbf{2} spaces will appear beginning from the same vertical axis in the output. \end{compactitem} % Using these simple rules, (almost) everything is possible, but it is very important to verify the results and watch out for accidental alignments (i.e.~tokens that get aligned unintentionally). %%% %%% \subsection{An example} The following example shows some of the potential. This is the input: % \input{RepAlgIn}% % Look at the highlighted (gray) tokens. The @lt@ will not appear aligned with the two equality symbols, because it is preceded by only one space. Similarly, the @m@ in the first line after the @Leaf@ constructor will not be aligned with the declarations and the body of the let-statement, because it is preceded by only one space. Note furthermore that the equality symbols for the main functions @rep_alg@ and @replace_min'@ are surrounded by two spaces on both sides, also on the right. This causes the comma and the closing parenthesis to be aligned correctly. % The output looks as follows: % \input{RepAlg}% %%% %%% \subsection{Accidental alignment} The main danger of the alignment heuristic is that it may result in some tokens being aligned unintentionally. The following example contains illustrates this possibility: % \input{AccidentalIn}% % The gray tokens will be unintentionally aligned because they start on the same column, with two or more preceding spaces each. The output looks as follows: % \input{Accidental}% % The ``|::|'' and the ``|=|'' have been aligned with the declarations of the where-clause. This results in too much space between the two |options| tokens and the symbols. Another problems is that in this case the \emph{centering} of the two symbols is destroyed by the alignment (cf. Section~\ref{centering}). As a result, ``|::|'' and ``|=|'' appear left-aligned, but not cleanly, because \TeX\ inserts a different amount of whitespace around the two symbols. The solution to all this is surprisingly simple: just insert extra spaces in the input to ensure that unrelated tokens start on different columns: % \input{AccidentalCIn}% % This produces the correct output: \input{AccidentalC}% %%% %%% \subsection{The full story} \label{subsec:poly-alignment} If you want to customize the alignment behaviour further, you can. Here is exactly what happens: % \begin{compactitem} \item Alignment is computed per code block. \item Per code block there are a number of \textbf{alignment columns}. \item If a token starts in column |n| and is prefixed by at least ``\emph{separation}'' spaces, then |n| is an \textbf{alignment column} for the code block. \item If a token starts in an alignment column |n| and is prefixed by at least ``\emph{latency}'' spaces, then the token is \textbf{aligned} at column |n|. \item All tokens that are aligned at a specific column will appear aligned (i.e. at the same horizontal position) in the output. \end{compactitem} % Both latency and separation can be modified by means of associated directives: % \input{SepLatSyntax}% % It can occasionally be useful to increase the default settings of 2 and 2 for large code blocks where accidental alignments can become very likely! It does not really make sense to set latency to a value that is strictly smaller than the separation, but you can do so---there are no checks that the specified settings are sensible. %%% %%% \subsection{Indentation in ``poly'' style} Sometimes, |lhs2TeX| will insert additional space at the beginning of a line to reflect indentation. The rule is as follows. If a line is indented in column |n|, then the \emph{previous} code line is taken into account: % \begin{compactitem} \item If there is an aligned token at column |n| in the previous line, then the indented line will be aligned normally. \item Otherwise, the line will be indented with respect to the first aligned token in the previous line to the left of column |n|. \end{compactitem} The first example demonstrates the first case: % \input{Indent1In}% % In this example, there is an aligned token in the previous line at the same column, so everything is normal. The two highlighted parentheses are aligned, causing the second line to be effectively indented: % \input{Indent1}% % The next example demonstrates the second case. It is the same example, with one space before the two previously aligned parentheses removed: % \input{Indent2In}% % Here, there is no aligned token in the previous line at the same column. Therefore, the third line is indented with respect to the first aligned token in the previous line to the left of that column, which in this case happens to be the @xs@: % \input{Indent2}% % Sometimes, this behaviour might not match the intention of the user, especially in cases as above, where there really starts a token at the same position in the previous line, but is not preceded by enough spaces. Always verify the output if the result looks as desired. The amount of space that is inserted can be modified. A call to the \TeX\ control sequence @\hsindent@ is inserted at the appropriate position in the output, which gets as argument the column difference in the source between the token that is indented, and the base token. In the situation of the above example, the call is @\hsindent{12}@. The default definition in the lhs2\TeX\ prelude ignores the argument and inserts a fixed amount of space: % \input{HsIndent}% Here is another example that shows indentation in action, the Haskell standard function |scanr1| written using only basic pattern matching: % \input{Indent2aIn}% % And the associated output: % \input{Indent2a}% % The third line, which begins with |x:xs|, is an indented line, but it does not start at an alignment column from the previous line. Thus, the second rule applies and it is indented relative to the first aligned token to the left in the previous line, which is |case|. The same explanation applies for the pattern |[]|. The indentation of the line beginning with |_| is an example of the first rule. It is indented so as to be aligned with the token |[]|. %%% %%% \subsection{Interaction between alignment and indentation} In rare cases, the indentation heuristic can lead to surprising results. This is an example: \input{Indent3In}% And its output: \input{Indent3}% Here, the large amount of space between |test| and |1| might be surprising. However, the |1| is aligned with the |2|, but |2| is also indented with respect to |bar|, so everything is according to the rules. The ``solution'' is to verify if both the alignment between |1| and |2| and the indentation of the |2| are intended, and to remove or add spaces accordingly. %%% %%% \subsection{Interaction between alignment and formatting} If a token at a specific column is typeset according to a formatting directive, then the first token of the replacement text inherits the column position of the original token. The other tokens of the replacement text will never be aligned. Actual arguments of parametrized formatting directives keep the column positions they have in the input. %%% %%% \subsection{Centered and right-aligned columns}\label{centering} Under certain circumstances |lhs2TeX| decides to typeset a column centered instead of left-aligned. This happens if the following two conditions hold: \begin{compactitem} \item There is \emph{at most one} token per line that is associated with the column. \item \emph{At least one} of the tokens associated with the column is a symbol. \end{compactitem} In most cases, this matches the intention. If it does not, there still might be the possibility to trick |lhs2TeX| to do the right thing: \begin{compactitem} \item Change the alignment behaviour of the column using @\aligncolumn@ (see below). \item If the column is centered but should not be, add extra tokens that are formatted as nothing that will be associated with the column (see also Section~\ref{spacing} about spacing). \item If the column should be centered but is left-aligned, it is sometimes possible to use a symbol instead of an alphanumeric identifier, and add a formatting directive for that newly introduced symbol. \end{compactitem} The syntax of the @\aligncolumn@ command is: \input{AlignColumnSyntax}% % The above file also contains some additional documentation. TODO: ADD EXAMPLE!! %%% %%% \subsection{Saving and restoring column information} It is possible to share alignment information between different code blocks. This can be desirable, especially when one wants to interleave the definition of a single function with longer comments. This feature is implemented on the \TeX\ level (the commands are defined in the lhs2\TeX\ prelude). Here is an example of its use: \input{SaveRestoreIn}% As output we get: \begin{colorsurround} \input{SaveRestore} \end{colorsurround} Compare this to the output that would be generated without the @\savecolumns@ and @\restorecolumns@ commands: \begin{colorsurround} \input{SaveRestoreNo} \end{colorsurround} \begin{important} If this feature is used, it may require several runs of \LaTeX\ until all code blocks are correctly aligned. Watch out for warnings of the @polytable@ package that tell you to rerun \LaTeX! \end{important} %--------------------------------------------------------------------------- \section{Defining variables} \label{sec:variables} %--------------------------------------------------------------------------- One can define or define flags (or variables) by means of the @%let@ directive. \input{LetSyntax}% Expressions are built from booleans (either @True@ or @False@), numerals (integers, but also decimal numbers) and previously defined variables using some fixed set of builtin operators. The expression will be evaluated completely at the time the @%let@ directive is processed. If an error occurs during evaluation, |lhs2TeX| will fail. Variables can also be passed to |lhs2TeX| from the operating system level by using the @-l@ or @-s@ command line options. The main use of variables is in conditionals (cf.~Section~\ref{sec:conditionals}). At the moment, there is no way to directly use the value of a variable in a @%format@ directive. %%% %%% \subsection{Predefined variables} In every run of |lhs2TeX|, the version of |lhs2TeX| is available as a numerical value in the predefined variable @version@. Similarly, the current style is available as an integer in the predefined variable @style@. There also are integer variables @verb@, @tt@, @math@, @poly@, @code@, and @newcode@ predefined that can be used to test @style@. It is thus possible to write documents in a way that they can be processed beautifully in different styles, or to make safe use of new |lhs2TeX| features by checking its version first. %%% %%% %--------------------------------------------------------------------------- \section{Conditionals} \label{sec:conditionals} %--------------------------------------------------------------------------- Boolean expressions can be used in conditionals. The syntax of an |lhs2TeX| conditional is \input{IfSyntax}% where the @%elif@ and @%else@ directives are optional. There may be arbitrarily many @%elif@ directives. When an @%if@ directive is encountered, the expression is evaluated, and depending on the result of the evaluation of the expression, only the then or only the else part of the conditional is processed by |lhs2TeX|, the other part is ignored. %%% %%% \subsection{Uses of conditionals} These are some of the most common uses of conditionals: \begin{compactitem} \item One can have different versions of one paper in one (set of) source file(s). Depending on a flag, |lhs2TeX| can produce either the one or the other. Because the flag can be defined via a command line option (cf.~Section~\ref{sec:variables}), no modification of the source is necessary to switch versions. \item Code that is needed to make the Haskell program work but that should not appear in the formatted article (module headers, auxiliary definitions), can be enclosed between @%if False@ and @%endif@ directives. \item Alternatively, if Haskell code has to be annotated for |lhs2TeX| to produce aesthetically pleasing output, one can define different formatting directives for the annotation depending on style (\textbf{poly} or \textbf{newcode}). Both code and \TeX\ file can then still be produced from a common source! Section~\ref{generichaskell} contains an example that puts this technique to use. \end{compactitem} The lhs2\TeX\ library files use conditionals to include different directives depending on the style selected, but they also use conditionals to provide additional or modified behaviour if some flags are set. These flags are @underlineKeywords@, @spacePreserving@, @meta@ (activate a number of additional formatting directives), @array@ (use @array@ environment instead of @tabular@ to format code blocks in \textbf{math} style; use @parray@ instead of @pboxed@ in \textbf{poly} style), @latex209@ (adapt for use with \LaTeX\ 2.09 (not supported anymore)), @euler@, and @standardsymbols@. %TODO: document the purpose of these flags better. It is likely that these flags will be replaced by a selection of library files that can be selectively included in documents in future versions of |lhs2TeX|. %%% %%% %--------------------------------------------------------------------------- \section{Typesetting code beyond Haskell} %--------------------------------------------------------------------------- \subsection{Spacing}\label{spacing} There is no full Haskell parser in |lhs2TeX|. Instead, the input code is only lexed and subsequently parsed by an extremely simplified parser. The main purpose of the parser is to allow a simple heuristic where to insert spaces into the output while in \textbf{math} or \textbf{poly} style. The disadvantage is that in rare cases, this default spacing produces unsatisfying results. However, there is also a big advantage: dialects of Haskell can be processed by |lhs2TeX|, too. In theory, even completely different languages can be handled. The more difference between Haskell and the actual input language, the more tweaking is probably necessary to get the desired result. An easy trick to modify the behaviour of |lhs2TeX| is to insert ``dummy'' operators that do not directly correspond to constructs in the input language, but rather provide hints to |lhs2TeX| on how to format something. For instance, spacing can be guided completely by the following two formatting directives: \input{SpacingOps}% Use @^@ everywhere where \emph{no} space is desired, but the automatic spacing of |lhs2TeX| would usually place one. Conversely, use @^^@ everywhere where a space \emph{is} desired, but |lhs2TeX| does usually not place one. As described in Section~\ref{sec:conditionals}, one can use conditionals to format such annotated input code in both \textbf{poly} (or \textbf{math}) and \text{newcode} style to generate both typeset document and code with annotation remove from a single source file. For this to work correctly, one would define \input{SpacingOpsCond}% as an extended version of the above. This instructs |lhs2TeX| to ignore @^@ and replace @^^@ by a single space while in \textbf{newcode} style, and to adjust spacing in other styles, as before. The examples in the following subsections show these directives in use. %%% %%% \subsection{Inline \TeX} Another possibility that can help to trick |lhs2TeX| into doing things it normally doesn't want to is to insert inline \TeX\ code directly into the code block by using a special form of Haskell comment: \input{InlineTeXSyntax}% % The above file also contains some additional documentation. The advantage of this construct over a dummy operator is that if the input language is indeed Haskell, one does not need to sacrifice the syntactic validity of the source program for nice formatting. On the other hand, inline \TeX\ tends to be more verbose than an annotation using a formatting directive. %%% %%% \subsection{{\smaller AG} code example} Here is an example that shows how one can typeset code of the Utrecht University Attribute Grammar ({\smaller UUAG}) (\cite{uuag}) system, which is based on Haskell, but adds additional syntactic constructs. The input \input{AGExampleIn}% produces the following output: \input{AGExample} %%% %%% \subsection{Generic Haskell example}\label{generichaskell} Another example of a Haskell variant that can be typeset using |lhs2TeX| using some annotations is Generic Haskell~\cite{gh}. This is a possible input file, including the directives necessary to be able to process it in both \textbf{newcode} and \textbf{poly} style. \input{GHExampleIn}% Processed in \textbf{poly} style, the output looks as follows: \input{GHExample}% %%% %%% \subsection{Calculation example} The following example shows a calculational proof. The input \input{CalcExampleIn}% produces \input{CalcExample}% %%% %%% %--------------------------------------------------------------------------- \section{Calling @hugs@ or @ghci@} \label{sec:call-interp} %--------------------------------------------------------------------------- It is possible to call @ghci@ or @hugs@ using the @%options@ directive. In all but the two \textbf{code} styles, |lhs2TeX| looks for calls to the \textbf{\TeX\ commands} @\eval@ and @\perform@ and feeds their arguments to the Haskell interpreter selected. The current input file will be the active module. This has a couple of consequences: on the positive side, values defined in the current source file may be used in the expressions; on the negative side, the feature will only work if the current file is accepted as legal input by the selected interpreter. If the command line in the @%options@ directive starts with @ghci@, then |lhs2TeX| assumes that @ghci@ is called; otherwise, it assumes that @hugs@ is called. Depending on the interpreter, |lhs2TeX| will use some heuristics to extract the answer from the output of the interpreter. After this extraction, the result will either be printed as inline verbatim (for a @\perform@) or as inline code (for @\eval@), to which formatting directives apply. \begin{important}[Warning] This feature is somewhat fragile: different versions of @ghci@ and @hugs@ show different behaviour, and the extraction heuristics can sometimes fail. Do not expect too much from this feature. \end{important} %%% %%% \subsection{Calling @ghci@ -- example} The following input shows an example of how to call @ghci@: \input{InteractiveGhciIn}% The options are necessary to make @ghci@ accept and print the @forall@ keyword (it only serves as an example here how to pass options to the interpreter). The output will look similar to this: \begin{colorsurround} \input{InteractiveGhci} \end{colorsurround} Note that it is possible to pass interpreter commands such as @:t@ to the external program. %(ADAPT EXAMPLE TO SHOW THIS:) %Note furthermore the difference %in output between an @\eval@ and a @\perform@ command. %%% %%% \subsection{Calling @hugs@ -- example} The same could be achieved using @hugs@ instead of @ghci@. For this simple example, the output is almost indistinguishable, only that @hugs@ usually does not print type signatures using explicit quantification and tends to use different variable names. \input{InteractiveHugsIn}% The input is the same except for the changed @%options@ directive. The output now looks as follows: \begin{colorsurround} \input{InteractiveHugs} \end{colorsurround} %%% %%% \subsection{Using a preprocessor} The situation is more difficult if the current |lhs2TeX| source file is not valid input to the interpreter, because annotations were needed to format some Haskell extensions satisfactory. The following input file makes use of Template Haskell, and uses the formatting directives for both \textbf{newcode} and \textbf{poly} style. The @%options@ directive instructs @ghci@ to use |lhs2TeX| itself as the literate preprocessor, using the @-pgmL@ option of @ghci@. The |lhs2TeX| binary itself acts as a suitable literate preprocessor if the @--pre@ command line option is passed, which is achieved using the @-optL--pre@ option: \input{InteractivePreIn}% This is the corresponding output: \begin{colorsurround} \input{InteractivePre} \end{colorsurround} %--------------------------------------------------------------------------- \section{Advanced customization} \label{sec:subst} %--------------------------------------------------------------------------- There is one directive that has not yet been described: @%subst@. This directive is used by |lhs2TeX| to customize almost every aspect of its output. The average user will and should not need to use a @%subst@ directive, but if one wants to influence the very nature of the code generated by |lhs2TeX|, the @%subst@ directives provide a way to do it. If one would, for instance, want to generate output for another \TeX\ format such as plain\TeX\ or Con\TeX t, or if one would want to use a different package than @polytable@ to do the alignment on the \TeX\ side, then the @%subst@ directives are a good place to start. The default definitions can be found in @lhs2TeX.fmt@. Table~\ref{substs} shows only a short description of the approximate use of each of the categories. \begin{table} \centering \begin{colorsurround} \begin{tabularx}{\linewidth}{lX} @thinspace@ & how to produce a small quantity of horizontal space \\ @space@ & how to produce a normal horizontal space \\ @newline@ & how to produce a new line inside a code block \\ @verbnl@ & how to produce a new line in |lhs2TeX| generated verbatim \\ @blankline@ & how to translate a blank line in a code block \\ @dummy@ & how to display a missing argument in a formatted function \\ @spaces@ |a| & how to format the whitespace contained in |a| \\ @special@ |a| & how to format the special character |a| \\ @verb@ |a| & how to format the (already translated) inline verbatim text~|a| \\ @verbatim@ |a|& how to format an (already translated) verbatim block |a| \\ @inline@ |a| & how to format (already translated) inline code |a| \\ @code@ |a| & how to format an (already translated) code block |a| \\ @conid@ |a| & how to format an identifier starting with an upper-case character |a| \\ @varid@ |a| & how to format an identifier starting with a lower-case character |a| \\ @consym@ |a| & how to format a constructor symbol |a| \\ @varsym@ |a| & how to format a variable symbol |a| \\ @backquoted@ |a| & how to format a backquoted operator |a| \\ @numeral@ |a| & how to format a numeral |a| \\ @char@ |a| & how to format a character literal |a| \\ @string@ |a| & how to format a literal string |a| \\ @comment@ |a| & how to format an (already translated) one-line comment |a| \\ @nested@ |a| & how to format an (already translated) nested comment |a| \\ @pragma@ |a| & how to format an (already translated) compiler pragma |a| \\ @tex@ |a| & how to format inlines \TeX\ code \\ @keyword@ |a| & how to format the Haskell keyword |a| \\ @column1@ |a| & how to format an (already translated) line |a| in one column in \textbf{math} style \\ @hskip@ |a| & how to produce a horizontal skip of |a| units \\ @phantom@ |a| & how to produce horizontal space of the width of the (already translated) text |a| \\ @column3@ |a| & how to format an (already translated) line |a| in three columns in \textbf{math} style \\ @fromto@ |b e a| & how to format a column starting at label |b|, ending at label |e|, containing the (already translated) code |a| in \textbf{poly} style \\ @column@ |n a| & how to define a column of label |n| with (already processed) format string |a| in \textbf{poly} style \\ @centered@ & the format string to use for a centered column \\ @left@ & the format string to use for a left-aligned column \\ @dummycol@ & the format string to use for the dummy column (a column that does not contain any code; needed due to deficiencies of the @polytable@ implementation) \\ @indent@ |n| & how to produce an indentation (horizontal space) of |n| units \\ \end{tabularx} \end{colorsurround} \caption{A short description of the @%subst@ directives}\label{substs} \end{table} %%% %%% % %--------------------------------------------------------------------------- % \section{Implementation and distribution} % %--------------------------------------------------------------------------- % % \begin{compactitem} % \item |lhs2TeX| is written in Haskell % \item \textbf{poly} style makes use of a specifically written \LaTeX\ package % @polytable@, which is included in the distribution % \item License is {\smaller GPL}. % \item There has not been an official release for a long time, so get the % most recent version from {\smaller CVS} (or subversion soon). % \item It does work on Unix-alikes. It should work on Windows/Cygwin, and % on native Windows with minor modifications -- help welcome. % \item It has been used for several recent papers and seems to be quite stable. % \end{compactitem} % % %%% % %%% % % %--------------------------------------------------------------------------- % \section{Future work} % %--------------------------------------------------------------------------- % % \begin{compactitem} % \item More language independence (customizable lexer). % \item Clean up (and extend) the formatting directives language. % \item Allow directives during code blocks. % \item Add more features to @polytable@ package. % \item \dots % \end{compactitem} % Future development is relatively low priority, though. % If you want it, do it yourself or try to convince me % that it is urgent! \newenvironment{problem}% {\medskip\par\noindent\bfseries\ignorespaces}{\ignorespacesafterend} %%% %%% % \section{History of |lhs2TeX|} % % \begin{compactitem} % \item Ralf Hinze started development in 1997. Most of the hard work has % been done by him! % \item The program is based on @smugweb@ and @pphs@, both of which are % no longer available and I do not know. % \item I picked up development in 2002, and added % the \textbf{poly} and \textbf{newcode} styles. % %\item Future: I consider the \textbf{tt} and \textbf{math} styles as deprecated, % % I want to add more language independence (customizable lexer) and % % extend/improve the formatting language. % \end{compactitem} %--------------------------------------------------------------------------- \section{Pitfalls/FAQ} %--------------------------------------------------------------------------- \begin{problem} The document consists of multiple files. Can |lhs2TeX| be used? \end{problem} One option is to use @%include@ rather than \LaTeX\ commands to include all files in the master file. The other is to process all files that contain code \emph{and} the master file with |lhs2TeX|. All files to be processed with |lhs2TeX| must contain an @%include lhs2TeX.fmt@ (or @%include polycode.fmt@) statement. From version 1.11 on, including @lhs2TeX.sty@ is no longer necessary. \begin{problem} Yes, but the master file should be pure \LaTeX. \end{problem} Create a file @mylhs2tex.lhs@ with just one line, namely @%include lhs2TeX.fmt@. Process that file with |lhs2TeX|, using the options you also use for the other included files. Call the resulting file @mylhs2tex.sty@ and say @\usepackage{mylhs2tex}@ at the beginning of your master file. \begin{problem} The spacing around my code blocks is bad (nonexistent) in ``\textbf{poly}'' style. \end{problem} Add the line @%include polycode.fmt@ to the preamble of your document. \begin{problem} \LaTeX\ complains when using |lhs2TeX| in ``\textbf{poly}'' style with the @beamer@ package. \end{problem} Add the line @%include polycode.fmt@ to the preamble of your document. \begin{problem} \LaTeX\ complains when using |lhs2TeX| in ``\textbf{poly}'' style with the @jfp@ class. \end{problem} Add the line @%include jfpcompat.fmt@ to the preamble of your document. \begin{problem} \LaTeX\ claims that the package @polytable@ (or @lazylist@) cannot be found, or that the version installed on your system is too old. \end{problem} Did you install @polytable.sty@ (or @lazylist.sty@) in your \TeX\ system manually? If you have absolutely no idea how to do this, you may try to copy both @polytable.sty@ and @lazylist.sty@ from the |lhs2TeX| distribution into your working directory. \begin{problem} Haskell strings are displayed without double quotes. \end{problem} This is a result from using an old @lhs2TeX.fmt@ file together with a new version of |lhs2TeX|. Usually, this stems from the fact that there is an old version in the working directory. Now, |lhs2TeX| maintains a search path for included files, thus usually a local old copy of @lhs2TeX.fmt@ can be removed. \begin{problem} In ``math'' style, I have aligned several symbols on one column, but |lhs2TeX| still won't align the code block. \end{problem} Did you set the alignment column correctly using the @%align@ directive? Note also that |lhs2TeX| starts counting columns beginning with |1|, whereas some editors might start counting with |0|. \begin{problem} Large parts of the formatted file look completely garbled. Passages are formatted as code or verbatim, although they are plain text. Conversely, things supposed to be code or verbatim are typeset as text. \end{problem} You probably forgot multiple @|@ or \verb+@+ characters. Because |lhs2TeX| identifies both the beginning and end of inline code or inline verbatim via the same character, one missing delimiter can confuse |lhs2TeX| and cause large passages to be typeset in the wrong way. You should locate the first position in the document where something goes wrong and look for a missing delimiter at the corresponding position in the source file. \begin{problem} \LaTeX\ complains about a ``nested @\fromto@'' in ``poly'' style. \end{problem} This usually is a problem with one of your formatting directives. If you start a \TeX\ group in one of your directives but do not close it, then this error arises. You should not write such unbalanced formatting directives unless you make sure that they do never span an aligned column. %TODO: Write example. \begin{thebibliography}{99} \bibitem{polytable} Andres L\"oh. \emph{The @polytable@ package.} \url{http://ctan.org/tex-archive/macros/latex/contrib/polytable/} \bibitem{lazylist} Alan Jeffrey. \emph{The @lazylist@ package.} \url{http://ctan.org/tex-archive/macros/latex/contrib/lazylist/} \bibitem{uuag} Arthur Baars, S.~Doaitse Swierstra, Andres L\"oh. \emph{The UU AG System User Manual.} \url{http://www.cs.uu.nl/~arthurb/data/AG/AGman.pdf} \bibitem{array} Frank Mittelbach and David Carlisle. \emph{The @array@ package.} \url{http://www.ctan.org/tex-archive/macros/latex/required/tools/array.dtx} \bibitem{gh} Andres L\"oh. \emph{Exploring Generic Haskell.} PhD Thesis, Utrecht University, 2004. \bibitem{hackage} Hackage \url{http://hackage.haskell.org} \bibitem{platform} The Haskell Platform. \url{http://hackage.haskell.org/platform/} \end{thebibliography} \appendix \newpage %--------------------------------------------------------------------------- \section{Deprecated styles} \label{sec:deprecatedstyles} %--------------------------------------------------------------------------- In this Appendix, we will cover the styles that were omitted from Section~\ref{sec:styles}. We will demonstrate them with the same common example. As before, each style will include a short summary. Some of the points listed in the summary are simply defaults for the particular style and can actually be changed. \subsection{Verbatim: ``verb'' style} In \textbf{verb} style, the code shows up in the formatted document exactly as it has been entered, i.e. verbatim. All spaces are preserved, and a non-proportional font is used. \input{Zip}% One does not need |lhs2TeX| to achieve such a result. This style, however, does not make use of an internal \TeX\ verbatim construct. The implementation of verbatim environments in \TeX\ is somewhat restricted, and the preprocessor approach may prove more flexible in some situations. For example, it is easier to apply additional formatting instructions to the output as a whole, such as placing the code in a colored box. \paragraph{Verbatim summary} \begin{compactitem} \item formatting directives are ignored \item conditionals and includes are handled \item inline code, inline verbatim, and code blocks are all typeset completely verbatim, using a typewriter font \item all spaces in code blocks are preserved \item plain text is copied unchanged \end{compactitem} %%% %%% \subsection{Space-preserving formatting with ``tt'' style} \label{sec:tt-style} The \textbf{tt} style is very similar to \textbf{verb} style, but applies a tiny bit of formatting to the code and allows for more customizabilty: \input{ZipTT}% By default, some of the Haskell symbols are expressed more naturally. For instance, special symbols are being used for the arrows or the lambda. In addition, the user can specify additional formatting directives to affect the appearance of certain identifiers. In this way, keywords can be highlighted, user-defined Haskell infix operators can be replaced by more appropriate symbols etc. In this style, the layout and all spaces from the source file are still preserved, and a non-proportional font is used, as in \textbf{verb} style. \paragraph{Typewriter summary} \begin{compactitem} \item non-recursive formatting directives are obeyed \item conditionals and includes are handled \item inline verbatim is typeset as verbatim, whereas inline code and code blocks are typeset almost verbatim, after formatting directives are applied, in a typewriter font using some special symbols to ``beautify'' some Haskell operators. \item all spaces in code blocks are preserved \item plain text is copied unchanged \end{compactitem} %%% %%% \subsection{Proportional vs.~Monospaced} Usually, there is a tradeoff between restricting oneself to the use of a typewriter font and not using any formatting and using a proportional font, at the same time replacing operators with mathematical symbols, using different font shapes to highlight keywords etc. While the latter offers far more flexibility, the proportional font might destroy (at least part of) the layout that the programmer has employed in order to make the source code more readable. Compare, for example, the previous two examples with the following result (this is a negative example, |lhs2TeX| can do far better than that!!): \input{ZipStupid}% \noindent While the indentation is kept (otherwise, for the layout sensitive Haskell it would be even disastrous, because the code might no longer be valid), alignment that has been present in the code lines has been lost. For example, in the input the user had decided to align all equality symbols of all three function definitions, and also align them with the ``has-type'' operator |::|. Without support from a tool like |lhs2TeX|, the horizontal positions of the equality symbols in the formatted code are totally unrelated. A solution to this problem is of course to put the Haskell code in a \LaTeX\ table. Doing this manually, though, is very cumbersome and in some case still quite hard. The task of the formatted styles of |lhs2TeX| is thus to spare the user the burden of cluttering up the code with formatting annotations. Most of the time, completely un-annotated code can be used to achieve good results, using the fonts you like while maintaining alignment information in the code! %%% %%% \subsection{Alignment and formatting with ``math'' style} In prior versions of |lhs2TeX|, \textbf{math} style was the mode to use for formatted Haskell code. There is one alignment column, often used to align the equality symbols of several equations. Additionally, indentation is handled automatically. User-defined formatting directives can be used to alter the formatting of identifiers, operators and symbols in many places. \input{ZipMath}% \noindent The example shows that there is still a loss of alignment information compared to the original verbatim example. The three arguments of the |zipWith| function as well as the two guarded equations in the definition of |select| are not aligned. At the moment, \textbf{math} style exists mainly to maintain compatibility with old documents. New features may be added to \textbf{poly} style only. \paragraph{``math'' summary} \begin{compactitem} \item all formatting directives are obeyed \item conditionals and includes are handled \item inline verbatim is typeset as verbatim, whereas inline code and code blocks are typeset using a proportional font, using mathematical symbols to represent many Haskell operators. \item indentation in code blocks is preserved; furthermore, alignment on a single column is possible \item plain text is copied unchanged \end{compactitem} %%% %%% \end{document} %%% %%% \section{Test} \input{Variable} %%% %%% \end{document} lhs2tex-1.19/doc/CalcExample.lhs0000644000175000017500000000064212507035615017310 0ustar00andresandres00000000000000%include poly.fmt \def\commentbegin{\quad\{\ } \def\commentend{\}} \begin{spec} map (+1) [1,2,3] == {- desugaring of |(:)| -} map (+1) (1 : [2,3]) == {- definition of |map| -} (+1) 1 : map (+1) [2,3] == {- performing the addition on the head -} 2 : map (+1) [2,3] == {- recursive application of |map| -} 2 : [3,4] == {- list syntactic sugar -} [2,3,4] \end{spec} lhs2tex-1.19/doc/HelloWorldInput.lhs0000644000175000017500000000046712507035615020232 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >\documentclass{article} >%include polycode.fmt >\begin{document} >This is the famous ``Hello world'' example, >written in Haskell: >\begin{code} >main :: IO () >main = putStrLn "Hello, world!" >\end{code} >\end{document} \endgroup lhs2tex-1.19/doc/FormatStar.lhs0000644000175000017500000000015112507035615017207 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format * = "\star " \endgroup lhs2tex-1.19/doc/InteractiveHugsIn.lhs0000644000175000017500000000060412507035615020523 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} %if False module InteractiveHugs where %endif %format . = "." %format forall a = "\forall" a \begin{code} %options hugs -98 > fix :: forall a. (a -> a) -> a > fix f = f (fix f) This function is of type \eval{:t fix}, and |take 10 (fix ('x':))| evaluates to \eval{take 10 (fix ('x':))}. \end{code} \endgroup lhs2tex-1.19/doc/tex.fmt0000644000175000017500000003206312507035615015734 0ustar00andresandres00000000000000%subst verb a = "\text{\tt " a "}" %subst verbatim a = "\begin{tabbing}\tt'n" a "'n\end{tabbing}'n" %subst verbnl = "\\'n\tt " %if style == tt %subst inline a = "\text{\texfamily " a "}" %subst thinspace = "\Sp " %subst code a = "\begin{tabbing}\texfamily'n" a "'n\end{tabbing}'n" %subst comment a = "{\rmfamily-{}- " a "}" %subst nested a = "{\rmfamily\enskip\{- " a " -\}\enskip}" %subst pragma a = "{\rmfamily\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %subst spaces a = a %subst special a = a %subst space = "~" %subst newline = "\\'n\texfamily " %subst conid a = "{\itshape " a "}" %subst varid a = a %subst consym a = a %subst varsym a = a %subst numeral a = a %subst char a = "''" a "''" %subst string a = "\char34 " a "\char34 " %if underlineKeywords %subst keyword a = "\uline{" a "}" %else %subst keyword a = "{\bfseries " a "}" %endif %format \ = "\char''10" %format . = "\char''00" %if not spacePreserving %format alpha = "\char''02" %format beta = "\char''03" %format gamma = "\char''11" %format delta = "\char''12" %format pi = "\char''07" %format infty = "\char''16" %format intersect = "\char''22" %format union = "\char''23" %format forall = "\char''24" %format exists = "\char''25" %format not = "\char''05" %format && = "\char''04" %format || = "\char''37" %format <- = "\char''06" %format -> = "\char''31" %format == = "\char''36" %format /= = "\char''32" %format <= = "\char''34" %format >= = "\char''35" %endif %if meta %format M.a = "\ensuremath{a}" %format M.b = "\ensuremath{b}" %format M.c = "\ensuremath{c}" %format M.d = "\ensuremath{d}" %format M.e = "\ensuremath{e}" %format M.f = "\ensuremath{f}" %format M.g = "\ensuremath{g}" %format M.h = "\ensuremath{h}" %format M.i = "\ensuremath{i}" %format M.j = "\ensuremath{j}" %format M.k = "\ensuremath{k}" %format M.l = "\ensuremath{l}" %format M.m = "\ensuremath{m}" %format M.n = "\ensuremath{n}" %format M.o = "\ensuremath{o}" %format M.p = "\ensuremath{p}" %format M.q = "\ensuremath{q}" %format M.r = "\ensuremath{r}" %format M.s = "\ensuremath{s}" %format M.t = "\ensuremath{t}" %format M.u = "\ensuremath{u}" %format M.v = "\ensuremath{v}" %format M.w = "\ensuremath{w}" %format M.x = "\ensuremath{x}" %format M.y = "\ensuremath{y}" %format M.z = "\ensuremath{z}" %format M.A = "\ensuremath{A}" %format M.B = "\ensuremath{B}" %format M.C = "\ensuremath{C}" %format M.D = "\ensuremath{D}" %format M.E = "\ensuremath{E}" %format M.F = "\ensuremath{F}" %format M.G = "\ensuremath{G}" %format M.H = "\ensuremath{H}" %format M.I = "\ensuremath{I}" %format M.J = "\ensuremath{J}" %format M.K = "\ensuremath{K}" %format M.L = "\ensuremath{L}" %format M.M = "\ensuremath{M}" %format M.N = "\ensuremath{N}" %format M.O = "\ensuremath{O}" %format M.P = "\ensuremath{P}" %format M.Q = "\ensuremath{Q}" %format M.R = "\ensuremath{R}" %format M.S = "\ensuremath{S}" %format M.T = "\ensuremath{T}" %format M.U = "\ensuremath{U}" %format M.V = "\ensuremath{V}" %format M.W = "\ensuremath{W}" %format M.X = "\ensuremath{X}" %format M.Y = "\ensuremath{Y}" %format M.Z = "\ensuremath{Z}" %format M.alpha = "\ensuremath{\alpha}" %format M.beta = "\ensuremath{\beta}" %format M.gamma = "\ensuremath{\gamma}" %format M.delta = "\ensuremath{\delta}" %format M.epsilon = "\ensuremath{\epsilon}" %format M.zeta = "\ensuremath{\zeta}" %format M.eta = "\ensuremath{\eta}" %format M.theta = "\ensuremath{\theta}" %format M.iota = "\ensuremath{\iota}" %format M.kappa = "\ensuremath{\kappa}" %format M.lambda = "\ensuremath{\lambda}" %format M.mu = "\ensuremath{\mu}" %format M.nu = "\ensuremath{\nu}" %format M.xi = "\ensuremath{\xi}" %format M.pi = "\ensuremath{\pi}" %format M.rho = "\ensuremath{\rho}" %format M.sigma = "\ensuremath{\sigma}" %format M.tau = "\ensuremath{\tau}" %format M.upsilon = "\ensuremath{\upsilon}" %format M.phi = "\ensuremath{\phi}" %format M.chi = "\ensuremath{\chi}" %format M.psi = "\ensuremath{\psi}" %format M.omega = "\ensuremath{\omega}" %format M.Gamma = "\ensuremath{\Gamma}" %format M.Delta = "\ensuremath{\Delta}" %format M.Theta = "\ensuremath{\Theta}" %format M.Lambda = "\ensuremath{\Lambda}" %format M.Xi = "\ensuremath{\Xi}" %format M.Pi = "\ensuremath{\Pi}" %format M.Sigma = "\ensuremath{\Sigma}" %format M.Upsilon = "\ensuremath{\Upsilon}" %format M.Phi = "\ensuremath{\Phi}" %format M.Psi = "\ensuremath{\Psi}" %format M.Omega = "\ensuremath{\Omega}" %format M.forall = "\ensuremath{\forall}" %format M.exists = "\ensuremath{\exists}" %format M.not = "\ensuremath{\neg}" %format ==> = "\ensuremath{\Longrightarrow}" %format <== = "\ensuremath{\Longleftarrow}" %format /\ = "\ensuremath{\wedge}" %format \/ = "\ensuremath{\vee}" %format M.= = "\ensuremath{=}" %format M./= = "\ensuremath{\neq}" %format M.< = "\ensuremath{<}" %format M.<= = "\ensuremath{\leq}" %format M.>= = "\ensuremath{\geq}" %format M.> = "\ensuremath{>}" %endif %elif style == newcode %subst comment a = "-- " a %subst nested a = "{- " a " -}" %subst code a = a "'n" %subst newline = "'n" %subst dummy = %subst pragma a = "{-# " a " #-}" %subst tex a = %subst numeral a = a %subst keyword a = a %subst spaces a = a %subst special a = a %subst space = " " %subst conid a = a %subst varid a = a %subst consym a = a %subst varsym a = a %subst char a = "''" a "''" %subst string a = "'d" a "'d" %format # = "#" %format $ = "$" %format % = "%" %format & = "&" %elif style == math %subst phantom a = "\phantom{" a "\mbox{}}" %subst comment a = "\mbox{\qquad-{}- " a "}" %subst nested a = "\mbox{\enskip\{- " a " -\}\enskip}" %if array %subst code a = "\[\begin{array}{@{}lcl}'n\hspace{\lwidth}&\hspace{\cwidth}&\\[-10pt]'n" a "'n\end{array}\]" %subst column3 l c r = "{}" l " & " c " & {" r "}" %subst column1 a = "\multicolumn{3}{@{}l}{" a "}" %else %subst code a = "\begin{tabbing}'n\qquad\=\hspace{\lwidth}\=\hspace{\cwidth}\=\+\kill'n" a "'n\end{tabbing}" %subst column3 l c r = "$" l "$ \> \makebox[\cwidth]{$" c "$} \> ${" r "}$" %subst column1 a = "${" a "}$" %endif %subst newline = "\\'n" %subst blankline = "\\[1mm]'n" %let anyMath = True %elif style == poly %subst comment a = "\mbox{\onelinecomment " a "}" %subst nested a = "\mbox{\commentbegin " a " \commentend}" %if array %subst code a = "\['n\begin{parray}\SaveRestoreHook'n" a "\ColumnHook'n\end{parray}'n\]\resethooks'n" %else %subst code a = "\begingroup\par\noindent\advance\leftskip\mathindent\('n\begin{pboxed}\SaveRestoreHook'n" a "\ColumnHook'n\end{pboxed}'n\)\par\noindent\endgroup\resethooks'n" %endif %subst column c a = "\column{" c "}{" a "}'n" %subst fromto b e t = "\fromto{" b "}{" e "}{{}" t "{}}'n" %subst left = "@{}l@{}" %subst centered = "@{}c@{}" %subst dummycol = "@{}l@{}" %subst newline = "\nextline'n" %subst blankline = "\nextline[\blanklineskip]'n" %subst indent n = "\hsindent{" n "}" %let anyMath = True %endif %if anyMath %let autoSpacing = True %subst dummy = "\cdot " %subst inline a = "\ensuremath{" a "}" %subst hskip a = "\hskip" a "em\relax" %subst pragma a = "\mbox{\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %if latex209 %subst numeral a = "{\mathrm " a "}" %subst keyword a = "{\mathbf " a "}" %else %subst numeral a = "\mathrm{" a "}" %subst keyword a = "\mathbf{" a "}" %endif %subst spaces a = a %subst special a = a %subst space = "\;" %subst conid a = "\Conid{" a "}" %subst varid a = "\Varid{" a "}" %subst consym a = "\mathbin{" a "}" %subst varsym a = "\mathbin{" a "}" %subst char a = "\text{\tt ''" a "''}" %subst string a = "\text{\tt \char34 " a "\char34}" %format _ = "\anonymous " %format -> = "\to " %format <- = "\leftarrow " %format => = "\Rightarrow " %format \ = "\lambda " %format | = "\mid " %format { = "\{\mskip1.5mu " %format } = "\mskip1.5mu\}" %format [ = "[\mskip1.5mu " %format ] = "\mskip1.5mu]" %format = = "\mathrel{=}" %format .. = "\mathinner{\ldotp\ldotp}" %format ~ = "\mathord{\sim}" %format @ = "\mathord{@}" %format . = "\mathbin{\circ}" %format !! = "\mathbin{!!}" %format ^ = "\mathbin{\uparrow}" %format ^^ = "\mathbin{\uparrow\uparrow}" %format ** = "\mathbin{**}" %format / = "\mathbin{/}" %format `quot` = "\mathbin{\Varid{`quot`}}" %format `rem` = "\mathbin{\Varid{`rem`}}" %format `div` = "\mathbin{\Varid{`div`}}" %format `mod` = "\mathbin{\Varid{`mod`}}" %format :% = "\mathbin{:\%}" %format % = "\mathbin{\%}" %format : = "\mathbin{:}" %format ++ = "\plus " %format == = "\equiv " %% ODER: format == = "\mathrel{==}" %format /= = "\not\equiv " %% ODER: format /= = "\neq " %format <= = "\leq " %format >= = "\geq " %format `elem` = "\in " %format `notElem` = "\notin " %format && = "\mathrel{\wedge}" %format || = "\mathrel{\vee}" %format >> = "\sequ " %format >>= = "\bind " %format $ = "\mathbin{\$}" %format `seq` = "\mathbin{\Varid{`seq`}}" %format ! = "\mathbin{!}" %format // = "\mathbin{//}" %format undefined = "\bot " %format not = "\neg " %if meta %format M.a = "a" %format M.b = "b" %format M.c = "c" %format M.d = "d" %format M.e = "e" %format M.f = "f" %format M.g = "g" %format M.h = "h" %format M.i = "i" %format M.j = "j" %format M.k = "k" %format M.l = "l" %format M.m = "m" %format M.n = "n" %format M.o = "o" %format M.p = "p" %format M.q = "q" %format M.r = "r" %format M.s = "s" %format M.t = "t" %format M.u = "u" %format M.v = "v" %format M.w = "w" %format M.x = "x" %format M.y = "y" %format M.z = "z" %format M.A = "A" %format M.B = "B" %format M.C = "C" %format M.D = "D" %format M.E = "E" %format M.F = "F" %format M.G = "G" %format M.H = "H" %format M.I = "I" %format M.J = "J" %format M.K = "K" %format M.L = "L" %format M.M = "M" %format M.N = "N" %format M.O = "O" %format M.P = "P" %format M.Q = "Q" %format M.R = "R" %format M.S = "S" %format M.T = "T" %format M.U = "U" %format M.V = "V" %format M.W = "W" %format M.X = "X" %format M.Y = "Y" %format M.Z = "Z" %format M.alpha = "\alpha " %format M.beta = "\beta " %format M.gamma = "\gamma " %format M.delta = "\delta " %format M.epsilon = "\epsilon " %format M.zeta = "\zeta " %format M.eta = "\eta " %format M.theta = "\theta " %format M.iota = "\iota " %format M.kappa = "\kappa " %format M.lambda = "\lambda " %format M.mu = "\mu " %format M.nu = "\nu " %format M.xi = "\xi " %format M.pi = "\pi " %format M.rho = "\rho " %format M.sigma = "\sigma " %format M.tau = "\tau " %format M.upsilon = "\upsilon " %format M.phi = "\phi " %format M.chi = "\chi " %format M.psi = "\psi " %format M.omega = "\omega " %format M.Gamma = "\Gamma " %format M.Delta = "\Delta " %format M.Theta = "\Theta " %format M.Lambda = "\Lambda " %format M.Xi = "\Xi " %format M.Pi = "\Pi " %format M.Sigma = "\Sigma " %format M.Upsilon = "\Upsilon " %format M.Phi = "\Phi " %format M.Psi = "\Psi " %format M.Omega = "\Omega " %format M.forall = "\forall " %format M.exists = "\exists " %format M.not = "\neg " %format ==> = "\enskip\Longrightarrow\enskip " %format <== = "\enskip\Longleftarrow\enskip " %format /\ = "\enskip\mathrel{\wedge}\enskip " %format \/ = "\enskip\mathrel{\vee}\enskip " %format M.= = "=" %format M./= = "\neq " %format M.< = "<" %format M.<= = "\leq " %format M.>= = "\geq " %format M.> = ">" %endif %endif %subst code a = "\begin{colorcode}'n" a "\end{colorcode}\resethooks'n" %subst keyword a = "\keyw{" a "}" %if False %format dir(a) = "\text{\textbf{\%}}{\let\Varid\mathbf " a "}" %else %format dir(a) = "\text{\texttt{\%}}{\let\Varid\mathtt " a "}" %format = = "\mathrel{\text{\texttt{=}}}" %format term(a) = "{\let\Varid\mathtt\let\Conid\mathtt " a "}" \let\keyw=\mathtt %endif %format not = "\Varid{not}" %format ent(a) = "{\langle " a "\rangle}" %format syn(a) = "{" a "}" %format many(a) = "{" a "}^{*}" %format manyp(a) = "{(" a ")}^{*}" %format opt(a) = "{" a "}?" %format string(a) = "\mathopen{\text{\texfamily\char34}}" a "\mathclose{\text{\texfamily\char34}}" %format string' = "\Varid{string}" %format back(a) = "\mathopen{\text{\texfamily`}}" a "\mathclose{\text{\texfamily`}}" %format ( = "\mathopen{\text{\texfamily(}}" %format ) = "\mathclose{\text{\texfamily)}}" %format { = "\mathopen{\text{\texfamily\char''173 }}" %format } = "\mathclose{\text{\texfamily\char''175 }}" %format ^^^ = "\qquad " %format ^^ = "\;" %format ^ = " " %format ::= = "\mathrel{::=}" %format (test (a) (b)) = "-" a "-" b "-" lhs2tex-1.19/doc/IncludeSyntax.lhs0000644000175000017500000000011012507035615017712 0ustar00andresandres00000000000000%include tex.fmt \begin{code} dir(include) ^^ ent(filename) \end{code} lhs2tex-1.19/doc/GroupSyntax.lhs0000644000175000017500000000017312507035615017434 0ustar00andresandres00000000000000%include tex.fmt %format ... = "\dots " %format brop = { %format brcl = } \begin{code} dir(brop) ... dir(brcl) \end{code} lhs2tex-1.19/doc/SepLatSyntax.lhs0000644000175000017500000000014712507035615017531 0ustar00andresandres00000000000000%include tex.fmt \begin{code} dir(separation) ^^ ent(natural) dir(latency) ^^ ent(natural) \end{code} lhs2tex-1.19/doc/AccidentalIn.lhs0000644000175000017500000000153612507035615017453 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" %format \ = "\char''134" %format let = "let" %format in = "in" %format where = "where" %format -> = "->" %format != = "{\origcolor{hcolor}" = "}" %format !:: = "{\origcolor{hcolor}" :: "}" %format ^ = " " %format C = "{\origcolor{hcolor}" %format D = "}" \begingroup \let\origtt=\texfamily \let\small\footnotesize \def\texfamily#1{\origtt} >%format <| = "\lhd " > >> options !:: [String] -> ([Class],[String]) >> options != foldr (<|) ([],[]) >> where C^"-align"^D <| (ds,s: as) = (Dir Align s : ds, as) >> C^('-':'i':s)^D <| (ds, as) = (Dir Include s : ds, as) >> C^('-':'l':s)^D <| (ds, as) = (Dir Let s : ds, as) >> C^s^D <| (ds, as) = ( ds,s : as) \endgroup lhs2tex-1.19/doc/FormatGreekOut.lhs0000644000175000017500000000014612507035615020027 0ustar00andresandres00000000000000%include poly.fmt %format alpha = "\alpha" \begin{code} tan alpha = sin alpha / cos alpha \end{code} lhs2tex-1.19/doc/Guide2.pdf0000644000175000017500000117072512507035615016247 0ustar00andresandres00000000000000%PDF-1.5 % 2 0 obj << /Type /ObjStm /N 100 /First 808 /Length 1277 /Filter /FlateDecode >> stream xڝVMo8W̭ɡHQ"( )XY$Ce"K>~H,@4y|PDa@11M"ğ$HIeHIAR)I,c c$&0$) E5EJPh( DIAE-HhP`, awH: aK&uDO0J8$J $:7)0Q,NC_ ABxbTy% B8'SaS`~;)KLK,>Kir1mCWw~nlgI;[y/lզv))D(vnc=FZlVjc낇_'vj֎VU ڢ`*OY:f?M%w'y}uvm)/H]#1l[/ޝ;r`7c 1EEf= ;E=ݩ4oLa;!G @ugRV4vҏ~K xtE=b=d軫N}Rle7?TPq}^>\Rc 퉹Q LGo,ECKnmwYV8u@`tbi  -f_{#?-lG,CS,[8廯œoyUD'NF s!Ϭ 1$jlnwI˼݌pgCqdY^怔 [f=Ufc_OYB0/E36?GkT.Cwݍ2w/~ty~ڷ6,v6x8{F`M휶)7pUz)ZMrm>{қɽQ^[+䢢:Nۿڼ)Ѓk,Ob,jVe꺬NYlrOofCnnf ՗_ۭC?%p4!UsSrYkڽUrt+v7l4(=# endstream endobj 232 0 obj << /Length 1175 /Filter /FlateDecode >> stream xXrF}Wxzn o8$lm)T%,QFBhگO3 d\f [xԻ8#G@(QIoz1PS7{M:O&ԯ {͖ӟn 72LJ6L3PyhY@FC)̡pN/`@"+*MQZ?':-rD a3q^xgD8[/kهZ$!bu|aw2r;;{<ݫlŸڟ[aԵ5BfJ,f*I3*Z#kx=$6sDBa< dxHgX3C>$b~etQ{̝P!(EzٻOAV$K2O&gEL3.nB xf8k0W.<+D)sE2 B4zr]lS@uD [{%H11MTv]YI9Dﵴ3prx3:A4 "f΄>]ϡ`j(vu2[6ΆwYqoqXj1~Wd[ZbeKhf]kKs[$z6k@of$j G<2n,jxJ'$?e2qN!|cET<6aXax44U2LLA_jMAҳ yCtOW8:0>##5j ]* B}`!i6i:fl⯬}Mg&3:|m9YWGxq`1&sW&R˃4SsMMA endstream endobj 278 0 obj << /Length 1260 /Filter /FlateDecode >> stream xKsF:y?r#޵Tr$u@!QI3$V6` zL==9'pҙSv{ ԑd9(G&38\ao0~/T_d0D$]yƳ$LP*' Xw4$ ):CBs N!$1$V8bm|yulq ~*lho6t#rq>WY{R~Z8Y̢eOIG/ H$cu 2 0okD\yopi(Q0Y0* YTqO1uS3D׃E,^ ,2H贂I{$=ٙMG' ] ^R`:b[tqJ&&O~ԛ[,OΝ).&bj1A0 (uGڕhwTT T?F"vkm2CS?BW;QX?Kvڹ gƾKQe X M@g*26N;-bK,1;z 8 rVͪHE ':4o]4dBWR/DZw>TU endstream endobj 283 0 obj << /Length 2239 /Filter /FlateDecode >> stream xڵY[oF~ϯO5WiE{zAX,4[_r8%Gvϋ58><WL*#U9g(eq\쫻mBdzb]_v~ &)p "9"a(nfxDsdbi[?oMd41ԑey:wن&zy$ i_> IXtŔ EW,U<LP8d\vҬ&7˚Y^a8EgK^n(<5Lpr`u5Ikc/Eb5뼼W=2GܕMLdY?8YV.i>l^\UdM4K KAq]d%M9| cWY3=ڛ2a:dJ˴R8 մť5ǞlovsbdvF%F}_Iݟf[w:_vZ4ޏaz"S+np+BpwW^qGk@-6W%,!iI7@㨈~W{c)QOTgpUdɪgWl 0Rp/f-I .ղZE_ٮo$G^.v V\*ұզFw>/v3M;CAV٦jQS+N/KN!t?< ݜUalxK;qfp'i>X<]< IS!fw@MoU,oA(A +.P:ր%uY*MYl_*$\5!GNyue@G˿1LX|1rC UM}sgD?,*ŌS]8ZT2pCD%vu[4 &1r [?y?`"2&a`>ThT盼Ⱥġ:'ܔ77!vY*f+\ls4H2X"h}' ױ70F̩) >nwO,ٵe3͞2^ dũ0Nز4@bPNN0`s5PBAbGjTAnktB:H%i_6ޗmMκT\a%KւX9z9n i<:/xxbQ5\,Ld[g9ϪMX_뜈JhYk;ܢj'+X:P զZHPh*i_8Bߌ#JCY!.:[i)Hix.f j݌a{M :i38/*SjyO&ŧ쓡(d!CHcpATΓK'`?S7ӔEj ծp j`c >ReMf5l,dB%Iu (+1o/J*O^# Hö"yre+G)qV d+@8d.am%e]FG{8dV \)3([n$Lw+Rflz!ռKW5Ó2ÆNfVH}Ks ru)]Z[Q'$Ylfw.TDRo" z \HȊ.u4~z̐hZg <|W|!#n"s°3xS9]:_.{EA^2^ ,} X+6mS[*>^1o%ّfln0jtk>茵WwnسܻXlt}GSc o_.>'lI;e=\C;F' h*%4Pi^$k(<1_!*&9iH]6A"sL9% II5+M!(C3+i\49,76̱ CV)/lT "`1~xs@| 'u8 p VM AIjPReYV} 7P::vl23ͧSRvB5@u(=D:!8$9I m endstream endobj 292 0 obj << /Length 1846 /Filter /FlateDecode >> stream xڵYKs6WЃ4Să$[ɫC8$9$,qBHZ.H[Vlr `X ]}uuq2I& 1<2lpjZSE/DU3v[%&2ˆ4[(a:\`$ $%ǏY`KQ ΃, 93KG/YoڢD홇huDLK`c KnY1F^&e<޲bl:bտQX;s:卑0@1IǶuy,"Zi % |j7wǗY6%.M0ˎ~6-9[9B9"ea*>ہ/aD~P̢$z[4˃J#0kg>@Ua3wVҴAkmE#ϻ LH@Ԗ'ׅmZ̝ﮩwi}nۺhW޸S[^kN'OIMz`kʦ&i$uN#]wE>_(#_iT7T-WUaM舩4ś.pN A !eg/ NPT;7t2x^T2D aL>AҒa]9Aj8QBBRňt l4EN7 "eԈ6ipڤ#c0Dk;V'1[9wXXNpG9g*prt:Äu9AkH -]U&og@Z7Q4-HlgAR=[ rl2ʁWnl*́U!>z&7GS&)ূ*TD_Rم.W ]tBaQA@X[KTmXwP~ضeI!fUU[S^glT9P2^ˑcİVФz\vJ=|+aq&9.[ #7 U]~HO*7VŭEa4{4 ߮LKTەi_!X9o*z{'1heS./БD`pC&-֘v% F+:rWj+-åTSK @iΩ%+y؏TmW-Wmm)6b?AOV=-P=/fXpЂR'OST (m3YfG^KB`ZWױїCnfƟO sqD!l7z=CP *6L$g̡ s}"=D_Jhp ~zvSe-qYH0l6JOUcQ߽[ݒ7VmbYD tu؏kWq>ཱུoG55h x{԰W%Y^]C [iH9MOJ7&+ʢBpWǿ!d6GD`C!mz6%>Qx]kޒkW\98!!#oS8˨T N",# :,:,P-tXb[|{<u'M hױHg4Ә4)OdO.}2>\Xrm|29Lfڗ/5y[A7D endstream endobj 301 0 obj << /Length 2123 /Filter /FlateDecode >> stream xڵYK6ϯ`rL ^I9vRNIt%Q#V(Rc&ڭmARP_Dlt7]@7?~hbW|0ƈb2\eX0_ n im~iqXf Gjyi[He6o*$0'njp)MfQ0/6- ΑJ.YJf;2"A$# #M#ceYY$^-eZɊ eQ8xH;E<#.wH<!(`7'vu2H[Vݮj"_iGJy58nj>iŦ娄qM9$L(bb]DK^(Mڒb5ZMFM+g da*.)?Kmrrܟ Ð#l3"ڶKYd\W]};-tIcXuƒm(Ѕe6*шUNd KCiڥ.֠ >S\WEQ=4וbj Ws$D2̥yZT\8:⵵86%*ⶑn7[HfE0s{4ۮ}j6i] k_4˝SԞޱ_'yv'{SiOɗЉ+AgB'8&<'/=DcMu(! (&8!Ag\sAaCS\een SW83i9C W?}Zª m#ON1S sAb.vIwa 6l)|V,\UݢHۋ<Ret"nҲ%4bDAUH:9(ôh*5pL-"a a'%iQVe [!"8CAŃ񐺐b/ZcpszƷ[$(Kc !dྻwU/ӓ0^p{{.Sfg_.zNކPH~s ɡ1cdp< 46g_dYqr "F-FzD3#: G>&]NqH#y4>:D ӂ`%OH_" Y/hGI2&ZN(:N{(g,x] 8S"iE³>ߎ(bl9ITy9035TU7_#Mߡ tGz7A:::qSrܕ:4Qce.iω;:[}u THK86H hGˢ[RSyO 2陌S/4aD^[% zg]Z^fA?ۼ.^*"i#Mo Tl#kn B%azV;=hCϴ _<0A`wb]^S@xqשO?;^ !54Woj^3؏ Hަwen!pVpw yİx#AL eZ\!/ TePMIև ߓPvDD:'Nl>LQ/`PϜX~5&d);ik`wսg 6MA>m[8 [ЦNh?2)!;5^OooGWYBja/z\\XE=Xb`'P\UxL:ʲ!"+J J"}'yY endstream endobj 307 0 obj << /Length 2362 /Filter /FlateDecode >> stream xڵZݏ6߿BW \~S*r@IplkBdɑ8P}YQCr4_ H|`~i9s*xvCk4.VS*NT^VC'jǸSW;7{zK'A2mW8IC?h _6¯SMZ=#GQ-mμ3rh %]%LAm/vm~+f>2ϋF['7`!ٛm~"mi9Cu9#RJԬNRϗ%[d8J1q p׬:k/(q&$]GGBxk:{rgka"ntM/=0Lrc9dDXU}Xrݩ1?|/<)%tgndvYْ8)KTܰr0O78H )FohD$~&RN2כIy6*Z3n%)gpձb+seUi'*Yr%X"OVS:$ )$ʄ|@|'M}+/霢 HJ`וpn2 U  iu1"BTb6+kjO}^:oa>ծ;uv5uC<6&?rR0a%JDŽs .7̓%`+Ι0XwHxv0s,LQ $Y )oc^DHB0INJDA?L'+ %[6A`xpH!,$A|)e(K8vX H\C@۲ Sя CHAAD?j޴Dʐc~ JЂa3E!G[@=z BXmtiؼ̚nHP-H('P ;\'?4G( Սg jh,9`64#*oVZU6 zumNFE@OAsCV'r <)=EZ~ C)v"}YN2EH`X?0u%reI.sulԐb3r "~! 0::wxMҮߗ໷p0Wb/W8#WYkPB;4M8#mZB gq81(ʴq/{NN/f3%gѓ3=ݍ`1C 2kiӕ5 $ ӱgJC6z̻D:18q1];fL QWH Ρ%K}Ɖ4H́K=j ^R-Ο-٣DONFO5:R#dNn,QdKhz%(`Ϟڸb쭽2^k/M檸bȇ<o1\K\W^eڦ޾6`= )+zQ>fDC!z% T% ;F_ă6[u5/lMhP9글}i1 iD0)NZv4@Oݚ)ffH:kqx/_ga -K>I xdx0qћ)~oWuKb9COU%w|XfkuXt8oYL^BP 0|M|;i/yLͮg`J3'cV:0M?~JSְɣ)DY:Ӏg઄Sh2xʸz]pRp)\\ysS|)l{Fz _nKh\e/@c)5$+=j] mFk֓O®s pR`mpɨ^G5_aI瑴OSwh!ɓ$v&|W!]7W$ >ϩels7ƲسTIS5%`E~*C洛 6[^2 ~p.ZC.N.D4 endstream endobj 317 0 obj << /Length 2793 /Filter /FlateDecode >> stream xڵk %@Q-pfŧC\R(rkdɵ;á^^N/ɇ]Cr8>JW տ8@GsfRi*Zo~9 X[0gѣۺd*XRѻ\DqB3sha{r*Lch5fcUaOpƨ,ρRr)")~ϥ-?ݮ\> j *L<EQt&jvz+O;#ׄ֌ Z6h!' )6$HA(>$_6îyHv%ti p4 vg+,e|1g&uhƅC(K?6%m;u.cOn,K3a4W+QtA *!qr u@@:nْ#*JpIF0-Npl sGtk6?~Žpv' aL3*zoC45eYB:2 []Y =|+F|$ʌo6^ %5DER!G4*;G"HeɌ8miM h||%kqC/LkOD;q3Z'֎l7DqЕMRM vA1/qtp}:-΂'K4rQ>]O'-PEZ,,04rᗈ-~K>%Z~dqN[fO"gC+(J\0y)9P(Mվ\CaJ>uOQ8$N9OdNF쮅i@)AL7*D` !rr<9(琊rBX]= ,Y#2^pQkCRK- DszWAl =,1}ofmRL*`:$G\v:J;&}u[ׂU0P ˂E.L]sb#UۤС8e`Cwë0݂HVkkQgljhcuQЪg!ιwd XAI^tY·c2J9$kYqC'^v:WP=f`':!dL>%]<C5B9(4|*t.LDNZ {ds2~δ3PgpGR6ӔldbrQƱAIog}e-Y2y*Iͥp5UD5Od@;%֝Rb  ngYi007 m]v޳Sp}\3HR4APF KQ.sq2CTrt'S6;n"7< mcRiPhgOA|e˾E%e>HtMN7Y_ N!$D@$ PKV.@`^OQZ#I`!ˆ:N,1#=)fK7ۖrhi[vSu]׶*$k(RaنR1lW! .r-*"<~JEuߜ!̯H.L8D)= PHD7+lI[s<熾#eSuM!HYٜjr3 }`Z쮁QK #W$)la8ecoh g(+-7=Mbap.̂=)є#MqQ+#M q6z2Ym}X|ЉR}~an)C/);{!J&QzەMQ}ݦՁ:_R> rڃ=' 5X; W *#ufXvvJr_ZK>> stream xڽZ]o\}_$/\EF% ~hk,om!Vm_3\ч?WÙ!K*!4hr 9m!-!W h%hh5Tʫ-42B.MH9YC![#QR?8v9Dh B ^Ni 1e^@Z19Pw4pN1L90Tn-x'Pd-@WQ B /Ewj%S 45c2 15jRky FXb)`R]`,k 5!b}U-4ȁ*c)TaCFBjVjL|Bsۂd LB` :`JnZdU0sTk ]R)>Ûr4'4?Śȭ?)d.bȐ[=a w6[z&Փ'a,} 7^lvx^mEM ?n/7Wg{'o.\o/x|Wfb@ w~绗.ɓMXtfZA 4G?on677O^$&X$];>WX~ry={ٷ2ZےFG[F;! ye+C^{3k~ծ?uYzo_8ۅ'`/X,a'Je}P,x ~$1rF9""Q5ԕa}v]Zn#=Q<4Bբo!Nc )0!"lA,"4%`0Eq) \D"Î evM /bANtZ̠L4%5Z(ath؟,`' X_c'ԃf" PLl63@}F.@txj]tGsz_*y 8=hiR-ѹjqukLIqW+#6w/?=6ǒFEZ2k0Җا`Ӟ. xs4OP䑽?AiX?sO#g\!ypH!ypHrdpRdȓ!O<dȓ!O<t!O<t!O<tȳ!φ<lȳ!x8T?G"AwN!C%cI;֦,@9,eM.rd; (iH4 ,)ԫ>` 4vƚS/1EG[zhQĉDWꑿ$P٣*mroK쳊=+Jֱ!96Q=\>=,Pjw.i_V.ӂEʞ H 'f,:HQ%?5?[4e&~3KV rټrn5qJjܚew[B5Iw^vD-ZzdͻpmoY47"A_b~Q+?;mo[iH>Q5ߛx6ߏV>`_ټ{sͻtfuGm?~p;}x`!]̔" q}`KZ*rϓ\h\ӸUx厕?ýGݛQc0YƖuXj`r`R$P؇ۦO endstream endobj 330 0 obj << /Length 2613 /Filter /FlateDecode >> stream xZYo~оIal6 ;f$1 x(1%2"5ꃗZ< V`0 &x{?ӀO(%q H*&DtrMd6`Sγ/a6ga0MMUdH復SެMYg1^͡f"pX2(ɜ*xfuK{T4&!X!k/ Q!LE*mr^6+SRMu&ۥi4UY1hJLmfjO׳#\0oe0ʌS&GB+@w;܃ujޜPRDI ]|Z I,±嫦74X'ӿQ5@afKbVߙFd zLB0Bl)n5Apegۯzݿ`QXߧo}܂ mC "`ZOt3g)]Lq6Rul`ILy *'B suXCN qg5 E ]b* e[lNX}s.y-.^kc6ҍ0 7z dr!{s#0psІc?X?!~)܆+RIjïZ,]`7㈽&-e*ڡeO7@SvUɮ1Ǫ*cY^:o>ިEe T m3Yakg cñ.;fj5P7UAR f}iH ӌÁ)/8>s*@)*`0ELm-W ]]6ؼ%R2Ϩ4HMge쐛.I؅e:\AH=H"5%IAD۔ߑBU@4r u3)w3 |B[Z[Xn!t?x8Pu ( &|x"º1+kL/$.J7`6QHB)1L[l?DfV}nTٞd0V { .9T!!1K2!?.FTV9yJX%}Kv|,pm#T2ghM|D wtMC;w }H;'G("¥:s)gXY!=A BKSfOY7@%IDZQE7SIXF;u=&5C-` 8X_IXNA 5=o>HP0-zVc0,U sQTܤ >^b}A EsA~X,ή,phf$7{*/_1gtMp@D'04T\_Z{n/xQA`qVoЪj`v lׯe1ޓF}ӝm{Fa ZYݎVG *V;7?_<|D4n:-:Kb6 Liٯi- hbyޯv.΋69_c}Bd yD#_V9׻jߚvAPXY5NW,zt<ݒ-һr+HPGT['i'O~@\P23fFP_6ɣF }m Jk^Nn$ 3 2I4#\/N|Xc"˶4,M 2m4xʉHdhf %;|F:ǓUXoBA$M/II1l_'}(qo̝#jg*6ZKsGLbkr}@qm.trȫ}aV:fUe xoSVr'Y壥cMx,='nM1V1"yZ!IhR *+ od01Ʉ.IE pJ/&,.]Q։2]&.q@G0tH\p%GOtdc/s6iS=Rcv( [ǁFlv/kY# 2A Y [}g4 deyc#AMh"F|"Dj$}WUkwf|ݶ,u/>k<ƣ"̞Z&s Vmy|"Tcu6 9X%v s";Guo)~酶c˷EG/n1xcʻis:kLgRI1Gs5t{V"߰u-2}}AB h |ؚ*wF͆nUnk'R__hZ6Ҙ޸23ze0FM=k^{U5xƀ=|Q^Z b endstream endobj 337 0 obj << /Length 2228 /Filter /FlateDecode >> stream xڽYݏ 0ɒ?aw{h{Jbc3I%$K,QER$¼Ǽw7 Ox='Ag^ ${?p,~x [FlYWfn1 Pc1ժP_UQ/vILZ^c#0-}5Q7Zl0 8} :[*DW)@x+7(Y < Q2fvW}kŹطXw!fg? &dXcW%:ڵS(Vve'=W(kj^Ƀl ;֮;)$i@^# Ю~$/(J,j5lQsg# ,8!, xD\94rYCYUWڲZ[uȺ;2YFS3sl_.@Z::ZIUtճ x*R{+b?).]U1#j#уIEϜQn! %3)- DQ1GǼƣ?yK.6Hfq0h7.BضOw٫ӡ6nMƂrCsa=&r/U[k7.;zOj-K&͜}#׻lb#4>5_t1믙bh&-xImdtz!cfշ(ήam)cE!`̇8ƏO۫{/]emN߉'09 # p枖A4'= @CZՐ)i8ȧ,OQ`+g .[q&c}mz4Upo CI"NI,@e&l[EPGeĹu8oHW/eA-&"#ʙ/ CE!sE[*Bd3ܣBmF7,#0Y󓦝'q >qJi/øA57QS Q߂7F W@> oyϝ\ͣ0U{* X߆ԝo6fZKQ5uLRQ4ֳʽK[ПZO/?d;5vo{!y9p470nb5{LZku:CꠡG (hk[ӂM RDDbKy 7M&DP|'Lԅ]w sڱ@W],Y&7 @:\W]?NʎPNGܼmUPEyfX#Su(l":vNi _SoVMgKT"jS5_<PQ6ֽ۔d f׼ɼ.a pB%5/u3! :o5`[:4 x,\u8VA E7D}p?'>)f?YF$Қ$IjJK0B dtI̓ՅB =*H[qZ=yI2URocFlw> 4@3p0.Tp,A W>vp>%Q[&Ù'm@6?U`!].WjXʷI V->Nv3" ל/y;"YnGg4(JD(K1i.?B_Ĵ+u:A8 peuqh}>;_xǰ endstream endobj 353 0 obj << /Length 1989 /Filter /FlateDecode >> stream xYI6ϯ% 7Rn-(C ˴MD+ə >.%̚r{ 2FC&iYltb>j6crHf菎m=1 ?'C:eօRf?L@6gE="yV{{ v4Hf8V%=LR{10aPf<(FBέLx(|I`3 ݡi!% d 9c9Oy0֯CcXq$ˆV_U( wyqW%|lu=#5*A|Pί:S0+EMj5zBP{ b_{ ,pP ǩuL:N Z*';C mq2/Eez2i (u!٘#E1Ӡ7q@sO')$83p(6_fNKuۇld`vډ^(5f3Y*0N6Պ:+VpD EgJ 4rDyd iK·m8Qum7"ܫyxkq}%A>dY 1zXy[WCYih{mbwӺ<6ȸ<^w}mB_u\a`S ;q}yeYf贼tIt6\e2`mAgV LsV?8Rw6L'8·p{nu=rƃ=-! BȑFk [8|9HHt("w=tSPK-j}bBv4g}ɞ!C`E==+{Oqw}; [vy@5B损!no'5W;rXlB$9cΠvLS rYɪB#$4h ef"I:d\"|}V_,1|Ag0(䭭 ae|m* endstream endobj 359 0 obj << /Length 2513 /Filter /FlateDecode >> stream xڵZKsW0T<0ӦjYī*;š4p񐣍ʕn4đ& <@M$M]շLbR%sfJ0ؖl+î:MW>nz-t._nG9:XfA1iTmyO?mIeW(7z;,N0g,KQ,s<Ф`k {ڝɤ mǾ2,˧[sRuAнq:\s*z(k޵Pspۛ_ti‡3.cV]}%M6}2K,Uu_AbL$,R -RǽB+R%K "\BEaYL˄ [ϔ 3X6j"Q2;CIMZtF4 22Sjdtz}YTl QAr{J?> <15||Gi>@UXRGB܆av"%<]2iceaGʦƇPnאp@l?4cER]lHz]5eXgWmCONky=K;'TUяо;Z1)mk[sD1)bS;RIDl"5Ao I`F=( lU7/1Rw4]bnhna_BeCMUӕSE$PCgN)Aᆳ zz.*i `R.dm[@Ԉܭ ZK &:+Ӵh  ?W/Zr&0իla =Z(.+mTݎ~sB- q񥜇%<i6l0*ڹn@n±4;w8;0ƿʺjo}ΡDfHuiJ /L.+uثV"U-Hkl2)L"Ǔ'w UR+|Mo,PȖ=m>4cEu*q?O9'Gb9X>S.J4+ gKҸS9L sOrfߠtF*h+xbc;6T]qWV 4o|@V> h^;?7b;jj̳ SJ>3[)@8|Z @8Z-5-$q@P8;UĪQ̥XL[h(EkdG=| 5P>eT4ѡ+{0Qاc`\.Ǒ=6>Wo4<˘>Z&bVeϴ>ʚڵ P! < jn\9ʇㅥV ѤI)ņr?T^_7beƿ&y򻦫M6mO[jnVGkڏ}{3h{BN3c5Mm@x.AR;eSp9u쪦ڡ]{lԌݱ)UiB %1lDT|B2!+c'%O{=^$ M{@l^l2PB9*2(Bŋ@Qp_M7!N x&QWP_z#r[mgL S}iюIsY~Y^e|Y(V_13JjL`uuUE]o Z Fٷ}W=baez}^^b(Kpj:H^8=3RB(|XPAظ7e:< yNmʻXcPp=%3ACH9{/, pf+3bܗ_9U *>mJJw x҆i w'z@F5޿яA<ډS-rg@p4$ +. :X u/;tzrºw0}^B&a sB]ۋP (eBΧ-\`GxJf v{Iũb P8^7 w5~xoD/?}}*<>P͙>+܊4T.FґAXK WuKs67< Cg[8Ǝ3JG!-ƭ-w:;_7g6'ל!U" Bl' c_̇@%V>x5d]`9}:QT2;̟fOz~P`T endstream endobj 366 0 obj << /Length 3029 /Filter /FlateDecode >> stream xZo(PT-%{H6](M,^(R!8_ߙKdV"yffWap?Y yuHs"## Ň_`!Iܺ@Be]. ٘D" CTU,ęvFf6*?.2YE*Zфi,2Zo.VƍҰP݊/X\KipF/~r3 ~ۍZz%uVhAg~ /iϣoGz?od(t;Rzq\ .]QygRz#I"']lqe߳C+ -n7iR42L2qkc4FƄ^UHTJ-u,ң~G[Y+W C"T2ͮȻLc?:-d  X,^h [rEmh\<k%3kK#ޔ24a~c](%w4~D@̷ӡy𛊸AA$|LxoI2ܒW_[2%Gm^ ʧZOK\\f{2e /:w5l<>sx^=,L=@UƏ( +j[ EqomuorkK#Ajm]t]A䟩"hB5}'UPa! lJ0È] sbL$Ks1 hIr( 9AH6eɪ2S"Er +t9G&m,~cƺR󇁃%O C~k:oc1,{4%o|m\Y2u/\g AU^>ݐ>:c>7v|93}@snx&U/X@EM0|}\'H&g2EU}졭+ ul۟$/}^Q?MyTdL"ϝ(gK NS ~LQR$N|ǵ#\ڝqz(G͌Q>rq?v}$ Æ|Wi1#Ƈ(V@2aDR1d>/ףԡ21Ըa.jnX}osff w2AgkFR<5ֶu.k[z3K qe1٣w8,D5Ka Ka|%4EI0gqY9"NBsD'7sCTS`X~&fafG,AsrE,9I&^R >,U"7x$?h&*c1>i @;鳍AF*e>WQt//lGbaDTMJJwk̥ e}1: IFӧСӫS&H5TgҗGaӏ6 i7ݙj1rF]0b\i]˥r~!dԍ%5܅u9vOS!R3ng!-3?AŶz_fx:mz:. ^"+*=o4U]C:xgY뛀o_]  I8)7vV6) xmkӅ5pbW "P>"_aÍYKe:ɲ$0z>Yy_]apl]HvṟJGdYVB8kp #B/2-(J/cϨp%EkӃ> stream xڭZmo6_( 1#SCZ+h0ozˊ33&eDoO% $(*"RDI?G ᩉn,&⚑Dho'~T% +[ݸsetb@HIMeWj.nga_T/!kkXhDݽ7Z&AV}b މQm!4n53O\yRp9f f '7kbę M#&lt\֭؝S&vi-Ni\]:Ҫp;l;{.v nZ\7ڽ[o묭)S_hī'pNEcU43}lIM OB# gwi5/w iL/!'E;0S4N 't,Z{=;R(/zJॻj ܝs,Vyupu y&=_ .$~ 8XF]A(l?WUh"cn]u~渭wnQֆ!Y-z\@ͼp*\U@0Q0*Wv_o ~g}qT)%x+sWA.UR{]*aP DI$]@Թ{=ݶyx`r.X1%SU~9XtQEHըw 03E6vwBz4'q_7/s M]4D**`)d۷gYa-]Ac( <+"z?(C¤aHh:J{D(.;=0Wwc#;ÛgףNs!@sDu$l&&`]M@G5P-DڢʱaK lk\S@lWݍ vX4sn. lO=T @UѮeĶUQ[dm5dDePcgNgR%t/c.Zpض/| }hӥVҤqog+f[2du6~_=p ݫ&.3;ԕ-; V s_xT8NW=+H iF?+A_R=;V{a4JzR+J4]ffT|n`.(B-KD`!z~ܦb aJdJ=Ly)/XD[U)"F/umDl0X2YcMp˸>426S"ޡ=MO{ ? #kF1ƶśe槺!_핸lfrf) }FU:~q5Nv$NF[9lK$Hʚ)3x*MǛ(R3H`f {H )F:,%?y ]B{6&nXxnD=T3% jҞLo`f,ctNkEFg~eGN1O99+ B#R3G'GisfÇ_o?zr>G峧P>c@4t:ia@ >lX=3ˊ~8As0BaVTx$<\!Q'E⛫byÃXn2oGe+s>?sSh^Ls0 tKqd"*HUQAcqeiK >cN$l\La: ,d^ D ~e=:mcR'bOMBA sXZk8?$W5d 4#{ĜP%p&CW>B=jم?  oV1>1  2捻߶)_ }dtHh;-Pxh< 1Υ{ endstream endobj 376 0 obj << /Length 2202 /Filter /FlateDecode >> stream xڭZko8_!)j.ߒ .:ضŠف,ӱ0ٶDD4}K7 ^P/oc$VW+(2 BYp ~˹tԍY^ιUYmɊ_iTXsmh0gq60JYݬ,b:[٬\aU^f%f&m[Kg VᏢXY7UڔvMZd+0Bj!|9ŝ-~dpwrd@F7d>'mn1ev6[3&iupi)E ~I3ېiM^,4`k͈En.~KhAu"y_E푇V!!XNRG RQ;Y GP9S8 [.%$q Pz 8f ϳk&dg\[u5ۉe~j'2Re;TP`;[pr fmvw,7n*K~y:(6L 8i*/z ̠g KٷlJOl*R+|tGk`iC|M|V՛mw *Uةh=a'IsÉ!&t ȹ1b={ǀᢅ٧K 7;k51 %̤[k*(ah@A'cIС~OeƖ9Ѱn#G̔ \u=_ ;rHNqJ £] pm.pRNRӺ@%c.cP7@O'{YT!'wz:= j-w,. Z0A3 jĢEtsv a8BrW <&^x}zP'ؘ2`P(baAdMh='Y1u0$zG;l&N[h<~W]G< @\mv$ z#$dL_ M*THDڃFbܠDqH5.Ka+B0F˹wL92"e/+o]Y2}okxk` 1'C_,_,C⍤|ނQws͗f/:*ӛ]I wP1!]W1:Qׁ"A& !HO Ƅ9 VP0@^ o>O޿ş>WxyR<-%WmH#1׳`|c^0GW?8;9 {p! ۪\R(Dc)9)!q?j>Lg<< *g=aDe|]/zjJ": +{+#A9܍<[on> stream xڽYB8 >$ Z =$(Z%,ӻjdɱ3!j}_̇oyt/7*xe,RG7HTj3y#̺m7[uw~[*?Ӡk6?bnVl#1rREq'g*3ѽ#=F*)#9[#Tr\c eI\cX s 3\e:X̀tLVKYI.h7wMX9ʔ)-^\@Gys:8uѕMM.# ]'ߵM4W6Oחugou̸icWdLF 1 `jfRISƍ~aqpb\E@ ctؘ ,'P 2P )3sp{ Plp1jY6MgBPL?'^Z)&=6U&%1벥پ{ݗݝ_4~'eh/}[tSz\4:]S-NdIBўBzPBžFĎ' ~d*XixNN>F>ڋ\ tgx{>=/eKާ?"XwsnUB@Мy7*u%<}VWU5훙Y|R?Z450`E H&p0.<徬*3ANoZ=nE6y $S(wƬHqf9ˌ x׽kщ20^lh0+l!] żD8/-iHg{(F (BKtj1x'xm̓}&d~KvnS__HTgx%pd׺r] &#v//,3e|pqǂ{QvL)e4 [±җ5.E5ڝ7fT\B)D$S{ CeBIJ d! Vz(P`i_`PAh)Wl/Nuo).;͟w~%̑]dARӾ5LXÇ Lg?;dry|ܨ%I(RxN\5/>mwQex/y :K3үqJI~{YAV2G0_Ld?Q ?o&d-_WI밖;Aʙ spg m&KQlp7K;{[-}dQ>cp=m\az<=Q O>Sy>aמ~+ӏ5j|GGJE՗JuxF2L(DH G  endstream endobj 389 0 obj << /Length 2098 /Filter /FlateDecode >> stream xn_!Fβ*ЗAҠEhqD‘Jk r(ծ7^bRp8w̚& M>8 _7 VhL&Fh"LO?ѤJDj U_DkH WZ$UXDj2֞Vm a,UI" !i reDRuQ*nԕrH4XI8zeT2TH9?&dbIL%(֊H>mvk-7vpom:I5Q"HtbtF [¢ |VRpN=e*(B&Eh:eom\EImWÜ^&02fw ~30R8 ݟq hECA$o"> 69KhRb t\m .3sE]mvL1 m}^:m0D el3, &\Ag`ē/PŔEu+2`@x)&Es)pr9,X( _$޼YTz9y/Cu8ipOeV5mD>=62>?/϶@=A6ۓ Y^Veq5גNLYn0S'=:pyO⓶Lp7ɧb?Y!rx2Ŕ]S#<^R݄*|DIzie3C۪j^ce;tRPvI VKuJM!x#)є-,F)&&mJr"ӘxU?p_jU_L~?X^<ܽ{,_p]i8s#M+O~x&W~zU6 =#B4ݥc#P^(=T1^rPfs$W ,rYkOJfERA:Wn#IvmuBo@)@&z#iRVz%uK['v~-vx-ntFljyG da12".YYDV7/q)8; &Y68qxeIVŗs Itdef^4 endstream endobj 394 0 obj << /Length 1857 /Filter /FlateDecode >> stream xˎ6_!( dY>$ C$iA=Hrʴ-DI{g8m9f23'Wg<rQx|\}aV.=8ܐ߸aBu7>عP-gϪ F3TBJ͓o;hy0=n{7ԶnN`eAߘ>L}D#0Y'rlUK<lޮ\Ox>ngeT\q_8)}qM&=f@@ { 4@KP(\9^D"{Z CT@%$Ue{ h19쪬ȼK~ 8Gufɒ(fʞQ~;(K" ArEږzZ VX&UєaK+z0+l; 8:W~QDeڲv~ʻ p9s]c8\PʗE*{!ޖ`ho\ ^. IGp/MWݜюud0m9Bܮ:RC(5"*0ZZ mP htCSs>bˍ&:g}2=UY;*RPL!Wc}iuqIh_Cplp } MՌ$MV60 ۫ sm|albɚO>H~Zl#ʎP]tk{dv䏾9ʂLS?)H]0?)VjU9FQjc!^ni}W]uޯz>|Dg'Qd̘=!Cdyf“p8TF endstream endobj 399 0 obj << /Length 1870 /Filter /FlateDecode >> stream xYKoFWP7zH&Hom|s )D$eGE~|g|ɴDJ>.rw{7ΰ{r> Q(W!I½J$Cޅ~T`(?~PteD:Nf9NBuY+ЩQWd+zj7i7'Mi"ї X9;6fQD_RTS=Gu7\@R^@q.}_”ЗՀw'f؅ZMSB8F7\o{ndavaP0dD?zv>X/(Ҙg_Q>pjߣj:|[*ݗt/+q3]U։i-^%+wR~YiWũk] ̮ߢ_b&q+}zRI8n o;?(g9 Ew8MpY<Xf21PG-Tn.Cfw:zLNz0lQDeI21MW("ztm 8$1s/ Jv \=7k9=/8~/sR@w5p !-ˤz.u]H16,\X1mUr֣MX -׻ύ\x-o<;̻0DbGD pH@F!U O endstream endobj 403 0 obj << /Length 2418 /Filter /FlateDecode >> stream xڽYY~_A?:} c 0 vEQ#by"Y|]M /fί<x w7*)n!X,tجwcMyon72aպORcW_J?\׻Q,σ, ϡFq8,B[NySd> @ }w>݊4,OKeջe!dQtcwrk }n+ʜ*xPzo > k,K縳:hᔍdJo~T`wfwsCǪ/N)w*hՖ_Iq{>KMO^k,\=c$u:oNHfo:$f5j[$ܞz>2uaXʁbg{^?׃+3fz_y ֖9ؑ]qJ2&mSI~.QŚʽ}Wj^ C@w>|ecY ? z ~Z>WX??pwۍDJԩhn>ʃnLei`Y@%q_n~KU\l*T!|NVzYN3-ez=u"y d.Ձ,F.AOŔY1GT?5|To7'W- 7y8,Y|odwg(|7E#έ{760U.c>:~U#޻\hTO= kB).cʠ̙:,L@=*80ki sS߻o|?ߝrUtǬd}&}|{`?.ZyOU RrIY:)5 ~S~q3+9@4Uh1C왲C=q8`6h;)C5H8N *csY_mWۮ0E~6<2wʖtvPpl #M~O BڮXKĚ5cG{4<13̿%*2T85!D(+,k̚(f?M7<ƶh+B(NrŹ*cRÌji""2B]") 4+X-fR76[sbs'vT`|\|| >Sjã_\v`lrG};bQwבHGoP2OK+?݉pz2,՝B*No VU./ K pmz]e/uX)EwYkJf:1f*BR]c䜉-L"9dn;SJrS-C*aB.v,6UtifO[&1j& #zѸs=z*2ㆍf}Ņķ.$T̅wcP_J[xQ=ڋ`=NCvy{o]+1oHX9SU8g=32.mLez[1`eT%*øoSo`/ouݝHtEʌc- endstream endobj 410 0 obj << /Length 2268 /Filter /FlateDecode >> stream x[s_L 7@O34MK{~DYj(8 RDKO:z1ApX4h Ob1F4H%FS}DHlI0PiG.qe"2\}liL@O˴T+I35HOc I e B;A1G&\-z4V_wx ϧmt{ sGcfIgV>ԋ1n9Dnƌj_]d-jQ"q`*zuV[A7k@%?U"YOW9OߙUuzl=3q/7ssth7Ѵz[]pPZB䯋 {r4挫®v(9a}H L/.WU;|h[YrA+&y3͂.p[rݲRaӋC!){H¨7' ض27e_v\~elXTAL4טW )z9~> >.rJ/w)oQYDOC4"l6UQϳUekEe]2w Dm X=VXb\s f eM!aWN Y:7)EUxFM@'|Ej5r5UD z{i*) vrmUzЅ -t5YNۮV(` @(4³ *p%&ink E5-DoP&(.e2'd6GeKv Vӫgen33!qpSYKJ-wC  < ?оz0#z!bJs}[©Omz-U%}U&Pm6UPL*g}&eئjLd>$qmg2먝F;5m3=Cy02i5hkeٮ|!&i@@ƶ䅬)Oez !i=%l8F]/Av{l6lg٘M] Ɲ^WY]H1g}g]_J9eSbӍNLn$s͗z8uxj$1)?19pl 9- : <k1Vo6Dp^IO]8ˀn\cMtu {iSe7 ktX8lTM^EϺt(Ne3c1yՏ^tO:|qWLe;oܹ>)uŅkoɪ]WK)D L7`v !?-g0 >֮6dM = =&lKC3x;f8ě o@WuGX659ɳȟFb u=Qڏ5<"!B}?HI/(lUWc9BHu,C!uӠs4> zm=NqEbTNb#Q ,ʼlYboY5բpT-yn Tuു$* $,- m" kBZxj څf"qP˲8BZ5IIˣ'eJ*8iyTr嶻/:~<:8X{:*^[cRb뢠Z'3nF5}XE_SPy m gXNhXI ź_:> stream xڵZKo8Wh 81W|Sfi`v{]L t,,y,9[dz؊N⣪XUN'iUz~iʓdvP&Ъ&n1uFKvײjLvYow֮kgqxe(wrg()%_/nijfa&}`SH^;'*TLFX˺o{SJLC\X0ny2XLo6F5?,X3VyQj T$ >: :r7`,Mo:>okljw8o,S+e ض-&Xcp D} qD(s>{q̗beCt3xl,,TaӃ?c,'!Q8 Y%=!l=Ć{e[r/bF~z{Ȑ@>`ghXURB IW+|rh"`SEml:/9&4W,JKz1کJxI [%`/~bt mW;si0S !~[TrӡtKibO!l YKoBa0nK\5vhZy`9TCn`a㸻~~E9t#搷WQ]Spnfv(C˲~lL_֣Bѣ\g7I=~9 5CQ+y64sjo^AT?>z0 an ]o=ceaUk\v+N"d7RrJtfh4p}1ޙXG>> @_X4l,(.[Gw-3uUKEFSSƽ5i1&G_Ci865T[T>] [++H#GK76Hj n W`iV@]sQfbu6 u3@-nLުDPAJ `I!f77P^(KWJ6}R+]mrMp:/HOl~Vf"L٧OB\]iV6@Pb;ʖ=sw8"J{$LNr=7ku\!TQHq@}q܅Kl0If1YR<o E /]ji@]t =@RD)1u)_Cv7΀U@cHczxQD4E9rqI^pOx _?/M+EHz|! WgoSB&Q49rϵOK~HN_Xթi`OB*;厌P~8֟!RܰӦ-AϏIPuRݘ9T@|+Fۼy@/^0D}|g_70aMB*PP}An㎘]C${ d<@-b4 [QW G51`!PaTʟ|rCxq 1 <%% Z1o1NGWj-C=p@B ڣA=7|S߭u`+9Wr}I 5(> stream xZ_o6ϧн)]޽iP( kKv$7Yoɢ8Q܋%p832D쯎oEliWs[ ,ffSvզl9E׸;{(W'lfz\uan:+:PAXg $mo^e:<s81PRx_3i?AJ' n S LD|6mv>"x6la:Ӈנ `R3 ysxui-%\VL~/%!wa !i>+(zST@lZ!´:g֎t-oMZȍ^|UQR=h%k@Xˮ0+4>~w{,% }vtKETI- ,}RB؆4k2[+jAի@!I.d t>"5^*EM*DWڇ%%V픅(.rL˔Xí4mΌPϛc/_΁]_/)؅\.$) V9=kTC4@_PBI$% yniWE'1(HsM TJE)`zQP*DNמ[V!h~SJp=?U]WRhHZ{lšu[{ g6 .Zf>mlL{I0)i2Inp܌kHy45cpa(OFM!w+<;Z)7, WTyƐ\AP.p&Є=9 b!~8@*D$={N =L! `#;ZxkIepT@h\F Q4ч)pŻ*ⲻ->^a]h _o4r^8;ȔtA<b5@m3GMJ2_]( \{Y%\B5h%%l&:PCs}N ?SBO;y _Pv!N~@bdP 寗 =BxW|zI,֤P3KGt9]޶Lsoe >BrSEL5<:ׯɴJT2:6H-D; ZF_*Rf,|/N#nSÕx?RALɳjMǃ&sFjM fRbC7,`&ȝ+/pJ4*ܽe}I# M^bLZ"3ޖ%b$pϝ 'J=.;#d8MLYXoP&U(S+YK嚏KdTއT7Dv.{`"QfvF%i>O tH֊{G6%+iՅES=^Q6.1+`p9XSE1燚eoH_f %1>ЖƧ@tv]2k@ÎP&|CB5")'8 endstream endobj 423 0 obj << /Length 2073 /Filter /FlateDecode >> stream xڭXK6ϯe5`1$ERA6; }Hij#g2 oUTKힶEX,#yN|/`:FBL"qնlI4cۖShqd鿣aSCO'۽[ZtgS#7}M]Shx;T8gBfQG+ Tmťkʕ: s&Rw^Lc4ڲNCgSXy(mHpB=/ž7Ut"}I84,RەWc%RI8gVѽ}h@=io~G".YGG0+='O̻Um_tzcOx&&sEj(1 qrKV)3R,layh'HLL`Ă4EҜep9NORǟknWcc<pzۭ7t\߸v,d^v84T8_4ڲ!pRrH򐁽xv5?XM:I`N{f9E|,F2!ў8`73y *OY34:Wm 3mRcXQ? UK 2݃vD|kK$u|b5O߃+;3Ԛya`$KN}NUWnoq+ltfoT18}U(eC Rʡ\?+sMh⢅Ry(J>mŧСPY2i"/ P2k}U{j1C((ݍ25`4gl7[^+MhN.Vٹe!@=FBqkG Čs(o*hkBV3d}Hj5 Ro~ sF,29^n}Hx,=׏L罍Tد{"vwvaݙ{ykBP߯Tp޳e<P.xd?nMEVTf7FہztP ~l( ~hΕ- ;Krc4AIΕAꑆ .>Ӷ|J> stream xYKsWpotUOTj&&[lafI EzIʏJ忧 RL[! F?2Jϒ_|$TV_h ?D yx]$S¸>$ی(< \U&2╹$aI*9Izg#a5/ޜۧ^@gdzzUTbD2V'+PhL* ,@ XJJSf4=U1'ʄϿ 3ँdg"$nM7źHŹbJW^z|MxXʩQ޾SEׯhޞ%&?iMg"wUgo'f+H~9v 8Uyx7>Q+pY}+?n)e%M_quBB*P޶8xfc 9LP4{=]եkf5t9 @p6+81Qas3ߙN1\xB6( :ϖ|z?t+xSg3ufХ{pݗ^C^z c,sl ]Ui|xy7)S PT\'y[Q)|{Bhv"!UGHaɗ ߵvS;iBf@6T|x'Ň!o`૵9~uǠ–k@)^0}|91ѣp0 _3f0hg6tШ_?Ռoo?HN9' P?]2@a>MSCΒCڦwsgCk3x79_x#6]}ѓڡzH&qEgXڠ S+rmk1sU΅d3k wbL$OZ%ynOzC4_5'#2cvF57?k3`Ƶˆ7|>4!vB .~ _f'q.| 6{~ߪ^˲^}kZ@E"aO B 69ObQۯl 0DS6 w=^P/=ê-T1ȯ# ě}Z[&:2QqYW!3RF <.l;hB&…}v cE=I'S+ݵ+'d_+s7+bK5nA}C?boHBzfdOrvCS RJɍ*zI4֢>S*'of]"rr%,1  Ԧ endstream endobj 326 0 obj << /Type /ObjStm /N 100 /First 868 /Length 2025 /Filter /FlateDecode >> stream xڵZK7W{X"] I Ǝ03c %j$EXՋl֐B-P3\zs(IC& s ZW f%FCb GCB8ፓM@ټ 7EYr M7ȄVQSS787M \׊)vK l?6P*;KCQEo_-^L}p|4uΜ*.bVIV# yoCZA댑@) ʘII&bha畏|H$A!4JV"@U%dLZ9)RXjbJCG*7 ]:˭ ToXTQpSCrZ(֍FX^e+A~Pr*+khKoJJM a`F.r T)xv$́Ge@p0Bx^I׫+WX&@M/^G0Zvb -߀&W0Ջ-[%w;VPgϟ>[}]Gj{^Wy"q Pi`lC?(asv?m?εP㐇a'HHɃiLͽzĄFKL|5 lh +Fg` '*[~ʇ賈(t~͞b~^K'X_#x< l"-pµ{ .~%X}'8}|84iBkM;qoNbS.^Z"3OKYN.yϊ)\vxXEd~K?& OL9E3 '578oD2ڂV_}k3#Ӽ,2b+ hiݥR-mO3B@Lo"Z26i|<=*5;skJ#j/~ޗLjz]\Y]m-!bjQuEk_C=I#ga>>RlibrksB ; *X]ZZ>~'%!fLHGN+=qb#Iyi:&ԢR EJUhX ,.H ^\&Wϱr< x --ab*ir۹tfKۇYR3pH"}P9rΗJ3U35/gc 80r}C/ nJuE6 w?Fcg݇㲿؉ endstream endobj 436 0 obj << /Length 1831 /Filter /FlateDecode >> stream xZ[o6~ϯP~1ubQJm9I1"%QdlCl>CYUg8# xyy HFAL1dqv~)|m3:KSa`<~9 &,ST jd,,s* qIF[шHu L~9>BIg㷀1`*Cl<7uqc'|XcA6 6K.lǤ?̖]J+FX!p^ |E~^\ܟ8~ )8?F`sB pT½nډr9XVDZ7򪞘pl]W-B-W`>[W1)U1[6E.: ۲ع]e?g_Jy~:n $Lmmo;; GVfwl Y&)eY,2T9P5A.>衰妺TWyJ W״V. †BH1r/B2$iGn,D) ;l_BXĨT/~PƑQ3Y#&Θ -ˊ|@k$늰BPH>ƙ[ a E. 8 įؿ6G-.:lauuX#vK?bHp78 Ԑ;.P0E.xYuaw!2D:c89 ' N)MGvVoj@t8&kj67y[}SsЫS@S{y{ަm1\sӶT’bHB!OiҞ}vN]SB8۝Ԋ ܉Vm]4M-mtjH v$sI!Cݠ0|>TN Oo&5B#{H rq]eӱ2jWe _5"On|ZO^WviWEeaŬzWFGqߨ%`e{#BiAZM*KO-Md}"RԊc(B%VdiQ vXq2u SˤT2VqL(M&AaiA2@>UQ0+f -hRZl2dV%_q'JSe**sjOA^vP§ӳv:PTZQƀ`N[qdw&sGvT TZQefQvzdU&ULe)hM`"%w5rcRk:"'5CZVd?95В^bB.C~|?J__ןs:n2MXbs{kjx~BZY`mo@[7e|n]k~Y5HR(cN+˼~N߂3j,s@ QNv弜I^EPgWK;Ep@qhw=p[7۠5%˹&hb򾸲=ʂ_b܄ue?8m l'j*>f7s{K+wPyxEEjw؊h endstream endobj 442 0 obj << /Length 2477 /Filter /FlateDecode >> stream xYKsW-9ca @ I*ڝ=%Wvf@I,E:$eo7d[N.F?n6 Ga?/s`F,b(2/h/(FGv& '4N`^D/qf"J$ܨCda;%FZX3SxU %Z(IbCۛ3"MRqt 18ݬ/"k~J"b[9#@n;D<&H"d!t( dn_wLR҇v}},k*C,%[9a)[Y oO%g*G5Qq?^͹_(pi쐖 1IrEL01%9&Ll&=}VmUl dtF~aCBRZs 3"@iΩ '`ʉ~E @! `HhճUVm00o>_+ nGm PaPhB³+-$xB,HW;.UB4G76;t$aC>- E0974,$sմu^ކARlK"HH>L% &fs0Od*`&borUQoB^vo$ D88:qNpY|"ݻ3ݫ٘^M= j-SWkJb ŕN&ѳ !f[>[lukY>- Ye]ct|s Gԃ*L )%ȝ#5)EFLefuc7 nP$Qp/=)j ethHar&^ymSD%m0}iSAfgC;nW"OOC@Q;?Ae;Vmہ#n"l`^-Al3:vҍY6Z.|ms ]|! E"o1c* ѯk'~`Nx;pL5+g] &gK\0.-xܼܮ=r2 >J[J\" b 5i3‹FIIj=& K.EHDBF#ټ9Nkc#5̼mޣ5JKP&K76vI 0y7˪\x !嚸ןY//vpOA>_[GyVVFlI a.+ 铛~at[j7N=)/PҡqM cFatEP \j?)(QR:{ǘya2@T''ԲM+=eiyK=-+0`ҧx2iopk0~c#_"6{/pos{s Y<=2uPK:BTS=;'MbXy[COC XHu~: etB"dYVŭ97mqi`؛MlفE'4YmANada$&4zԺu>ƭW>yZn1/m8o  ̩xacݽJm>}]o ̂*{4|dcp٪VdY¸Itg6pهc5xlXgiu[Yx ,ytWv!JW M;`؃p _@מ 7m@s(w[Wcuw*-. [&%p%oƈQlӯndQwc| a gX@OER\Oyvr >L*3lϟ?bh/!|ڔ$_ӻ}hmH8S;]fEPB 毓Kru}\9kؾ2kZWq}- cs^RAiiNhM*Ʊ:j*w-1ǷD"/"ok܅I˧ d$z_pSoǻ o"0?N4ȡ E8vm\ZV[(4< Et-|۴ڵj}%@Xmw JUvbۜr2}{[C CctZ JۛjDҕ쾋cuzӺsMLz:Opm}yl;lGŽ}I%%yVME endstream endobj 448 0 obj << /Length 2928 /Filter /FlateDecode >> stream xڵZoB P@HksI} K J=3RҮbC7 ~H3$"A&R*ܕGME{nD펞E۔P_G&b*),7nyIm?omCENAV5gxTc!g/-/# +v`N@ `_²v t=0 ƽuGxҪfQfv)ݎ@iq? ̪bqy5(<8ŚRh I}5DX'FK$,XS>9~ǝe"`#)ѿw<3qbMr, L1KzbwgqR2ߘBw!)quaV(b[CҠSDwYݸźj[-bh) "EAw_?&ufÄaҩB. - uwr[=uoCND\xjK`&k &RcJ!H;({⏺0uMgU>ж{87K2X/4&T}<m9sOGik "P Zl%jzXՕU.:ᮟϽuh+̙?:ۚɘ9._v$˼m$| լ:bɬ$Cb2ɧC16ʊ(ţy;Aڿ5Vn!!(X()~GuOkzܺ݀hR:Lwpp%D2A %gaղkzJ5s&\``1< {c w_Q,&3֎Er{dgMjJ>C{yA2=9SA B)La3V2J &ϔ9AC50&1" wD9к&)9'@| /r;t ~vf%1>7bT<l`. ;J\8,zj۹|˝~z8ρ{6f,5?KV i%)p/PVr L@ƔAmf[El=trccUO 6cSxkWhg"I%4 aw WJ)" sD5'@jCħڱ1K x.r(^: ̠LEl48U.ã[al&.-s)& جI6Nq;!+3N~]UqLXT 3#mq9v&nx )z;ֺ[IMy IҤ1ef%,zԄSBn-:G^j HfʚW*cƧEgULmєװe,毭aƩWӽ/Ϥq^n5xGռ39{R-2<\T`{m>-}4Upʡu8)¼yg`p);BƱ@~<`fS]ۇB @%¤b<s%gY:v5ZA!RmQCx(Vȑ) =2>po9;=޹,Jcwlz=T4[CADcdİIC 3E4}֧"7o ]Rl+N@ݟh4tU-=$ ,qJN6} G_`1s>`BpA>Nm;,"[zm+X* H%Kh ow#˞bUoR0\oz:0L.JW6Jy3EiK~ͭ+9W׸#="XomS_Ri')ӡ~JSzQ.i"zNwVY燛n~sV>2DA :(n=2/Ʋs's.Y*KvS\2DS=\ArB~q*k01:(p*Hr7)m r_w~_eW/KwMjh8\%,' ÉC )$ x3E;:0 endstream endobj 454 0 obj << /Length 2173 /Filter /FlateDecode >> stream xڭY[o~(*؇mqNKўX`wȖ+K(n^9Iy1p8C|}/_nVYzi#QJy XG^*&w>r7UDVJA܉L[E%Ǣ}:J%nq6A]ӯ#qy,͠Cd!ۊbyaK"pb;v"fuxgf3h* K6^^%3&bOOL6Q“!cu:uUw{Ȧ.u_o [Jgww\btan i!JS]({YpQ&sGQu_ G/PÈcP;GŽ*©Y6Y/4u^ Eqc*amY`@ByM(Z0Pg԰K 8r!`v~76zi:hU.hӁhSlcVLi\*!Ch|1Y? [tɛq_$x&P@ԩDeH1]>Q$E Id+Ͼ+ ݟv\jĄڛn4 e%(pRK`g꧛տegg(R`k~ PL^&p(P*/Q^|< &i XSOV°sỿUWB޿x`C$jC`8ǥ K" *M.Y[nʪ자n!+Sݕr!r 'V%$[^O,^]æ iE@C!md /J³wjܷ* -!iEDh^Ra׭Ըf@Yy7U R䏖ePlˬb99_ cxvx0>%_ζ# k0Y هc[-&{[~:܇DZL;9V_x%Or7ޭGexWSW|[Ң!×"13 [5} 捱IBO_ rA xaNv8Y+toEf/MA⃋7z=$/1-X/q=D.qHiO߅qK2yf11](p_'%dwcTjĄg@o.i:!0 ,\=HOW4=s6<hD1#?O2v5]PSIڤ-oA*LjiGKǬ [@$H,p盬EJlۖ葭|cKo}̪2"=rHOmZ2=="iy.{tP104,+.RJr7ƢEAڢaeYt?A1i64=* #ae=뗾q3zQT_|8>E`@guUc`MNkFlk(yS qۉv"{[t- $Nͱ+]>g-wn?)%PGގ^Z?ɋQ&E5珡_O=vMv7SNiYہTdP#644#c_ nXְ<CSpiM'Pk) endstream endobj 460 0 obj << /Length 1313 /Filter /FlateDecode >> stream xX[o6~ pڙ@3 M7@a@-lɳACي%yI&YiO$bqsyL`ČrYE+O;jEFn a5C\K-l vR$HɃ*d ʐa,菂t1 G7nC\Ak}rmwEe7Iӓ[5k2`ra0&fyբ3gr7Ob;c! 8ߺ&)m͸!^;V /t}krޅ,]\6a݆ P{~d^6t^J!|kj-Aq_,'jҸ f\쓺1oqִ`}$Z7UM57U ?"+-ڞp[bt >|||%<&ܔWӗQQveOH·eV,SO)˘up\ju aUZW'#Ϣ$ZCWGөD|ZUgq,>;;IRljtɖұkCTa8ǡ}l0LlGu^Fv?]-]]tm5ۀ*5m3S~^Cc u %Iaw~a2W`p aY&}0y>߱u: M)qE#c$k*OrM8ܹtg@&lF?yd8]*;- 6*ew$YځWzeŌ.^,)ٴ?<^k˪MNtg_VZNbeڤSBDtz&',i)=$d ̟?jZi! ZX endstream endobj 465 0 obj << /Length 1836 /Filter /FlateDecode >> stream xZ[o6~ϯP pECa+:`@fOiRȱ-dAC(IHsx)Wa{E n< !H(LGCx{UpSN&)‘,tg+",T!>XHb(HLF(bLl|zo@J1 [w$ldn߽32NOAiA|1MVFIHE=./Ϙkwwo}6N &`l . 4Vp> 45w#Vh54d6+Nۇ_Ѭa,'<RC'e/Gw.$Dӵ~U:IL兩g4oz %>b6 !iCX|Pzqw#7z^M$ypdSw_Wߏ6 <:nK4,h9X_?;hEtEFdVtl;'tv;gҬn+/LYzkR$Ux$JU+i7}蚿h!6V]\ؒT#;]жbqs$pM,ͨ/xNK+82\Rf_N&:!\`ơfXS@*+3BXF$yȈɞi7CozI֘ g4d6I%UZI0?WMvڴ\Êtę5pU= # $6 SϲK} U) b)!)- 0&_`p 0%ȱ_${7XaU9hnh BZʳD* au&.K1TE%=+9i=1cx@Tr!E7JF=Pv=xQn @.ھ ;  [\WAyp6!e_.wq-5r:Ӈ:x8bJ7 C) endstream endobj 470 0 obj << /Length 1413 /Filter /FlateDecode >> stream xXKo8W貀F\rHd^vvoa$ǒZvԻ4 KGgyR4ZF4z{A+x?o/>\0\c$e"R<%BhQQ>9u*ޯ.> H&=i*4'"gFmtREiTPGM/~41i*Q1UpM:a\d^zow| ^$ o)j%)G0M^vTRmah0Clwb5K~^L7ô "IIY^]Yr_-E:}УVЪ~TQUqQl}QnF*jzG2wrnfe}7Yv $6nb>{4*5fUT{W}g}1meÆ)ئWȼ̩ na%|Q,_U Jbnt\fy^}S"~"!XR<+h)(ARqT"QAp(MQSe׺:) D5-WxEO`, "v`X@:fҪ\LU <tm-!HeVJQlP "bJ0DWVrQ*.GhrcL{բ,~$ZӚ1>0[&@UB7anlP8!'2SO 4#\x|cY}gJF(oI8\eD "{9o8Pǜ, BlG-bQ_$*7ٛn"t&"%Fql @. p*T鰫9 {ivV7I;'5 S5 9exEᕜTҠeKrݱ!)*m&~WQacԹs!UcǢfsT=2 xn4}ZRH轨P޴aY5<9']܅0UXWsYwblQDy|8w68 `mYU*үю&Nzs;'@؆!˦>Ǒo3ВK),bGE]XЕdpne|3 0F;,Y㽔^^&,^ݷleh},i`Ouؾ׵ͱ}o wm=1$ZamVVA Ug :>z|AEDjG ]ZDR{Uѵk)38]-siUOFhBsV]C;#ǻ+ <#u0_k"/YP wjD endstream endobj 476 0 obj << /Length 2637 /Filter /FlateDecode >> stream xZ8S)6!p@ -%%IpH=\{zHg~3C:8z?/u]n".8I%0rK!b<]uGemS/~cQyeUQʍtDʛ>5*R-M殑;M }jh/wEh9˴&f}Ӗ?r]f.n/Z^XS<&2iz;rU@{S #.%bOڶErnW3Ab.sZb5yGr%l5uuƚGj#e_&ժw: nZQ4IڀF[TŪʲ34D-eAtX5]^#UYa?H/x q2,տ6wMLhgKә:hеԾ-m_&X*2Oz*CD2,di4vNi+bpke鰄K[Ŕ2R0)~S%ϴ%NT2ߕߡ7 nޅ4az<ń~Vh*2I (p[R'Iy;H2>ۗM<^Z #j!WBY"5fZۢ?mWZw = 󺽅.MiYSf8F"Bx5aX*-`N(wN>l Hn_u4E5xSh_&\O-YY,@8\`1xx Ea/`&a<W.վ8'^sA9L5'6N<^5zaBe6T"g; `'rݖ-e]W`sYbQD!pq0 X y٧3dG< p8.ڝ[% [;uRWOg? HyN62Ҡ'tm=Jxc`G v$UXQuɢRc K%Jў[d->1f҈ŏI $A_gPj?tOSuY-1X-lS( 6 vCC`xhtCAqRuVBnt*MCpfBTk@Ou UxeH44T7/V5qB3wGH=߃˼ڸsD *D|_}d!%3]Zp8 q$li"Mfn}i"aBw$a!@kؑ3f7yEެlE:S&UU#ylgA4MzYIiL̃<0 e2QPͳ?½[nl´U-! h}qO6#`h=1}eN)lhH&P4edWԉ{K; 5';bϏ6ZJqt]>E7给S?ݗ($#ltљ8/x 8M y"TmֱHTu*6?;yܡC'1O҆NZsѡa}dα& j3`s?)I~.m/,e)y_npXU ذ$.wt/~J@PP GDЂВ;ʐ-VU|tܕU~2LU$2o6Hoޖ j4U#Գ$$;WMLPi'kԚ$,NSfOB1P|񤚕tIBh_nDlTe .DE]bp3'X2OÌ,ZMTPt:LK"24KKD,k0۲<^BRsߴmyU =)]Awꦴt?tⓀ*3΋.Tp 203{Yj{х=a8">;<=*)9ғag;dr ԚZ{eqSiB|}evE3*aN閆wxS XREejwn|\5pc>j״~^Qw}ݗ6BKo"pczKU3rM$p2X!2G7my]pgQS]ؿs& wԵ/e~ykÖ3>JDKw-i"8@( endstream endobj 480 0 obj << /Length 2049 /Filter /FlateDecode >> stream xڵY[~_]F "b@؇q 屰Z P7ufHG]Doo7 Fh"T2v7h (.*5觛ek4W'%@NIpF+sd%쏊\MBbNsuͿg!Ih$ H*H"DZGf}[U3_(f-3g$aaΖQEg%N_a")n!' _ J z-6*_heB˶!Aj5쏯^Z!!nvc^>EF*ຟd7—^]|軞+]ABYQ폭2gS;vsMq*}8e۴Va89ĊCObI'rJBv0gf}mP6]^ꪾw! _MY`[?.Y^o3*dyT%peG˵Uh55勸D^U< jNkUkBM|e\P pQq:[Acbw_)CZyfK'TQHa ӓUHC+A4 xXU,l#O ezX؄ ScI@щI‚?uha$1*4΂k4"[zZ*!&jHKV DlsR<ї'N)Ab|##GP{['&Elh?PhF5sR~Gq'ݛѐq9Q.AV: +]A, Dj .;>"EkC*Jbsΐ.Sfo[2{ļvE`cR%SDc*k./,rMQyu7 ުM*Shj,ƈ]pG.I NxgmL'LKuo5P]9`ӹ< wV8߄6c?`X{xϔwbX"yݾAua 7tvgdikNWko[.m;O.Nm^5y$c54k BdYLV/wev 0<ڹ<|/!qgu9J-!|y栳A/[D(Ӌ"$mnd3>AѢ*u6e(Ô$1Ċs8jݴ=m *':{L>x&xCEUfv&^zfEp#@py49pV=lhph>E -:Գ DgatGgPKM/wA}w<כ"TA'jdc<|&]mQj0tVԺu#4ǢMoKFL2IX@u\;Y9yƟwb[$G2nEl:ܛboHeW*v5ƳFgca~y$Kwm'$gxv> stream xZߏܶ~b 4cDREຉ[7@\yjkJkzEgdqH//dſ/8$ 3E&5KUX.,6"aҚŝ$͠]-yӃ.PLX}ߴ0AV'UY4?O_0j.0iƬI%R.77۲*YgNCjq_n}lnvcW73<}b򮠞h]OT@҂& P 0ìI” Y?^Tm%3>0d d:H&yށ8\/,9- Sܰ?LYf3F>2Gʲ$ &* cbIImjs1qRK'L\VSL^,O~zg ġzN>ıYUY8*?Dm?Nc N6$lc Εd"?\r,U`&w*xƩq5EdAw){Ev!a]T?\ܝO=$N`>l$ (6!{3s}$Dg''QB?m IJ%}^þǶkvyW6<Zh,Y\ *zsmIlja^ns?n|ϩUQԵ)\o8<#҄eWqv1%g{ձqP:O R4 4鲺mú3S`^kx/+$d 7X_]C`~ծu@[-{(RZq[2._'u~FԺ+tlv9VMƆw6'Kspw.Hu<ާNU:u*bAH:tR) y#vUyS8ҟ{ۙp)'hޠ?:^&#\ o݄~nfC A&UNr\ y2pM͏U~@tu|u^Sc?6z8V4+ 5W`)T :ߝxxuYP//ouP`κk7u :swz][zAQ:s|p,rF=~Jvi]fdP- 0? kaPxCDzU~R? OX%#r#y ZS&BxP+ Dv-ce>mcKAf Ų4ˆt2xKcZ&GŒr />?U급FT pDS l!FIK%V/koq -&a(B$v@Z(l?l[0$liq (j,}JcE_$ڎ$2˝`Go#GPeoDd"S= m^+[j͑1O(Z^R fyɱޤWtNϑ,%gZ8-;zZ#elw+@9ָ ΊZrYfdvv#2L]Sx"ߓavʗ2θwH=$sM]⌟ 1o M] r8K6'1@WLzyxA~R<}q<C&aP`M⬌J> r$ &O3*kGxWT(6@"p яO# m Ql ?:pE^eU Fv7PSsԪmxfj$Jh^zoׄ0揾4EoL c3*|;Jͣz\D ;5 U T/MʝUqSu A>:D%crJ!i ʔE,͗Lbw,lUլߵv*_`>3i[!$&x~4{zG_W4`b/h0(w;9R͙>VU1gPXHB4BѠ/J'*Bpwۍ?L,!ЌSxX!ˮ/QLV 5}NJk%(+0dC<R2}Nn fX%gԶt\On%⩬ A\u ]yϿL9]pԨk\\L=Nj""WHw)EeI if]mctv6DfoANOͣvH,忥+F۔RNu 1BJ9]nxTǮpU096wExL p F9dǓA endstream endobj 490 0 obj << /Length 1989 /Filter /FlateDecode >> stream xZIoFW2 zza' `|%a.z$^)J~MK}W8xp];#8 !E$  슻/ ?1%W3w?n+ &Prn[]CPJDXqv0T>?wH"Ea^RHp<&v!ޥ=+08\eׇ P?y_%GXmb{i8c\YfUOϪlc7kL䍣`Xg5eU%FYYySR7k@^Y2m^^.ޖGF;HNR!.UwnƣCfv7@Gÿӟ26MO kSk` 硅Q23#!_ #ya.؝h:޵iEaTPauH|;R g!!"W"sF8yYI'z?Z/!F 8 U! ՚C(M.mxSMZ81E@]Aa#6\f3GBU(*А@+`m\}ztpH 6I/pt:֞,/3GS^Lzq vhފ>*~][ux+Ue!*\ e{DŸ K+TU@ W̗q>3m{ztJ@rё;'\H hΪ-BHf<?#+D YԶd\.,bMB$ivNe=&$B$Pj S|]2݌E:)12;S1og4 ^¼#l9G23y"",LxL 5kAbye%2ezc؆"wtF͂?Vue%ڠx-ğ0$$[V0 )?%!.*,.h*\O5U/p@{e᥺PB*Q0m(sWm (hPXitHh}>Xꯞ5]k}AF8Mi?Xfmt!lGefL\fAݻYbJ#߳SY3o]>q0^$Eȱ1@t6]=v,=qnŎVI|l搽=5[}7_5PpD;ȋV7?UL[[/MQ֜~\ثnboSWt ބ~?tw>-Eb{|0:.}p\J7s[y1>ίq@b jTwLu]+T2\T7Lʨ ˊB@2zP'J҇]44ȹmxqQf""&|:׋Pu_4y8{tf8Y}-4RuߗOgy\P:sW0qC,\-v//Omo9h|6c`]eJZV/pQ=P,_n%6M46 gڻ,-ᯱϴ5gv3 i68i1+yqmp;ovl"AfeMyӜkC C~1xi%,8IG~9 )Xo"2eC"=NCm|1;4cIfWgAX7C<>z y?9a"4dqw*l!.˸w_, endstream endobj 500 0 obj << /Length 2623 /Filter /FlateDecode >> stream xڵY[6~ϯb5@L۾&M] Eڦma$qXأi @sH~Ao}yl-"'y“n# '$vm͒S>l:QΡ =s i7?~1:LDdMynպĶ0BCU]0#Y*A߹,lr$i57,L՟T!ʃN79 %ɳaĭ,)Œ!Lńg/E|q'jucW9P`izm7##K,&S(%wtKY-6TY:-6OE{0]Sb/i%sjR¹(p1~+[lOu6ר~ roY<[UqNR)5x3˽6SƢkv}x)񇮖AP^4nm0j;;ekcqezzh28&֪-*T8? 62@Zu2I}cjWќX x4-rH!BBYhGCsm`z=5_'0e W7a YVW9jg=s2a},(zJXuV []Uz&zS¿R~ŋūs -ϒK*؆̓PׇkL#P8j"#Y@%ڰL< ;AZ)ˢw&bpktz8`ubs6F4uod!c;8` :'ᇴ pZFأC9zAuC ˓ 8&%q#A/;F={@Nĺvꀱ6ƨOpmno oTXe2 x"HDHx8UJN2@9z8@lJ)E hH)׉ru1n.h.V*0x#`("fkY;, "D3yv>d٣9o<\ "'}q{(tC.aN7k:_r|1e|F/mHu`c*rP9- `$4wzمe"#S?g疋)ɲaA$Hݢz9rhVMjb ҅(Ԧ1v$$uYI+t5c%Å` >oyPLE9K|eT*d̯疓 F5y&_MFLJb^M{݂E/jD}yʨ x*鷍 q18/_X (׋7A{T }3~P5Ƨ`63N'H]$ }?WL)Cb+wڪV^ <=ь<EW$gmjw"yVpP8}oT4Kg`%)>[)a-W5:-3"&VLq"}p?S]KѿtE֘Ү ȶ18 w(lx}Xfotb3(M[ۀ*u]h_;)ǥ,sdVYߡ> stream xڵ]6=`Z]`kKPlD?r2,)Ҏzw{Cb%J$z^ۄ~"<QJBL+l0.V&?Z7?!+") AJbc ط{3 oV| VzMI F7hm\u=SCgZ;\a^l@{f ~Rǚ \љ|wP5V, T-GeZƔjӕ{>*Ic1wtS4wl2 7~Dx: A@h+ETN"DfNw4x ۧ8PEg竮<64 XZW0=!"vyGrd p o]'tGq:4t2^ѧ-ur8>uhSMáw7BL7bRDA^lCI *rH/d~t\8/"\i(>CfyM:їg[5Rxx `ɂUE B壁(",z$`kć0 >q>ȸkԈ]n >(Vp?cQ]^Tw ov7[Z=n߀-W~JkgpanL&l7fG9|QߧO$@%?<.o<7u]?o o7ߘ3@3z]C0/ʜ;P2A/efrlTnFeLs~e.\ z݅˧.SޟV~O.TYpgp5qVueRVSz?c()ʵE.G{%qCAq=Xz3ov;Bf&-#VsMNrPaQDqs2[ƌrH,.9Q*1L ˷469sJVLE{qݘiT&u)?X>+EuӒni `aڋ"/`,zKVyaj6350M)-"qʵR W,\@U3t=ͨÍy@6u 5 Qn*z՚bUzG@Ei?*HmFQQPZ`4S:P `UBUk<}0 h@hGKb"EӾ#e8"hPr첱:v)}ʮfVksVc -:K" ]$P4^@\; QLE]jl۹ )s$o| FtM?̪f`EbZ9znn+%ݙ]ݕ _l`ROծ,8$:igAXϺ,֐n\lu>jf+߭-? vv %=:KgӴCg{z%#HY1U)֮qdBBBlJ`C)0wE`A'UUBµëc0UP,Ҵ0K]xߕ:^gk\QE`fW\ӣ@]G&.q]c>".64a ,F*1a endstream endobj 515 0 obj << /Length 1883 /Filter /FlateDecode >> stream xڵXݏ ߿y;m/Ї\pIZ@nB5;K?f\vEQIQ0cw̎Aw!pzaYxyIxuwy ,cA\وv^GKr[w"ŸVr"MC%7:˟^u䃖Z~n=A<(`?΁2ߛG.t^@khE@ b|e ODkbVxu"lVEhnrp'yw (Y#Jdg9)kF/EQ{~C1U?K L!iɂ4 HF0+cT B"gѶ]ڑ&| #MQ4,=קp. #{15k02ܢ4r!L%X_" ;p`6Hw-惘Sow5M(_~>[ߣףbb刮ZnXo$MӊdJGс2Q'όEb-Ga8rD*Ϝǎ,gj3(HVzhOn2.-F^Ԇ‰qBuj8nk(/|ڱ嵉{^ՕVIWQ2猂}BL(!gA}m3y[~U'm%̅-G4nAcQBms8=hUsgWÜ `2Cۨ4Sgx%޺.0q6>7-p 핵CGb䝥Xj3v[O^Wg r Kp\hm(E<8u_[[#4mFzۜAkmB_90vۅe0X\d%[99V P9нCo uCI{!qBf`Ԑn}0dh>|o$mFLWׁw !ca73, IC(6|϶tcVoU>}^~(iߩh+$ݦC@ Z ĶWٶIujòmr޻WmΔ05'inmF[UONC/^/ڃ݁-|\gVez[NɀI$ɠQA_$`Ƅ&n(7vfQ$Yȃz#.6e?>锐q endstream endobj 520 0 obj << /Length 2834 /Filter /FlateDecode >> stream xrF򮯠oPU80@&MV)"!k д3xQ×$+rh{f:M/! p'sq512bJlym8_'!I<:DBe`\L{dc.'Fh&Y@YX2g dQU0./K5YEjr} T <#$K\'oO P?D.B/"h0ŋXdtEN RbվKk@"VC偷7YR?B1.+AAqw%{ZD 8'٭nDlLd;1Zdo>b N@YxI^qEhULHXMdF`^3OVOP8懨)aOc.969Pӽ򑀨B031`}Hi!|%B߱L̼aĎyG DuO1WOwi$~P,Ë;>'{FoU^={hW#&ŽO(;$`S?.7NXy$n`bA bozXTi0!!&1d;PT)u]WUIg'O!AlT =_)qA"mN$t%H8V@BS*]7yW7QX_j _`P f$X[ W]V#m p,xeXQqgb*ԁF%(5¿XޚSmUHΊl؇-IT8:C俇>_ً[<(o(>_G:^iFLPޞeȜ:ijjSF^Cހ&?''K#v`w} @̹_(HqA>NNf,63CD_Y|znsQ0=(!%wȆ |a[2Q cdybLqlR `;mw٪AtgjPWrz~'m)8q6KrBk6YT:%jS[fY52[4TT] }H|nUB]w% v •rT_zGɨ =RjhFy 50@)j0#.L:j=N)EgڲlfZjh61Ĕ⽎ }ϙ:ٍw}++`DZ)-],Y:PV.mrP53&yz PAlk]F_}A[6'657-]ĎZPO]vzd NH|t5BaB{Hx%#+|zQmkSt?ݡY!EU !9*r3t4ivz5KKw5xԖD+F흻|nc])5Ug;c{$ۗwcKؕ[N҄[w븡YP*!g[wn,meYq9:T|'!x'01eNxajslT/RM#/2aC endstream endobj 524 0 obj << /Length 608 /Filter /FlateDecode >> stream xڵT=0 +<:E[~ClmRdɰKr7$d|T$J[}&yv(MSB"2J(K~]뿻> JRMQ]XoMZg_aAp՚ln!,;%feK^n66谲ie7m͹@^3g2dUdEc,1`HZdY[`;v]=LaEG"0k0 PI}5(dI nVlԦR5K'ՌAU# AñA?K sV'14лvK/pYezSE|> >} Lsji_ϓ%;1hCF4kz37ڽxݎ'[b{WSXCV  .0y u}s^ 3%~{՞4T `ae ~堯)<8xQ+ͳk;Z=4yo Xizoś[bhM/r-anSIIyNًiϱ endstream endobj 433 0 obj << /Type /ObjStm /N 100 /First 882 /Length 2058 /Filter /FlateDecode >> stream xZM7W*~vwFxY}GU%խdz|*3O&C8pl|NhhSiԥdï/&sɣ/thJd9S QQ*ZTDu5 ɍH{e)TALh^*E dFh"EZ1|& Ɖpab6b1΢*I1W ;B2`=BOI!@FNz ˈ j`צ &a)6VXdtZ]5(N0ԈKXMȢ=YA Hv_D LTd"zK\ Q`Uy013 &Dĺ6HIiSI3)# 1ZxY^*Rx=sJ,(P%cD #`J$gr~K)%.;4c)DUG +Pj) u ElFjX$-2@R#jD]JgpFWW{sXx/M^l9;aoʲ6DT}~Օ^ U .?a./x ;v/@Gk ɫܘ_< Q+PzTdӻ񷋏F'%Zκddl%x .<[:ޔ}M>P6ڃ2AU܇2>PV#7s>^mnFշtYT~Cu ;M^7\@plJ"6'WazaB_a1Vdv.Pen>-s0*:r #1_|6_@'5_7E{bS2bH7Nf:f5-"QE\U__ZUxn˷z/x\p.nSG΄_֞<[8k-68*?cHƿ~=֗G]M{,E?\b Mc\:[>n6v>~/mu7^=l{>Է3UXH?rrzW٪/Onh볡%?PǓw6~z7Ԝ'p`YYib`.Z\Y,ﺠrF"P@ {)Q8&)whrĎ*sbϬ݄uU]rNLzPe?73RHB-k"zn !c/!!dONُtafGa޲p>Fj}/zPhh~ܓ)8oき렰n\=\T~g` `ˮ ŶZ'_ Mx~y([/zy w[ endstream endobj 550 0 obj << /Length1 1427 /Length2 1754 /Length3 0 /Length 2664 /Filter /FlateDecode >> stream xڍT 8TyЊq"J[c..AZҸR9fq2s`GnIV(D+~%RJekWM3.ݾy9s;:>&,,vP D W__*P(f$ Ŕ8A ȃ!s8`fJZZQ(B1p`& ]G,2xW`4T:ݒ80aB(`@pwdB1XE p ҊL&A\> m o`. !.< |L DC<„Q>#DY0큏f 33"=@%Q?͖Bdĸlp`Კ$ BYR cx>!(L{/+.gHG8%29;,G˅Q LcsbhG3 AYaEXH®N Ec`AP,-`3,m OR78.a" ?B'qT*`!LJTwa36N"[)8"}|ۆO[&1<݌vupD jbjfh4:i@eOLW4 ic8j1_rpՃ)&߄No!P8b\`MAfu~"-+ xqifE VU.[.Y0a)&9$lU) XEnIwݪ5CUj`V'^%>6ѵ_? !٣M-e߯~|e k'Gux-pQ?3lt"_|ʀU:&O̍5V' Iu*L(}Ԟ,cD¬Ƕ O>=4Oc^΅K ~YMYjby'I[2@<~ev,{Q^ma ̫o@϶eK*v$eد]W+JCc7 cꯇ :-m!^c z.,;*y7$Y|z/c8 zh>|I$~k"V Е}nwcjSǦ6h?yٗ`bgMʸhk͸MVlnŃbի+Wro9{73"y+Yߴ]yiwFҕrve$ALT]14q7%OO64) endstream endobj 552 0 obj << /Length1 1396 /Length2 6013 /Length3 0 /Length 6965 /Filter /FlateDecode >> stream xڍwX}? "Lnm m#RKInRR@ABBxz?s?uھϩ{FHL Re]]M Bp+o=9) #RPFXNuWHK! Po -P{-$!PFpG',>GPtP0 :`W aK EI zzz 0H7u00p2@Ӛ9 m0B:`=hpCa 4u(7X7r пGrCH7 G80 #/`W ]B~!Q ~s Sj"`/=φpL. o[EP_.?_D_=pue `75EP3ՅU Ư"Oi~PQ{Pߴ7X8W8v_@Qoג`^0(8*\rXɿ<$Czh.?oCV]7ʜ.Q8)f~YagS[udĎ_K9`3NH,YUMp%LޱۈO jZ!-zmř:t̒_?b }ˢ|v{m~G[<޳joUTǣ-P,tȕ gyl@o(lwN>vZް͕!d ;bFM*sV"؈z0ip׳eY\B':>NѴ|ŧ/{Vկ5!d%U^Lu?g=Y\!cfBN-rӒ<&^)=ikStBDk}oBӪqn ^ :n2\ԏR1wʦXK c r_ҽA{FoN7zZqɽҦ#bϺ)&5h)O Ǜxh|x5/HR/,M\Wt1#Z'-M9QܣULc߮ H>+ĸ){Ͳ͖rl?whJo KYkj8|M{&her{*~{[SYqI[V9_'iAښ2JvmN1Eܯ<-6@ĭjsqCGN F !8ѠGmq[n&W*pg6PQCMK2 4Hr?MP 5z<~K.M4$>} 7D U"Y\AL3}3t DլZT9|A%QؒXusa_ : =jUb g>Ҹmz0h_>@^Yq儨]qi^ܻẈ+hp\ F<=ePqӐ6g<8uz-gퟏG]]g9lwح$rou2NyxCڤĸuŁ$2 ~,usr7&js?!z.Hf6"WY_y|k]4|G<`Nt"r4WlҪg`="ecrZRhR>:hX:0 rsx^N^R^Env4kV'73`?@t?1=DOPnHԅ+33q:џw>=3ӹ'WKO|Hw|õI=—.|׬3Ke]b5}{w;vZ\`dڤNCr{d-MN>Otn7,Ʃ$_|e :PxlG,z"DJ38=hQR;\6MX_W:^)НJN6;O&XC_k!埾e Vu6%ELuNGDʹ}q#;)[+Jk! q-궺vg(:䪮YIƾմԵʲj!\ևqa2FbXPk׌KHJ$AN30-w1[u#׷ QݢT^:*oS#v7$D}tZRJ~4ȭϜOǔ~9X=KZIĺjՠ@\kt91{R `dF%=Gu!15.<~779N$gkmKڥeSvOKKmrY|ſV>vo!c7XtĠʷ"(ḨO%q{_2/۷IYJ'/nC͵ldPV/>qל4@w1Ź^;6g)A [kr1Y}کWZYH__͎"r. YƋgZ%c ?&[U,gVW6XU/|మūiD2O+ߝIVsM>T&My~ \DYˮZF=wk6_;g perx>UN \b;_gX˷el^8}ZvhI@F06BI)7BG}wXT5nyh8UyqHdu!xW ]xٌS.w =53zj5Uћ'0GB3J뻱LC7I7Bv\H )QqMX.1|$ݟ ,T:,n NT5:~hm8bzҪETPkM8sjiTWu\Ȼ1_d u;i6N6R|ĵWD:_uq9$y]tgPb܋^olE,ek}>reWT*6l5R9\,r{35cz?> s3\Q8a ~FZL aJZx{0~)ߣf  \}6&7*k6w8hjs>&O9PdmX(HY2IkV˻VCiiކMcA? 2 AdBO]N}HֆC7!ZZ AjyӠCj4qj$z$>yR!vr ] nמ`.جW:*o= ?Z"ckЂHYS~.) 呒$ޕ< bq{}NhʽAdlRՁ#fg@ԅ!2YR}A2Ҵj`cŋ2q|KsV!wg }DQv~Rlsjec~땦loPQxu5`w棓oB3 w]N;[$L!}pdb2O#`z6=4طXik7nvxǣq'gG:@%j1V26˟.QTTOV|pp[5%"EP*Ԑʔ!NT~T$edqWR ʮ #! -˳ZPzF43(+.DVΠc풷i3]˸g`LYګE#(P 7jϜ˫h3edpD䡭؅-?F z6>[<-u"!E(R%Hv#cyPGT ]] ޝAiøhDv| z?֗kM`\NBJygeөBi(r:K;e5"z$szmƯuy L:%mV`XϙB_5i\] m ,rL=S{&-cq>91ƂBM.zKo^ɒk)+n|IP'mU?"z!b ݙxc_- ] L$~|#&*2ɛߓ^nŗ~]SK*!ݘ}USw; ]NDPŷnc1!qڍ! ~VUQRfN%p^Vikէ>IPQ.{KoI SᯓoB*>Q\I WS}ߍrϹ_RK’%zU4wGM^Th-{@uʛR1/7HԊbۆO6 O:枊铆9+M.JȇYV!~Clx[%qYxH<דZn{0ZYƨ;} + >>$! !HF ?3RxQ$oj=4٥y`/L|M7'k< w1C/{.xQgz_֯Ң;6[Nt|T'=y13`e;'HOGӹ"#fNF< D2bca /M>iX4SJHfOW$)@ #Xc3}P-}/vx/?728Jh~G ͂R$f-ۗSkZ_f\H =)efՒXt,ɯӱ#ԾqMDw#=)yt9^^+#5^3p L"RW"Ů-vsǓxk)VKZ1]~VE:E|kޫlfjxk{a.\1H>!pf_M ?<~QGspRQu;j;> :.>^Gu8L"D{@Mqߴ6h,uȽj:;b[m1O>{zGiSD{XِwDK(xʹ))ۚޕsjZTk*5}U B8 Ђ3tNz39 n Y{q}mAQߓha!ʒ=1nkK۠ D>Y=Sf(g'jgʟ&G'2Y m1t;h=w~ʳ9_-w: 8 , 8_.P> VPFkqV}bAJ~0jE߂{puS\^q:㊞$eb6*oNRy2]qŐJ8([1'yʃBQSiW:3 R@\[rYw%=ih(&^XE0! Cda솔9OW}ӅE9hƕ-waͧϙ+8hqQnC}3F*ԌQb]cރc6:E=җShb]xXՂcc \Uף DYJbK _:z_Bf,|Tu*oCe\ASΙXT-}MA{oif1@ ,IpAӉOR endstream endobj 554 0 obj << /Length1 1478 /Length2 6403 /Length3 0 /Length 7390 /Filter /FlateDecode >> stream xڍtT>H( R3tww30 /!ҭ04ҡtҠt|ck}ߚ~sγgVc~E'D GRe]# B&P &0 =8(#!`S0~8@  @bR q)  J@JTP'@ xs(#PW昿nGHRRW8@ :]09 #?Rp˸PR>>>`7OEE 7 0@L` #Q>`$`PGw ƚ:}wo>@J'g"(W0A.g( W@`OG0{0W`!!#~Rs˪p'e$Y  q\>#|6PON^pDS "7AD@0: Loe1 g H#{C($(? @'# q‰C1GB}V@@߿V6y9!0ꯠ!o))!|"@()2q"i ?eG&]- B5PRS, 5/엙1ݠ0?z0]!Vro& E _TB (Gj21@xB>+~Lkˆ-LJ#_&fry*sĄD`$Gi2f' af KA8 `H`LJi bQ#e c? uyy F_/ q$G8J? o WnW)Iv! 4 l?"͸5#cm]SocXˬ`֯E:jҢq8DN։吴Y+ySŪiƊ.VO]&a +c^z<9KBlu<YKlhoDkbϳ}s %wbWϲX'uh+n_. asxLq;kYf2!e߈@X55_6ūAśZxSZXZ(4g{8S ⻡f-ccwc?TpaS}oX~0XxAB2dL&3XHz-mt2cuo>'|kau۷)4$v}9xVϛ%| dD@cL'XdbuAHm/W4Se, }Z֦%W4SJ0Wb Z7y;k3 kDASKSԠߍn2h =}Egg5`a}aN9ﰜSbG$i0dkYm8{^X1x30Ƃ{ȟ޴mv?U=Jwx=+J_I'[*+i^qw_z %ub9Qղٍdj lٺ/{_CIa5C; Y /C/ޝ)C9=`ު!bDCB/N= 5;/.Wnվf~?oeD⵻A+Y&SdbdgRI/vjxr2vR{\$5P/j4V-vΈt~˷dX7>da+l/NWoηJo],kz|2JRZ=LY>kbSoaZ! civX0;iېp㱁xO(l.Rf-޳­ϑjXH3l"8D|(a$kB滔>s][l)?S|e3 }fm=,Ԅf?~VpdkViaN^[<(u| Y~crX1HZ{SĄ'jD ~6#oJ_$dzO7jbԞ=&[8)V][E?v>1 шȡF`~Q%=T4U&ܘa}RL4~T`ǘȯ09v.A>Ae{@ o2z.MXebjE[U_7lIB']7g/JxͲ#R{;9z=bqf:ATf4>|Dz\4(.UpuTQkJR꫐󇒚ߓ3p?_RNPzrG֖v{Z37[- 7v̐1qO)nhEk .]i`by3te:/E^˧c}::n? Vu2S]~~Uh+X[QՎ{I>pb1"-={CwRAncD^/m3AC1=]&==$t7^'=3Ƌai>;hSsSzv4D:%@ź1רصaKLCi߻OXYnopԢ >_d0!C}m7,fVۄ2OqDͷsդoqqQBc+ [54FțHm+LҮ][+d4.68שԸ&L3ck7 #WJ=Ē$R6z'8lM~}ueE>V]ok|iV`,ERuwT-1Mk# ^3rc$ihF& wM{V2q "~,}Q}-A´0̇lυ2ǨԢӃuѮ$2:$bmue@kUA:cUƔ1R!1m» {$BVj&/2g028nMӅ\B5? u+#bZʮY">?74Eax켌i#yG# mY%cQȓw,w.&_Vl; g+|ߜlP%/GR"K- e #9i/4 F?`[]dh0槟3/4^5/SDsut̞ѾS0o-g޶\1T+mRjYt;&Ui9]W '+wb;#{|UqPv_h6.~/V IRwu:4P4lתjs^&\?u?F,RnѕPKJ Hħ>ÑGj؀ϣ}_O*F!|=]/b:t9M9hN64c'˅i^qKGcJnhT [Q5fB<b]iIM3A9]쁱Â5c{,m_^s[D.7[*\xcܒPrDC3_U/q_j;v4?Ī7|<l佷X=p7m0e_}2)wb\;ǦZ+-iChg@fi/snNN0cl'2*_ wtGrc M.FRF83T7.Ney,Ay RpJR9l0Grԥ +Vv4I@opw:-e.ҝgρʥX{օX6&ǝCZUFe> stream xڍw46D/wF!jm0e3zNB ! Z7>k}ߚf羯>5lL:|vp I  Hv|6C IBFlJ`$ j.0 (&%(.B @A)|=HTN[.@PRRw8 ڂa&qEUp[(2H7?pHG@xxA_#Z`WȟG(/> ( CB҂ 8ss(%fe_yxs`WH4()jK;{U`a.Z$@/_Js :p׻ˇ3@ R?K*lvd&$*=< DEA >i HT/{ST^7m==a/$D"ٿ;jd>uWHә,=1K}DSYV+8p0i>,Kҥ'64H6^Z-ъX3\ST:d|nF "9IY?0b g -q4f }I>,T$!Scx")[-]AT(DŽ) Y׺y БѶq9ǹ{Y",N_.6ɱ`c--|7)z9ۆs''ɖٗ Poo|?!r.tb K8b>ۢW5˜ ,]1smԲ.dxQ3"^,%LV?U]ϵKw#ɺa mH8@ϖ pާCĖtX4Vۮ| 5OHDZЛqe>}SƎ6B]1m\QCnO8<9-)CVkd޽Nؘp!s6h8ɽWa^?B6@vۄrs''|Ū<=女5^Ce+5z4{ǹSU(mcno\.g[ɻI!)y ǒ?Epe庿!-N^ dxܖ[ Ɉrݰzgͯ֐Ki縘mڿOC3 lIg3`4-f%eu"sڪGi^QPs(ȌeC^|sI~~0w{ˈmlSJPl._rRDtDbL)VbZ$Lj^|tG˷HXgs{)ϔgI O\=dO$ I}5xpo0+3}vD.o(B_Vop+zXƼ9Nq|ŕloAI9͞X+{;ļp)9Pxoˠ#;lnƳ£(틥 <70ׂxfRChE׷䂧BTkPa+d'+A ۹ø2`C.Rϧ$wDݍx^DC>UW/Y\us󊩓9$}J!}OS|i(ڬcAAQL ktIsxK 1ŞrZ~jHY}ԿAu6U! ~VBv-۫ 4Hfaj/'WMYg,TOZ~-ܶ9xcUC[/-_(~r.1kn+1[0aݱOwȦ;@ y)QSa~1|mxZ\Sx Q&l.~uΩje>w̔:F~[Kr09&-\FTQ=:y1R)'@ǔ2cr-j HS^ 6ڐ cA ط3_29ahɹ1n BcuBJY *d)\{I>n޷ ԰|Kv-!5 aV>~LQq1fDSLI.9 -ҬSG |"S@r\׎;H\42x0yeAReu}&T6JZmH<˂ JljdC-Fx@Cj7̒H2iA*E S%3~ 7CQ\hlڡKR1$1LhSn7\K>r᠉qzO42ĂCofʣw8=0Og/ y{8;ැA. ߿QM=)v# mo^m̡*yˤZ$IkD߲މq+uYh]xsUىjJK9;{7N#,[Օ BW4%#CwְZXGs(c._WӅBQڅGF{mO>^Θw7nUd;>Sy+m"r(d6?GTUjW35>hqߩwnjw{ۤ{sХBǝѸ X{AyU'7:R֓NE0hȊUo&L՟0oM[02FSpT0 q<,6cFڸ'Ƭa$`LZj]N,\|T(EJ`Y$֛)p=ת@sh/?;빩K*s4IR'֙^@(٭̝3 ThzIInJYm{0jFxbObhfޣ-hi4 G*}p(>8j3%c~i63WǢsr_,O f7*y &Ei^q^( SOq2?PV7a*vgl7Ԧ0@d}#y%4÷o@Yqx1+s#VI3zsoTr b2C7ΉH{WO?~B}|'p zX,-FguչoM'_uY~xqvGK:贋bob"s(-퀱UʝqۇI5/LҲRfXR2>TH.iի_1+(7b.vTH%h]o"+^,."T'7:bZݘ2;M'󒢞]{oS W.뫇}UFѓbRYmveS/ai}{쭬vWE٭,DM5eI\j캓lV1".P4DO藋/~]qS6ۋ9CpH(Xʮ Nxg5r Dً0wZrUO=J"V;g *=^lNe`{P`Uݭfjc뗖Df/$΍"GOYmX$&kHU8MI[#I {ZDollS ?-E53A?(q8oیm1;uwN_6;]Fn#蛼1.nugeerQSK>LUz֌uDcuԙKAӐ3&BO2-šZt ^VTAO/s X7d~K}/1 *,gZ.'%c=/U'7>\,Ң8z@-4#!ɬ\AGto_sΞ6%*Um  hws2s-ϕcN] ؊u|#{5Hm ]>4c R ˼hv0c+ χ6t!Ņ g endstream endobj 558 0 obj << /Length1 1456 /Length2 6520 /Length3 0 /Length 7497 /Filter /FlateDecode >> stream xڍTk6L#% C Ht* 3 LCt7H H -*R"ݍzsZ߷y}]NCe(FaD@򀪞 ..)*..Ac `Iyanp4Jn00Sc8=4 @HF$+/.Hvp(' A`~(#anp10$vE!p_%1y11///Q0]pK@cc;~ 胑?p?~= Cc3 nnn}z\w;Cn$EIgpߙY&v~N,K8,1Թ(Ƹ/TT+lXZ`fƬekhvG^L3-#`=PP-V+UPzWM4הĪ2Nkll<)z .a&cA4Zaj|)yrK1=Ȕ$l3[4[^v^pF!.Ul%l3_Ibfov誢ew檀1/vq2qљAt bf!4s{@<'&J&+h_ AAJa5 \ #0 ;Y)‚.}{HnW*N[3Ϊ!jyI"Uzy.`+aPJG1E2PJKF~nRETBfȳUnqjҕ(H CʸMT5q8R!Oϲ)-opK:4q5' /X/[ O0|rt!zJgDQTyJ0[F>uksIդwT$|{<86zи /<c;u "1%B*6 1!"F9D5u۟՗(?QIP؉t XK`mg&20_.F /%k)rvl?+53mѸjrɧ)mƥ" 1|_v,`3Uf Ev%Lk^9xr9F3g#u[]Hw<,i4d~8yqfe򍍟]Z]B[&H+c 镖|$LxIoL斿\T&}Q]u,IKeCl7&Rܑt=9ȡ{O WyNd#}my_'l+M¾n12|zQDkMmR "{,mJXV/Cƙ~xvL)DxĐLdd}k$B˛֘ o+sWs5YO.Qc-p1aXH-졶]G]IۍޔZg)9s+ۼWˆź|vSkeN2=uB>-mrNmE82Jٚ.27 ^Ӆ%,2X dcdR9%+5ٳ3[5_%G>wak)Ț=FZڻF ˬNHʷq&y q^m/_P!uQyKshsM ^|v*#)()|S`XSJjVo?e2@>޾-SyS/&D|-n.롲>m:#hgc#E\@'ω *9Hϴ TN8s:űmnX$N`)]W$6*iLa)iϋ\5.4H9:]63b,wQ+++Q!V!tGT?4ѱ).|Y}MU7l7\z ^nj.ٝyID=+t;xP<{|~n1mnG_^B,i]6UՊu g<n{d>7JfW?۶`bO*QK#]S.cN diw(kJ3^-K#ȯ p)6Si-Yms̄;>Ο3f"͌EO\%/ y_" q1M*)3ך96ZɭlH]q- B䵌k9uMvk"疠ҘpޜNQ@]0]$Չcd;9}9>Hj)X l>M(HkmiVwhvr5be+O/QaZ\ jjT7 ƈ?hd54-c}ISksd3C}Q]>H#ݍcKuZZ؍*7մNwRhM!኷|} loIB͐w$MӶ"lz乯CnNqCNpkΡLedAF5,}*WK. {pb$~E/{p7e7 B/$= oק6887L]d0Qtsp˧d-99`{fWnfl"jB[:oTG/9ZAэ$6DAB2MYCڑ|asSh1Q7_NUA,gsN5I`f .B9zVVg+Е'O.˥0.?1',?0@ Wz?I,]e0l_@- ,B\VԆEYZҦ^LJﯖCRy}˄9-f qb+*2y5ʒo8lMA*,`QuhMt ["y]cD/})lE>{%;p킱18YUOQ΀&XcDT}3w5c~7RRs[ G6g=a[:k+MԎU#Չ,4S4-^3wŬ$m^YE7<`2tr%Vj) _q;ȝG4txuDϟFnau|DQǣH;U4/ թdѭp)VG*F[z@WewWjDu-'JIYUaukz`YU&eu:r/ۂ}Ks/|D8pV_ToGq! W }7 ?0vud\=~+NI&ğ>?@:p8WNɃ.U#m-;Enߠ^@hޛ2wG.͖Wxw1 9'F.?/0:/ lu ϓ0)Mrlwo-_q;7KH;mX|!q2ŋb*7E}l>ߖP%oԼ-Q3858:]jWA;=ٚ_}1坋S2Wy Od*j'fkc6V}k7۬'0amZ5RtGZtE#xx(tM8pȃEu(9)O{,09Ke%yYȽfx _ "5^:AQVNN&%[~bR)d{y.bOcJS1~ZNFD~=-ŘC6X/03Fu;z$^qަ) I{{fW;&YQ3^ԠѽyɉI$i2t!s~RD؉UL弿=NëuoG$sGQcFBq둏_L|&>-U6ی +~vRqaDW߾ _!mq3ӼǾr$yѦ^gO q+WuĖ.y= 6Ru,d OOɡ,2}:l%0|R׵`l-TxQUc;҈jچjO_})WX= 1>:5yoM~kٓO,_QƯ#v(9S<&ݩv'Z-;W'kCEugpU>g/od9 wYxm2 ?pm|f2Ilf?=3.s2|׿N_8GRPL3',bg|V`-S/I>$gYV&6?'[v`GZ@"h-P[D_Tʥp&if\7ϙ$c'T `7=Hқ$%eB(|}^EJb;Fod$!FUv~B`'܆Џö)#$d$G`P5&)bﺚ~nHZjyAb &Ҙ5ܖ3 P/Dmnq,lT i KR?`[wZVt8wD$ 4i?ʐ)7B%?fjƄ4[10ڵrZYu[JHVsBW2y`wET<)+ULRjrGf(/ޚ+RyU[){(3i[ĐKqG>ZԏQ10?'ms> g&p CT~>뵙aۮ ;l4|4 BhMɲW:s tyIJgrUgd-?<*-ט vY*0W@3)pŧ3/t]pf. >+<=4؉ cI.:chUT¥Mn-2T`!Mln![ugW`V+%Y9;,Ww o]롚7k3>~k\1Q* Vvߙ?XIkvZZ(6ג"Ӎ #{z-.*H> stream xڍTuXIHO$6;c`l0F9i%DTJnD}q<{:|ۡla*($*j*< $`c{ `Dl0;"\ +6 @@XT @Qh nj0w" wp\u Ey~]`h8jC00Phar`\% .|(  qahO@ lp?B({ ^9p( ~䁴WZ@]W.gBpdrq }H=ha1<@pG]CA/XW+j/vC~y){2NZk$݅AzSΡː1GuD;KQ&ʗZč.`l{^t ZOIcєj>y"!dl \!WaPx&Q(}%~VRx&Lm0_N-p|}1U ̝wuQZVV`4gyϱ_Rg\GZDmɪ*,M:#Z[%韨;)OysnWydmd/9E,V!Kdl#!?h P&Y? >PɚSa WGLI`#ifa uYf!G>a!lGA[i߾}g49{Wvޗg:6<(OFj%m5=q*:z5tMք?BZ<6(Ewى22G C29*m=bk^ekY7ɋ6iP?7Zƞ㝕Ch؈ N\'WF}lz$B5%{9PhM- }0_b<2,|DfitV&v]kR!Q-䮧m/ =RULƀM2`Rm~HLk[󽵧@ȴBGӁ_1ds;ė#'ȁ.WuΤ*|~4$?СVIOke֭*NA!BR<$pΪM,~/ GRgĔԟ󙷦8H1ް*jjwǛv7d@I1FG> /HooO'awGD?:t2,"Gtˮ.)ㄑMl& f' %/ǜ[Q}sVlXbδ /*?ըeKdXcl'. ->dHFj?)yGL2 /?k>1;`62F[vl>nQEGl'4\_vP K"TCtm1Au !ݓ\jM~O׆T_#e{>v@t4eFeѝj\w**09Gl:"e;d{ywqV S0 N'UJ\CDtwBw ^NY (dz~S7iM,=`NdwOngPlJvogHPZsWG}~ ?.p?K{Zd+#&RW~?3s O">R{&.`IhՕl?QSEG>xGew@%mo{J(]-5UN{wȂOdƩ*&k0AWZ$zrc.Wnͯ?wIܙIW"1{Ǫͷod _}|Y77H[Z.^L*ML{THxZ`qh5m]ȋhk8G`Y76:?D N1oCe(^CQ4\ApE-*!u:wVzQ.vs>lVmZY|S2pm&%ad|4sCO>Otcǭ~\8[X^`4ٔ&V;bƷTnn)]kuhB3AƛQAB rcݶ֩5vZ1Ϭk,SRTWQ8mʙc6=WEzOBZ 0\Ab+"$&}hcظBSP<v^ )x^+pU`l;VdJ/uь#lm9;^1mbMy(>jJN 2ⵊ 8[v<tY߂[2%u.;)7Y>?>O#?ێ捘w=͑jZ'z3>`DUH wq^~I T:˷t3ct]F$J-Q%ªWp!dɦPEkDG'D[_jVΧX{*^ڞt\%Jj*~#ȼ32ΚtUk΋sC&LJJz Osj|HΖr ASڔ4 ?9#G7iŔEb{~XkQn̙XD(OG t͹}KMa4 GvHVQ. Zx^3$e.*HH|a~`ӵ{.d\%0oZb#|#Pfw܊R;YL 칆 G-R3l >K7]͖if,U# J7ycm9tgZ7/7 L )?ur _X޾ 1ɢ\hfH/)+~DƭzϏ(%"qiKD(h7:Uge ,6Wp{rAf|x;;Añݘ1MXwY\B{8gtᑍ)wI"V K5 # '6$wX?ږM%nQSTagȕ㼮4[d_I}~$x Qd_Z6`=X>nXܚ$i 2m4d?Cݘ|O!OQdyԌK*Y3tMH(ׯ X4x593b):?RsMQZu;oi:YJ h@ަ8h,+EK]X2[+8# :șRx9v`uJ>Rj  R%qy? ӟs8"*u^Ez+5%KYC,ޝsj T|=4m}'v^st>ۃZ)qt聖"76wzh$*0LsQdzR5 Hn=>R]]RcҼ^ [I> *DJW+Ǒfm5[k (^&ޚ.:P1gN|X%']gLnEɛj]jS q/R6T*5ӽq>Bvm"+A7՞ʲVeVVYa蔊0 C(ҿ tQQSLОj7c.B4$aLq$5 *!MwG?/%"ޯP./0П=oG2OAL#߬("?=*{V=^'e-2CeqU|_шgZ`k3 okϨrny~~Iu.9<NJ˂`*>_*c=珝-SA=Cʵ]Q} pЃ^/|=MyZ&d3)I^D<_b'26<fpYݷv;z\ O!q4?qTb=P؝xLzK.s~q ͡ӂAk `K-ímznk1l=;\eIJu3 z{ =I^DDlx.K@̭ N lPh=:C1`||Ppv5ZaVh!.u2@MUoλfO68 BĽ8)mjO~FjN+AYbax`)ڌb+?Ӱ:͒[Ǝ9uOY"= p=<^Z'26H?U%_5<3DU02$氾| Zxg|CO/ h}+>\lh~{BPf8ABOyV Zm{5n0p pK)RJilT([مUw1\RLs>Rp?eu`t{aAo4fƠ>5иhYH 5n`Lq5cZ#\%a endstream endobj 562 0 obj << /Length1 1748 /Length2 8035 /Length3 0 /Length 9175 /Filter /FlateDecode >> stream xڍT[6LII# = ! ]30!4tK - ݍZ߷fg_u׽gְ2*v`U8 +' P64 ᳲAP8> $Pr(LD0#(@P (*)(&) w(=! 6F*|!NHTA 1W;hN`WTF{ `> !DI{yy]|pwGYN0#`W+Ok|#'/!tPb!P.00躁a"l@O?x v]݀0Z|Ho$"8 @v(ҁU}7$W6@JpWW0 U2lw?{^9@` _m* ҃ R_yB``=8Ay  5d.[o5CΫ~ (G5j%DM%[~>rz 8 N~ hF݆_?6:пB(;_.!Pjg!i;#(W>T"w\Ԯ𣘿rP' 8 w%5FFEp<Pz@7'& B]w6P"*ۄ.QG+Q!լ kPr(=Q*ߗ( ǟK;︬U]^ZI2AͼsVxh ?7[9>Oup9]nbz>MwU`;G0N8*JzOOlkeɞj:}!-Yi! p0":w13,#$[fzi`<$\(vQYLCn_oIfOhU$9=GLyC)ɹhl"JeiIElb?& ړ=uB~l򨇋Lu/٬}'ߒSZB;<`Q2;n'%ZMq8ac/m㳓d__*A܆L篥4z:LCxT1ζZ>t vGY)&BdIn9Dj¥"Ӝwp&%NawIYK̎1'imeKF(OWW~|!"&,0vHRzW$;#~!\kN 'GȇIݤ-E#|şA6䥁$| 𮺃M+'ʡڭJN#[H >iޭj- RyOPao^_0d<;)jM8l5ʨzK8HIA5j4; Jti(.Z tq;gs-F3TYTnXF|kL$0i܍{=o?mRY]3=9#>O5~~Px]y*UIjnP]"U4o8Pm^ >c-o/EԳ:ϲ<}%+7eS4PJ-Wv§&%~BFoTиԳ(&/i p_yHb34Өw)FD tyK,h1ТŪ[ J&ǞBgOKqYrt' ̂ "`U8UNpZzC[$G8*U3R@lrc(/\UKSm1kRegk~YY+iC;WoBJ>+6ՓV u0'a]teVORJ?CyU.Rm`|"}i9τwq<25j=~zbE*MK\kFOZYf2Z $Ԩ,+͞kx;Z65 >a!zEUxsryOFCW 4'|z=ݷ;_uNOVgG)5l{l2Y5 (P%{Y˱j2uVZ  t5o/CُP6~OZ]!/9 petߗTݚbi, ZN*q?,S϶(=k} Q)D3 FhGp5;Ѽ\3\ r&BzCYg4TAb|O7zdA>F!=&OJ>:* R'&ξmFӾnؖܛyNϵ!>:\cyN\Ƈǃ=|m'X;G#uo)rѤ ua3 $ Ry:~OHR*e4ކ6y9Ώ*xbx\.AkrP#ݻuZ&1gn/] A#Vml!tA4kno{qp)">|fat՜tFh AB_* qiaTjˌObwe۬n5{ES-xkALeWaT>ըrU~[8VklYiIJ:rKޭgܕSOU-󎺚t/YX^ܣ:+$.I'ڙBcP.ʓR\μ3VM*) IW}~8͍g c6i!gGUNQ]m6p'}lM5JK:hMZz/#=dJDGh^SnUeO3T_1kDFrWtLw*8q! Zl)GwdIqPoRS c /SWZ dzx_~JWW;1s;hȪ*ߧ}>w^9T`ق1h{dD8့'=,:![YEp{z]~ x !=*4Y*$-jz{M/[oͮ.\|c$rbD#KbTFmbcW,n`Y‚lm%g*dIxvc5bի~l2M+_˄#<NL ܟ졛;gJ0E<zn?!9 N;\%zȠUֻl\>.ר`xڧoꉇrdnj Q)[{q M;OE{ .n9h6ęY OCuSRl6 XwľYHղklKQa!Ŕ%gtĵ  0I,AZq$YB[EHg 7 'ku?n1I^LEƓ9F$yOF/vS{br%VNs9*>;H8RO-KťxW>֎ҼGso i 1mh>uzppFt=5Lb. !>n,=$]wyhn]4eX5B ōaSiZV{NMT)DnG]4օL%dʚ$c΄QMm=% gIZN dp1XpSTz!jEyҪkQwJZݏ@sYw25 K$ytbPtz \2RWdIo-ܫf,FE IsQ8flz}㓟u*}Rn2?gr\SJC!xߏwmqKR2ZJ5D5o0jéGHO)I~2ͽF vܛt#f5_ENVE^+t)k2Prpr(6 ܍T`M Y׿9QC$I{nԲx5$0݃t_є),`˔H@aϖ7B/I掏lQUrͦFmzԥҏ}ʠLlމmGwˢ> x2w零ӽ6KG}˩ sϳ{;2bdg5_~8Q j,Ʀ]Z&"t6_%nd&h2o.*_xx#߯q8(/>ϹmSڽ?sLGi˽=g*IWT5}PxcBZwyΡ>z_JEבKg5 z)QAe㝙(\n|%.m3B`TˑPh&Hrjۘ0G͚9FYM۴W-2(jO;2yOҖJЯl֓Nc^qk5w_T,OtM īE bDgyϿ)>4WQSS=wF0q %[uD@Sj]!}^~5 `4f -. ȟ4=ι. ;э $FljA gkΐEOImx˻+5? r׺å1UgmvVRh`TktJ:$V)/D=UNU`&r'/U" J[ 3iȉמI;+s@3rro@EA j',U>S[& a?|m4v,1+csFdtnXs]XWpċ &ՒeG@5Ăp'w̠uDs~dI@pYJN,{mRS4ZQg߹jWqc*']{ \h' ]^z;;vzoW0e]Pu:w?FF}1{"(FG´ "@L8]Xr[3 xw뽟15 UV x =3Q}|aʔ;NAKxȄ֞` hNIh˴vS[+Qm^ RR:9fy#o l~JSZ\ JpuSW\РAqvh *Ǐ.PfYMe4N'B[nu/~T0Cj=6\%a̴ J %lх?1_$㙙AfGGvԧ,D =ؕɺ =uMq$|EZ '9q* NH:A P'0h.nk1urW|WmQ(h _Rl n_H XK <*~1cIOgJ'7j;<sA:J)~b x7le(4RuQp&d%/z!cB7 2g)Q8q:wzB6C .lDC`\T*bvvLNt_] ]:IJHo9I9*!y@`Mt3RP%~^sʧ,$ayL* [> stream xڍtT.)HHIPJ ݍt3 00! -JwJH(! sw]5k}~~~ H{JTt ͥ@(Lea".( C"Aa1U暧D<!4ED O#B"h". 脹_0/@HJJw:@Au  `v?7@z!.`ï! nTS/"ĀRb@; *o_Ot8\ 9@ O(?WDBB CaTחy,f}-/ ji3cHo_JL $$*> r5Hԟn_{_sYKyZ(?"oN)W!58ww\apkz` ⿩?ՁB`Āp3PC}G2p_VP}$rW_`ZCks0gb !^IXL 'tmH$:p=c"uB@a= ¡__%/oy\7oCP0їOH'-'5J^KC7f"{0w&s 2ݕ tK>3q2mo{SEtWWQbL裧Մƺ,vRN_vgNb|">G]`bLqbknD=zRYghuFUU4l14kw3];;/?F/sW@Q| KptPWt.5bQsSv+܄f&?o SP^l]OcK.S"b_#DJlxf`xg†:zKȢqQVJ{?DE\Ӓ}g/%‡EPSvM^L):96STкP䴬bf}OVWsC5)nu޳p-fD S;2D^tc>b}R0_pBc".N}zhۂs`nLJli%v%Xwңwf0{{2e%m2FMrN{@s R(l|cwKEՅaNus۱.m4[5O-?7ou0Pzewkt.VYegTy9/Ol ([ƲdѰ QP #Q g^ cBۅY2vu𗪵CCK-5UǮK\RGrp]k 得mVY7Y豸Rz=x_} M6*{%$V"7Ĕ[b*^pܝIPRf3W/tZy6#hBYK /Yuf3KJKĉ\K+z'J,nB 134!LW"~VcR|Բb䷛"n>:W_LE]' ,6Eg&j vGӵ}ʸ Se)_0~l1e`t&lN_¸ Vb$VFȗСk,K͒ϏZ_W`"}^ה_g1g }JlEc5ԤϧɁ[L,19NU&BjG-fݼKTYW#h}K3 ? (-Ⱄ|~VMЍizec,5Xv =0W25s{}F^җ%$Wl 9?VFExDidxIh-kb/m#㤀qBuhZ'b/&wx7w N[dnKG[ !/A·k2c4I <ͧ/v}ƬJff7"V,FbO<,Amęa?<}F`=Zc۬[h6u_|Z"$J~cw[ff!ʬO^r6bg27ɋ)TWKNg(8_kWnVnZd0Hvg/g~3t8i]{+e֕<~[ƙ#@ؙL˱z}(e/#3GzYL N=켐&+YIfL21-.ԯulfdCVmh*MgB1v]i^ȹ3taAATH~a\p|ۋ"cv65 PɷrJG*\_BùɳOqKx+9g䮿My*22]ﺚ0xH㭉㙫dXr:@DOj׻ui,IC-;Z9(D ~6٠J$b[i?|~w*G$Z&g]>26~?t~mht7TCERK<㝳<4dob8 u~IPOreȇ +cGpp1aHINlzZ&S{OmlC_Ei[HSN䬁W,um xӹYUV ~{v2&-4..boa?ks]F hA6y">k웓lt$w)1Yxّ> EjM h*T4U`QBڷ~0^y ~"ӯ& z'dصS!da-@d&>maG#P9tFKzVYȩ9%NX^A4ا͜2c'kɹ)gSp]SCǣ`$OpM17[s1'&Oǃrmqu~95~|aËnCTL?bsu}~\ͺdFj lH{ߝ4ʴ;ׂBmA͖fҠx|jԦ,MF5S4šz7X*[*uV&I1 lb ñIiH5U9+4Ngz6=ŹeyT{cNjoh%0\=Ve'ǘI_ޓXvKv~[ 48vxu7Z5b$eاry,uZP~& A}O>yT~S ̶nDzFlb8=3u(1w\qE)Յ o){x?o~* QA0vrR^UB]' }D7!]a1^ӀtjiJc.kݬ G{EūODexPy `J]WFoy{ǰ-p}  eS*)qSMpFQQa%vy#I7%e|9j5fJG;3YLniͲ/g#4‘Hyn$gr>=1㠆bvGiDN&,3]Rjaz/¹'}NQ ]8~9P*mɣ=Cc %hMkjcvV1f<+쨰=9!H΋.!qxo{6׈{&hmN8b}hcZ1cL cdL4~,N5:676ƉZw$=:U3ۯv^/$R4^SJ2R|+8"XKG1e/d|ݞs/I0*K蛇B!OmxiSyg" _a9di㚹XN}<%=08J9y_^8_vW0 RKlVi Vn#s>+oa՝r2%ӏ+܉"~¬ݪи{}eiA(t3<-22a$YYGA͞EZŽ_ӏIhS6\ADGL*`,4;xGCqNZ)l'G+مI꠱fǤκ†0#{Q,0 ֖'&<Y@iL|,ሎ]a5%؛R5pm$5b8?֖ɮ/ee6$p uEZx*y3=_Bz |+Ge]F\Ӫ.) aZđDOII"R<8a߷] fYYuʸ]mP(_EF]Вl|,}A-όQX^>/Z8]t{k$r\`|yC$tt^&;e WT"ϝmnǧNp+}EB3xi|6\\iY+p/{x c9U z: ]> stream xڍT]6t7 tK0 0CKH7Hw ttHHH7HH|OZ߷f뜽ﳆ.X+S0 pc11AvXL`A GpQj yy!:nPK7@ bsttZCuy|bb"`(!`{Ċ @=U;𸻻sa܎.lw(.n`KOM=oiXL=C t;(C:X]*-'_d7o&: @N@O5 jh)s=O"戈v@ W@6P>qàv?5LfK9G{{>y wOdu)Չ"7amB3\@ ӌB@,o }ta, 8l ua["ڏsDY::y:b9%]]%%|/  >M ߡ*VEl?࿹4 s^!^5,>ߊ]~Y"@{ DC>5`KzU@0:XP"l A~5_?~|xyLJ.-C/1<]Qhs@'/|q{b#@X9`i^AA,H^9@"FTc ~ @C\ !Bш[7BnDbp m  삸";w B#li[C7>?#:O2` G?"rz=& 2D?{AXӎ Yjw~Aޯ0m(P}:(܊Z!/5 5]~)N6[ӂfebHzʿnd.`iMvԠMfds*sGI[}}n8AWNL0¾ʌ$(\ ΕrރQ:}ܕN Lf>`@q%%}C-hʩn# blßiµ8B\Hr5 ¬>>Zm#gT6ލCX[H,(\ra#HΈ D~F?}0ilD>Uc٤x-uneltiEkoߑbs%vʁW7x1$hֶEiv( gr]ݬ=w> ߨjWR..178]to*I9JKԼ`Y0ѕ75c:hL JUL9 ܿǻ${x Fx2ۨvYQS˶<ٛO/&b:* fdcQk߈5Vв:DH-$'d}B[X~WP)gmjc#n@B>QD鯫&1GIg>]Ghc-/%ټsb{Lv|V,j#[i=IjU=JһfS=|Kk6DH` ֱzR>)/-1 W/5`W* JIE h~?-I}IoεsbdkON8usd!5$-qTIM%~5--%mɅ lJkI: uko#B6(.{ׇj2wvpXJs|O }Qt)}7E{] F_84-dbIJ{m935>MG{d_,{V=<"C!8Og7nCm HLX+hKōgm$T6/_$olZ)y^+j]7~ !UGrʑ/$7J~R{vuB@2-T#{QX UBCw{"7y2 ޑVBi3A&rF=S][8ci V?;)xP1e?/3KJNT;(|ET$)Xi<>{+SX;?@zaBs]`!#ؘ^ eq h>D'u։d[.4U1^W$iNUC6r>m>9\D_7K~˺Ƿ…jY\@idkS'lՖ"bWkdOc"Yj5|{7f5It㣺\*l)Whx9ӓ_$ҜyM m#$?+ڋgjzI@o8>y]?6@?զmX`lyN(,sSZ\X_WML$4 wMlq`3+2 %Sn3h؈ -)MY[JK<xe)lT)R)g[a;=Fhк>)U/ *= [:ml*qe/AMZ_b#YWX\7W1{nW_RL O'@sgߨXq5I*s:cB`Ris Wq#Á#]B!nv.EA bse~]c¿=,?͔ cU޶*tiyٙcRyeԔMg-=qoZ09ćq1hח?/íXٞ_ʦPcU>/Ӗ~Lα(؇NOcfݛ$ڛ]NCvjYD{LŎ1OWuǭpF=4m'GxlUA7.%6u8Vav˶1r:75C=qU"{r Fv&kĹG1+MKsq~hr BU|*Z?N|ddDQJ6a vEƊZ^l;;"6@=-PR* \8զ-*ѳ6E1},)'`lurG F?^0vhm0z3Isx=֮ȭ%_6*Ab;u.?ii ]^zDY3w@23q2&AKE֍$]S63;xR٨ұfxXFӼs7{N ^C``YYae.w5 }ppp3)7O56+i>V·- jGC(h'sI}qIQ#\ 3_yj(#G?zF1 Fŵf$2z(HRL T 3V.l`^"wO`74S].|(Sέp3sa.^6gUUJPkiR1g:Y(*oc*Gjdpx@MVBhZM<):/>L%S+&`WT̫^[oJ O.Řdl*wLۑ} ?"hߓK_ XΡ0#IԢ+~/ hPģpsٮ[W &Q[Mƿ fOPnht>yk? k#b-12~N@3RZ9q͛3MPH&/R+hx|Ħz~Ĭ\{e6WMܱiUz߈Vd/Ebt +?  { r#)v(;ϒjQ{MM)La_p{(11c ,u Fs, xƫZ~K3*)>\' kkj;fҡ O6}0GpFīAdtsnQ:*#6cշli-θW.IKT R#T*F$Q+fRԅ9P{^UͩFY>zs*׊3 ≮r]ruqHڲD-@M͉4NSOJka۞ _ Es^,?&'j#ihu᢮V ߡ*_L5x!n Z}-ΪMCgη'~7 RkC '֔B|84 Ƀ)Mv!obڹ}iG#E:a_֫"DWh`dj}ԇ/V^]I9Hxd/% ^;m2I!5%.zS3I!z%Wm0@! 8JmW=PPZjnbH=\*Oa@!H`mSzu:tQ Q6aW>. vӎ8?AyN{n]8J dtYح1f`Q"! yM eД]HMZ[1^Zk83Ӵܬz}TZ8t[UTnۣnGYD8셔Ȩ@w.BN).L5"`ʧ{+ %;m|>_PY8y3k2\pld́\J$K~dk{cR; j[]5B}./>RҬYN T)QC ze {ط>?Vs r3O_$Ȑw)}%(]ݞ!01FѤw7`DX2n;p>EWQJILHSYLB;q)Fgalkajd*^ 2̺ eɼt{ZS›wk QDɋbVO`%ːBiHa 0P9s)Z挤z;5a;!13{TM;Ip t7iy Lv%uށ']LFH\ʟˍNjgdkѬwOr$thԎ

GhNrSÎ>"V[NCp#!\o,]'ă*psoe®]n}|fd҆[%eM {V$ aQ4.׍C=C"hIc%boc2cM]uY^V\o&RͲZ>5"l*q]dW^19/ ҋ/4]^>%-{,<72÷զtΟ?($KlV1 )̗y+qf7)+kq78k7NiH*A"Hhj-rL o6ʈCf]R"& @Zy5NhNM^J-v{0%5 yv*ۜAQQNJ[w˰̢YSN`I ĩ֤a~OIF+'Da|NҦAg4G Иc1REsf웝VsJnd#8 A~1٤M^ c8"/ە45(;-?ÄAM+cˮsY>;&EX(2m=7Q[7:}hɐb z7W~Aorcm }sV[uEj'*5URO~͞#J0 ;zqYQHB&Jwe8=)l"}@E6c}Uhhf^Y⾫9W OѰ0g2݋|M;zĵ9eӋ^z*pm?!W!4&Wte͐=6DsjO>2FD}:wOe׌E0&!uC驒۠mhȬDk*wN> Njt\axKxT5z].)> stream xڍP-;$w5݃;%Npww9zY-k};Ez!c[C=37@DNUL`bbe`bbA 'W5wǎ@rp4#Bdj5pz H;[Y̜LL&&m.9 \|PQ@NB s#D#+9(x͜]]] lLNfe#d % o` G9@oj2788Td v e3td"2+`bn(289 lX9ھ[U@\H `}FvN V42ym5W} ׾3s66A&6&d;1٘;Dy5!LLL\,=fdUw;_N_W ޞvvW osOG33 `25Aj_ :~_?~{0c[+]1k^ovjwu/We~[kŎV1[j5s4uSثR?&*/_g*鯧Z@F3F<ՁBo\G&ɷ5=9ߣ&PM_uJD[\ ~X] 8fW<2fMo Q}g (Җ)N(?VmU~G GbW7E -Dl0yv͈֩iHLnB,ꑰS5~jq9ῼ#y_ZjI?aXA*XN=np X"p":a$z fV$fVk[(NBDW 9Ш&Nuh `#9\zRKJ쪲ƒctHqɓ:n1 6;K8^!E3ESj\1jsb/r4V[D\s A>!FFe&_sǸŞZ'a 1\I&Bs'es4_G t SlֺGzCz 'dsp5P*I]K$ߓs󝙫5o~6ONX<^e@i#a !dӮJBJQC o^~ے3PZ˃x~P(gP3C{ =Ng`v9}`mw2g,.FzȱBkRJɀy7.2cm;-4q%4=/f@]~~)@vB[r )2=VJAMQu?4T'gNf ! ҇qg ^h Z![ї !nFr]hoqiU*eA+=GBRا d_+s/Il/{w+\8lc8îK9LjSu/~WםbJGJCen{嵪omM,DN{st]fP@ks)1-F偬cea5P-ǜp6&6K.es+7LP͒ɓ{T^X(]f/wJʏ&C({zfoŠY{CoM 漱 WD35SYSd\!9j҇rǭBaUtYt$!-iT% s|;陣+vx9 1 jA7xaߧm`M,",Bëti7|xGL]!:Fliy}?;f7jF+> lH1mlB6n8A2]f{`bV#!.o#:BmrRIB4Szq$;7iaPS[.MRJ+(N%n gn8?;d;LkFB:k1 E9Hjcs3AP4m)[(}-}w,Y#L)9rd ` fD 옐+S`+T 0fjڡ3ܔ7QQ○pzhszՔ ruԋOQ heLԌ\xkDUӤS'Mv7Rهh˾,SlTk_f="75= ?a]=w afx=^]EfY9fnnbZGx;˜փ.u{q6~=l5 JڋC{ 2)ZPbm . ^6Ib:ׇ7 J,q+LGb[Ccr]ƘoYQVxeDAځ`M-~>_ B!l¡Z! N\rj\ p HkD΀>ʓae鉙K%4q=@s>o_IL )2xx# /{U-p5:˿=Gy& i(IEݒ#mբ :PY#¼?z&ˈ׺/җCgcV,qy,'vp#HsRQs{9GŀQؗes|^ 𓂰cO{~kk%F*[ޅkh"VJK=f PmV1v;H&4~mi>O7{T ȠIDZA/ %f+;E!b%gLRU5Zr=-]lѭnzkM)yZ,ȏLk42 Nwf=|QzVB@bvʵ<uI%\ {X|XsoY챂\P&\N[>ndnJ]yT8٠ZD>ܳ-A> lG CJYĔcIsM4Ws qvw軚=TI&vCdI=1mA< 9>Ɣl y5sй [3,T~c`H)WB6e#3 ]Z;8nű<5i &Qƈ (1J0*iv.ʳژaCp+R b5u("{9X[6D[P63+r7p ²rIjfO7LÀlWG/@)j~`Z[ j >mac7_1;bL>r2sY *F=CϷ~ۤqr;bmBQZBN`rʋX%b=YV L qkWmҒUOΤZ7g # O;דy!bW櫴xQޞTӸhN }y.O j}քNEQTJ}"XlYhK2!vќDͧ(x7jw7NY8)'#~.(z5CEBkNP[w#1K8A/Ջi;/K)jb.J6J~pLEHD~&i&=+yx'gVՒFy%.ؙ1`;[ҷ1d" =Q?VquBR?=bf|<4- IvVGzdXi}q.$;BviB'JƆz&l!6q319~j ǭ|FKʀC_KhkTH$&qۿ_S'}S 9'Pr/c _]jYOn'QOpk.9|]&v\HwzU805f͏D50+i b}PH@; +My@Bhv uvtlVQ_,ވxivϟ of{Z ;L۶o`*RPV+L-Ъ@&Àr62qQȟwp6C^'~|/rUtz|q-LXD}(2qnXuVpE܍ r ? l b!!( e-򔑟, Wpћ&m Wz*Pd_or#p[ĞЭeTf֒y"x)]B*vaЖ GVzqE3A2 G!#f$/(*9FXVY<񩔪 +{Μ8өTfm+p]+M[8!f5u-bH dl#`P.y?[vkL f5̓w5ZS!I:gA-O}UeK0;;_! 7'da7ަ"Zm#hjH^N3ם.'KiLװNd/Tq#)cyjqrJ>n6ܤ)'rXBz~ip0vZ7 1Wdޱ+t;=n3hpACm;#%.H6Þ7_⽦\/ǡCfjhu<̝REْu)2Tf|E_nRrj8 U ,>ɺtq"s|ϪAPgR;BGqXaxbvm^;n6j[KF'BMfoGS~պj Z 6ō$KXSDSZG9qvs^P-k.A+j#œnx⣶Hg-_L{Rj3T!+˴,[@0XN+jΦÄ{?Q2D/CsފqmepOrT~ Q i6] u70]RP$k){Swz#6$(gMM5IxVNCW~p1kiAS[lnI2tkc?̱$x6Em xISU@eMOT6MM^?nrpMcLGܡpq&^}mǨR9ug(f!VsN`L )a'ւ8y=ջ4J#/\fapC1K/ 4uKdGtmIaK:+,GS0QQ]siKhXyJBPPһQ}X-Yu+c"Mܔ|v\` -vlZ)bl{Q2g1'F%C dplXV}̪ ]k4LyqԶLC2Y+OS[r9^ފwM1QC9=p1n=J g@vn _ԫzމGSl~Bʮv}]GE:󐈿 z}jPU`/cK[!ڑG24㵬diwqo-*r Er(o6?4#tVx# 1*Ria1'ɺ/:Svj fVl'㗺Iԓ]%e}= bk*6;N"0+SfIߙ5􃽎}K[-ɴÝ }ޭs# 4c'[3BEERlmG=w'/8w"-Z-]?Ӝ<ÑP;EEinkr)% $YMGs-L j\E6Ż> dy!: SBe \ ",g`Z rڅT[YC9#wLH;ژj*j:܍_2/]"†Ӫ~|{$(gwtMlxSb`0Uʓ^*cJq(yu˸V y^^ Pbj4?`/THÉ~ySv70Zt0N1u\GS]]@lEd*1H(=~4̯3SFnncϡYqdQ{;KJgh vb.!)|ס\{u˞R,dlfKf$K >. sÎӓL[k` |'{iz1f<>'t ;v)g= ?7gC ϸ˙Z` T!AA8~ vhRI46we4?%\B UXc gm-vEvWzYk'G*"@;̹g[PiJ*vqir90.`)UF'EȽHeiuӤ=Umڐ Lg\P:㷡MMI)$h6R( VՐ|Ʈ~-򷏌\Z1#iyJl:sG$Cw o=lA`e PUcyʠvz,,5.v/zPg=1qVK.܁{&C1m t[fdr\"^5x#`J.\B$ɔ?c+9ҋ!+3^bDyo݆] ׅȸ0?ͨ}#sC7^! ٰcΑޅo ja[`PJPXdxKd[,wKgQ6>8Æ`[Ͼi) 9DZo7DUذ|obDDӽlp[ArsRvk #ҭ魕mpbab)E:5f63 CO,OZcQџs`M pZe,ۜ;jTg(?L ]ӤOgBaA}[i~VZ^Pu}KG cb_Cȼh\1H&i! pDM˭%[ʮ >!]Q Dh%_:~6lDc_=i+pD`6[ܲ5S8H1@,L5=L,~Xq<в}l{&rI΂GLQ:Gϳ~/UG~^֚ǨVTzzĺYa?h/1\/XU܋`vSE7QXz"K%~ Qh(=B4(;|vG[lU!+C,wE 4~ fR\7л4,Sbp_䳋wuV`?'2lwAV ;'V H٭IDۨZϻ}/ŬQ4ߟ{:rpb6K S[u#`?|C pPLdfFt} -[kT 1qCoke^Y'e~ݷ+:|Zn6#m;EZH\z &H]!KNsͻD>-ۍJABoO%' pZ?ss,!'toGV}əs\ja\t0p%/j|ށ#F{7N{ld7V u}X̂w2 a 2hk. y_3\d~]<=-\cipq}x۰t}[]6@Bj{-*HA[Ѻ%v{֗KsЭ|GxEݮf52~mzEḵX- 0kZ4NN%5`zavXhE!p:GЛ,j𓟎y4;ѪNG0YJiUbAT1I=ٰkȡ7H7^DR=EX FxwHm}p%CU&oI" A7uaIG7:Ǽ&h"4u~o7w"wjTlb壕17M~Z`*Xp_MoN n>99%fJ'Du|la@84A$N R ,:9vGO^H["o ,N;eXX> N7D&*oTR4bR(84]{7ަ;}(j⫆:FQ<? b\t]s-8_[j+LL0oeG[ paݸ Y7.^ L_bQɏQ'Ze=0Є]0J^ݎ~&"obM'ng'Eb"f5RJ CV\SMMGqCzzsIz@/!d9Q|r+=1#=J/vR{2,r+ck~M&% 3 ;B/0+4XW"saۦ񡐄`upT7: ͅHq ;z&M-;nlcZu_#JF_dQ 桌m@u}١\;L sYJ~/ \)=vH]9e*p*r) fa/LٷK-8g*5~JY;JL10,8F42jM ދŏ~Kƿ{P_8Ύo.& {LT [ v]pWQ:&C8Z]0+C}S0zf4ګfo6QkB9k_UO?rM*hs\5 ߂|AC9߃"lRiS<=g.s 5y=Uu~RzLq {9v8Ī/|yksB EV)*Yfq107>7Kg@Qpύtۧ(_ᯬxQuN.>51h*+c}׍̑ސwP5G*FA'h{[$Tԣ]*?N~R= endstream endobj 570 0 obj << /Length1 2477 /Length2 16820 /Length3 0 /Length 18269 /Filter /FlateDecode >> stream xڌP.[qXpwwwwwwNxwwww)n-gw3Nf<~ )Pޕ `ffcdffEP#Ph]@sq&o Y7[ Eg^;u P98z9,\+ڌE9@ 23(Z"@@WrAohbl)HCZT.@gw9&vKcD[\9Xz8o- hffotE)@9Fm#&ffv&^ {KPgtt؛hbfon51}S3u ¿s1s90l7om7sڻ 8hw/?donGnL '7:oo `fffc@O3+?{9Ax+} n@? !AfS%7h~;g'@mXf6a^@;Erʫ'/l#5NV݇fH[xKg!)Ep8.™\=Vg{FFvJ{TbakIt]9Sz7:ƧzqsScL2ltTF.ě v}*6S0xIUFӼq4nGo/BS&bkS]r($őR_d²3m' w=FyhdtM?u?47jD)`FIs0 HƗ(̍yc);L ES^Eedj\IADڜrps+J|yM8A_ҲA5ڸ\7Q᪘ -JqĹCLJ>RPe{ͮEkFܕ1iuXã_#s Msv :'kH{ >ݾe9 :|@mTCeQjD5}9~VF> e!}-AR_;K[KdMQI9/n=!Fz]WW6Ē[qW6Q(5SI.JG,;t NG_JFgv=ّє1YBVQͦY/˄QPH T܋_ 2 |_橽EYWt?z(A¯;h4x3cL`N5֦%kZX]%gֿ#| aZ+i*B'X,ZK-́ywJ)" \gF2-d;Sk8zV0]Ҩ׏fl9﫫w{ TU3K Ġ 8yȮEN鄆Dֆh?QkQCH"18W  B  Y|@0Y&AvѶPb|&6chLVOb .`ZĖ"=(56)VUdaN-!ClX7،NVi}w:9&ˊE; <50ߍ0e-gM=HvR]Fg*Ļ!MGxH @ymIƯ?K`cz aze#uL|5F_] J ]ZP9Fl"S @鰴ߖEjt͔3(=@#PSP 2&xtyJ0`H<ͳ{qE.>Ee_grP;ѧH2pl+*K]B:M5 ,*$Ct^X>Λ3AB0:wovv15 s@ ;N9y?Kh,@CnCEBC/6])~\arQ~&b@ uCh2S'Dq6S9]*Z+ U{h,aGV{0o# W,WcId ޘ$/&`i]e^"h!s~V (b i oq(6ƞs83C^8~{y I+I\~=gԸ3i#w)IJ՛)4U.yH2X7|A]8|8~M*y ;M 6klBNt_}ڜqz4t_y$Js*yV:'=wRB},xʅ/݆E=-L%=Cq Dml|`y,,-m}(gqMhΓFv5 piL5–Q5A`7+LOdjm /j!)񼮠sE{IPln"!vGVx ;(%xn !^6 L7J8$:z3k'PR c9GYHJ]Ѡ U̷a܁S IyaBuI8ODr|7yZ!7PyqLGxw% 3D'eU9iOIbgt!UU*`) Z$ZĐB R_(?vK 3(f< Bb5ApDpڤ? IIſbnzX E-l=O\ a G/SϹ6/;R;Wnj/L(,hFӔJKق-Ѽ?fy1'gP 4-WA&8l0kqzoi{ȡS%7%wapl h˱ x5xt=nIo= 9/z'=.#%.)&C(o/s \O$ qt.͙ŋ_!KswjKvr{6̙(}C`ΫU8፿+3WA9Z|()(XND wO]Г] {귕~-Paf -]ӵBb>mgVnV }iTa9cvn&9$MtZ3Ќآ4˅gW=$'ίn8:FFF*qMjҥ92W?fxWVCNDK?Cucͣ(6k u]tRɞki|K( 6 |7,k4 Dw`{@P+B8i`rWGuS< ]oX?E}v!.ȍj`2i<ζLԇYm% <& 'æ%Sg[^ХOL2L2G?X9ι;3UqbXe:^R~ֱqRG [uZ}fwDâ+{Bɩx/5H+&0{&AKI x来=UuGY@~q U&3eīK٪v"7K]t`*DEQAoZRouMxf a}Auw JM-}.`2D>j <NTG5 f[=O$m2"8"l +s2m\Ј5%FdgٮهIJboeZT%=sZ[So#%nFE̛lF]v}L?6T.,w \P+B}ip.HA;ΘnA!vVI)=,Ƴh \~%uO~)ȿA]f)e___|c(1ӳ*>D9SȢ(u%cwlOYT;t@__<aF0ҒApV`Ť*2BSQl*DȷP)3"YJ<k {#WX8,[*:zG/GCn.Ao\drm˽#툳a\Cp!nXppGk Q`/%lT0v^tviڕ\ jc )o?Ќ`Ixg!7QӉPe\aAfQSvn9g`tbFP%#JE!N=!j4y$`;ɤoJ1θfr{yvVBjrk?JWɶ.X ?QozixY+ʡܑ5.e+ `EP&&:N=\'"#5nqwAa-O~sanjPӣbr۲#Fš*e'wk͛ދ&.R;l6f6{N.i Rp{g2Cf+~lҢ%̌R>R ?f; \0i \nS t 7?ГI,#V2&;PY)Z {4t]b/<]MS4gŻZb"*^$$=zZkO`Zu^ - aҰaPgۥ-BO(J=)eq3_A(c?yGP3y2^O1szDh3f xRոO}>'"/|)eri9"wtx ٴWGڕJ l [JHl$enDJd> T(rTXLD,%i*dks^32>a0ݥu70UG"i sb{f]tוENe_/jо'I!E9lzЯje㾱:o]*1Z}ѥme5l;Ms m whDK7ā_ӜDuYX4*P)FQ=`I!jFBTC.ǥWUR!qޥ 2񫮚ZeZs-s>S֨%:\X+:OR$80enϓ0>)`8\++waցylfmNK 8SFt6sfjU"3ؔyXt!| |H(_|&T†_]Mq1O,Oq^4S/*q-"mF;9wZڠrv~Cq\Me1K"Ї{uhь7d>g8-JhA>#pZg>!4[HxIc-^\ `i 86g2pj(kHWz38`isfc!ց|B-sP`9SiA-<#5Wf'J$q:Qmj^ T vw>zi}6W@Z&* .CSH&w ^G?/$']F4٧ en/)yP4K?5ֈF-S;*3xâuO2n^Eאrq#]Xb.lLȁԗ9gxȊ6CzZƇ/HP_=a6]P8H+ɯ[2Y '}Hi0-I^EXs?[x$M5i"ן eK>W.}%h')--QHZffP6AN*uƒ٩٬Y3&GT2}+RxjJ-.¾/`2Ovt͂n9Z䡡(zQs%zL\]rV GEB; H fWv^ZᵞSEuheO"e>/0}5ƳFUmi#CnjI,8GuIt_B̐a"`owi5sK,^\bstu}\{7$D"9֓1 8Ǜdγ{!1Oo*F2g4]{Z+|l)Mq=iP_:_diѴpfq5c~#&H9ELnlf@\!t 軂-t뎤%V>Ǥb#VJwxrm'}9E/]хWy C~ |)U<}:Z]?&qӈ -CG2'S=f44f?8P?oupg3IF>jcIb_egq⥪yD#\Qhvs,ƄBӞʦ#? wR%_q~P]Dk]m>2FAЬz,jь7`оW.9dv|[1h[`Nej$짼]'zed+W U(  [4F񵢍 CW)so0JS}GVqdCŃFmlgiFe*^TxhBe $%8`aa.N޵ 'Z{&f`)D,rwUO~`vh=u8A$>u6NF,ȹ[| +!ϑQ`|Ń(h1%/Cj K42+'C36 dž/H3_2O=16GZ^ւ8^D;?>RhMc |˔:=LmJѭA:䎪SەTMSĿ@@d@E d#n4l}«>D^g!p^ոJ949lf cH{JX?2Q+-PV݋Fܠ֝[q*P몧p'L'`UxrL-osIDnΌV0-!6ea; 6@1;8UTP_h8]#rd%(,uժ0)ń^!|vB`dEM6Td0Z$WΖbn+Fs>z:)=ԑyguh\g?mC XxcIuUyvNی#4KuQhY[C2d_+SE^![bR4)YR0cI0@j9Qt[薯 ѧDW]!/4i G["U8QڀM ADe? I)+f›>Ό{gBb7j0bcX&-%qLkxHNy䙠bH3kژ~vWpODxq!% gUԀk'^i0\OUZIy ^F-.v'R \ïPЬ$wb~K$FT fkdIRj7 p&j_L)>'"N4C` d}9T!6T}p(5Ԥ;`omoB?3z` !w/l}j2ֳ-Y?=i^B#v'VbQ%4-i827>XyS0ޛPzCЌԄ'9Uhrn0Ut|fj/V Ԩyv]4brhh nDJpY\U5q&TuX3k"m 126o^'1WG9 {21)b:hę? |pW5ɪlSP+f#a2yE}ts_C sWp2Xp?G]ݛ3V,\s}w'-*Ԏ8aUnq'p#9 H ||nْgQy .=-8c&M1/i"9T%bV"1/(/Q1Tp\YΒ*}cCzY6syv7m^/1ht=%e ݰsͫ qy"e"$.eO c/\rlG%oni;&s;Ru xܴgz'O⥐C[[vL/vV}+]Sc|/W4f /3Oz W^`t/:˕E5I.fiHgL@3݆iD|a<5I2`bJ;8߆b L'R2$5;6ha46 ۵2W%?a7g'-~76ֻ%{b 8T z OVaǝ`clr PpiՃ#q-}^Z^ CE .erByrVN niҺeR]3΁*g3ySX|yU|ĩ 9 ؍+2yT%ƼlF6ǓK_r]h,*L()£].Ϧw'?D^1Qtm$C`q`а^.h$9+N]<}p3(aRHY3sRL!KՐ ]+4"<1\==d 4טg .Ie^+x8N"Fjw! zZ.%nHvq}<3x-4O55}.s4ڔ=H [yfNPp8$0GCP}hT7M c&^irc NV6 DhUQ/zE}0@\T ]3oZj΋Eǻm`r&cQ>8T}DQI0B\8P;1{(NB֝<'Ne%4;(ЍRM%2CC3!J;'cI6,}XZgZ2Ȱ!/C 524ʽMD>5[,Vj=Mt0qiG!a}q)܁ԥI2ҠMſ>"$t-%;ڭ2]R!+751#!>K>,I^m 6p?-o}Ya*H Z;+ߏzQ9>ʡ%{5j( $ڑuXe[ګtO]xIMMA9/(1<HtIE[]ctBC8}ڇ2%)Cm&*ņOP-4{FF8|&#f\]-֡aQ eؘw;BT:nb/ q]h"ROSճšF&cS SV fq K4CYlM7_j vvG(ܝUsLh:U@pn*q> 2<$hj( /EJuPf.`y5n_'p_(\uXjѮjأit7a!5 yh+Ч0T9oEu2з+׭qhN BT ;J=y&%sYC*0L|qmbܨg{F. Wq2Σd{jESRljߧ{K7mt=_,4;N%)xGr< ?T-C)Iu ꞞHU~I\eEMJfͼc.iQs*OަŽ M^>"7o>s`{d!4֩^6/ʀzFB6#Q[CQCIFXضf;䥮F MoBx'z־ܐӊ^2I#P/v /n8")2P?XOZʳA+L6$Y\ 7"{}]*^au?%!wFi?\ o8iptQqb|'ě+HҾ;T&T]P1гŪ3ŒLk0)է?&zʣԢrE-~2!NJ܎o[3|s6&]I FAx;p14 Y~ц[JR}-! ?L Q©%,a_0ha$ dH `Eכ:Ml>-^V dE_LAmHby!x:p Fe|P[pl7\\ט;l,pNZޟ~qUToI '*deQO$'IjUՈ:NJ5V *VO^<&}$md3&*⁤u5e CThʕ!{X8TcȄ5GAޅşz!cnK!DX >LK "->:9gHL %ӢtQ]H`sWzvµqk#ĥ*A_m0v~;cmbNJE9'swUhӊO4ĆaN@ƶ1]笊HnN;pm>, ީ\bD[~}T:] V$İeP{ZluҩZ:oIAxD1-h e࣐ӻĒӎ}V>ԣ ߩo>fgJ a ZM%t;(1~2qd갭N hofz?ϐȞp%򝮎eT# 9t+ZFp +- "DVAqm91G|+:1â|gGU MCR闂6 @cEiLUDGPHZ#ub- [6cHرGtcќQE8IE,XsjvS )TwySI^$[q^XNzbY}K<Iޅ:j՜a[1tjSu>Q ,W7o3)ai5&d,g'+&}D4?sZXE̐&iMt/@] Ưn0m0rX^?( u2Mp]C5ΌT:ޯ Jb-)!(%Lune֛&^R2үBJpϦvP#@̠}(OC2y;9 / nCV_CoqU{[9ܿ ꗳ9r<4ҝU\ct+j{1/ՠuw1G5ޱ5-rMr>ֆ .bLy/q*ĶKjXWk6Qvo8:iJ$թB0WG&"Iݞu83Oi!1k^cU4M&5QK mJq3XR&R  >13J4u 5La"/N.C&Ode-5G4u,vGYyz '" bk5AOjI<>X?>rUrwjS#Ɍͫa3vRA^EYVm%.j 8'aښns-2+Elz2v{`m\`0zo0JуL:BYx3Fkps,3DM}"Va(pT&#x\TNHg&T,=m4CͰ)"ʶ;b53u e#W|BQXw%q99 H,o5*i`}џ@G;6eNbingw)߉huR*F:,SQtcY~LF 0 s˒h3 uذκϗ 'ħ&A^Κկ6{{xQT,X躝u (dKc&w_P1ZHT1\VLSh}{n6E3~DN}: f 3f>cB(ZALOZCzFx~F> o䦈/A*S^iV[XL1z!Nr̯<f*Pݽ3D/jde1l@Tӝ8QυK.fLg1M_Z?]mbO*foQ<#ūJom8@_\P/XuW )k ?fC\~S}ep;q-'g+RyDuU{EC\htZZZQ0i80XyAvX-o M)Cs#2f9O~i{#Q *ʕXhPEUEd9&҇yr b鎿[uC8)5BvPD*B֥@T":4VLpR*~ޏ \n~VFuB@VG :j~ddN+'lu:9]A1:]#Z'&8|aoH|J$2gXfa%vDZ-Xq}1.EP F}:$DnbL^'K@; b,fZ&LnjێZ~g5B:?hK쇞U{x;(?S']Ɖmͧ sMWV|gM&r*q1l,Z^ zĜcXE5k26Unٗ5dWpoV~RM :^s{f}P@(;9(Dt?T-k5K㭋I )tKD qտ.ӳv`.mDNXPtR fr%}Adswm8ۤ0uxn+Vb/oG٧%W{l{_7.|,pBN m毛pّx?4p%H 5GTxAO@PS.2-`cYyJǽo<2c;\4M{B y+[abUJD5V.ĸ hxl9^ϦYw3d=o}zN|ӸGSt2hvBnσ>lwdMWCT %^>f42^: ?[:mSgNy~[B'~%yFId ;Rg3KdުY~d KZ1+vĆ< n(nDΊ/%O>Q/QfY{hV9M n2,:'XnbH/nFZ,jK rFJV{FTS'n!!7vWAulV>绋s(sUT'2&bq% VkiÊA# endstream endobj 572 0 obj << /Length1 1689 /Length2 4316 /Length3 0 /Length 5363 /Filter /FlateDecode >> stream xڍvP[ DDGBދ4!@(IHB HAH/Ez.M {, U&3$k9kADJZ sE$i Z[d(T ʀDD1$/?vya`Ppͦ 'ш8,`d22 @Jqe@A`EA":8| N' `JJgZ(p;ʛVp b$^ý`M]\ ǐKEC!spo C¡Ip 0H "QV24(p+D`8ñx3}0)$="܋/+u8ei `$"ڛvzX%A{b(!?/ǒAh 鋇`1>(Cݟ "P(TQV@;du  3f!qxMAh_ 2H_TOǿ pEaif?8@iнϯ_N4!qXW 6=k-s_Nmm\@2r$;9 HC,(hvJ4Sb?Cws8nQo;BYCzy} ?~7+'[_mLqMj($^C ZX7_!cPHs ]?6{{qDHàh˅D$PwE=,[2yN APd2HTw0GB4ڻR3gh *)H ~f!? 2 n@Z_PN7fimziyiy0ZgӄwV ehA —@=NWvi/! BpHȺZ|]2rG7bLSz<~:[YqZM3q[c2Uv\Pϋ┹]'ն&23ƍ.Xjsfq)鷩Տ?2\u=[QQz%Z= ͮ'h_ EǷpoLM]POkV5vzDw"ubĿrxU9fҩ>|A\:)psDqA)\N^L%mǝs4.5 vOu s{.[E`nSW2\kR *';X7iƇ 7\/$Cѫ7>efe@%r{ :$C%J$]sV-䄵:<}'BzsXbsĠjS _ېTKꨋzD < C/#5u1c?Z\Rkj;/@m~[hJ/`rr2Q|߮/ O] {42^gNϻs;A!Ϸ*#łɧgVV/6ӑr W")>!b2FX?$5bytc+5<д/SICo#1fxBUɍpjd8? /8/yE#]9Ҥ3T|ړ>le=@KSoŘ%AmϦ&z@E*g,k'W,4g$Y9F4ըI|FNC!ì)3˪%z/, "nk^.=!6H8R4ITh"NaEp7xGvɕpmv U JsU/rX~D6NA@wʢװt#/ 3<Ƞ1u:AZj+3*LtN^>_U-L=fS'FA)xβgtU㍴;(91hQ T#B[yq7hQǝ207/5EԷ2YեS|`~ӉCzZ­! pSGRQ/e!ls6xA)0 И@>|^Vz6OI|Z$c׮qZvrTyɠב?f i sF(tg>ȀF;m-{3?Yr\Z6 UY=ѠW?ᔆ@XRz*l]f㲆3#gPo;9Ҕnu  e^搯8!rfjPMxRe9kpO/7 Oed5|hr&Ot^PBk~KU|- ,4q,pm$-a++ )OG2i5U:Θ1زonV?cb5}bgk\2;UaY Μ,s<1EJ-S!zχ(ҙI-P-X0V;ԶyŜ)Pa^%1"b<{hQ/W=h`i|Jl23kx7#;;kbG] Y@HF@er,0> GQvr^ UIšb4"u=T9]/楟y8F9.MP `tr@MB옣I~\PSWOWzm8$$Y UF:1C>$dtTԸHar5lݳϭD;OE "<}6u"w7 4yhRhH[-o^nJې;N n6;+&BDf,_TGFb9d nF)hl^(iB]{bgE[5fQ{f܄S1l-;"tN^'j#yo48ֱ1R[܂^@.t53`FGgdކ|1",S2b/Zb_ofDN!7lkBFƼB] 28 RvD{#À˂JM9AXQ niy--A xz*+"FX&~qv8pH(C)ǖ#N}S,}| R*fIb:ymu޹ϝ(>̄tbclDvV`'ҳ;.w?jЬyé9kx$_m(gC,LmўtML&΢\;oa74r!yߢ|o)Oh1#dߓ kC-NִbF%,ɅEBnl`o26Wu>U~؜hX}b9KiEgVsoV4GdNQmGSn^7k.QRWl9_"]>,^~2FUH{:*Y>1 .4JHu[Az_YW3_RtI|7D96~JCL)Ĕ鱽{[o.vr]_ف0;]H>t`3X o cF&}jSҢif71>ǦbvC^ZR1Ѽ7Q|d,OO:Xo S ՃsFⵥͯe_ҳсM¸$ QXcSI4M EtCg}A]EBf/=vjz/TV^L4|ٻI> G<9l{7=r }`0[!Z9u?ٳ\Le~f4Pi7 knTmPH8mOӯ wDcS=be}k*uY{VR͎XJj=Br32?F;Z$ϋəgk\brQЂ,C,4RVsᇷ >zhbIBiZUޒyF ^qqYsXX;I2ǽѝ>^)+`CdZ(c ?_%X"?Üt8RdbD)>gŪa7h\f!c/ [آнjklpY(;$f*W븃>F|)mj ɆAI 挷3w1܌ }y26tL `Ց͸2/Ork&~i@t}m>X:ZՔ w*D?7luC[Z#5켁㵂._v51q=YMay(~crsrW`ᓇSeRKt;K5yHXȱZȂۮ;:H,UN`ur?F}uXZQg8"VVYFF8L|Bu4o^6qkč:ZR A)Ei9ו |b".PZۺN@EYhGB1԰*K܃bܷug{P֎\Sz(1>y9ʷ-.n<3 ‰PvI߮Y: Xԯ;*XCd]d LO' 6[L]=|}QL r1h67K`tu/T8g>Pm@]?5!_@Ve*r kg=֡8 CbcdIԠv벼뻕ԴuI9lI5{M>7=؊c}1q˦c_XEuRJE A/ ˔sHC4B- Pu\kɻ<,턦VC (c.ʬ,R<6)ʶZ!}Ǵ_.bK<mVOÕ+d(Ib?op%9~f;A秋 =Qʎu&ݢ[t_cʇ}o!wo· *Mى(u޾ZFm>P`DL|㑋;GzP t$?fx*꾆%/ Ϳj=yVKn6kjXsYPYLnpqЖ endstream endobj 574 0 obj << /Length1 2217 /Length2 7910 /Length3 0 /Length 9222 /Filter /FlateDecode >> stream xڍT6. :R. )IiP@c6FIJI)t HK ҂4tww|Sߟ9wv}ם}?ρEG_aUA @Q@ B0DpH(h O 8@H\ #"R%+%PG(bEfkƄOiPp"a0FA1!`>=Kvtss;H[Yn> mЃHW5Gm#We;APpApn E0j{NP//@i @N` n 9@T4h>nv@!0`W0l! PQ1S 9Q(ÏtYnpt()PNp{#6?vq4Ü]jJP0@ a C7pT~ =NLPo EBh oſ%b` VP[w %c s1|~2nj5| xU[w/ $%v+Ig5,g̀@y/oB*.?\?53.hk!0K/ke0j`(m~RCu`hX1@~)~f {ǟ*(fmQAX/!Q1{1c$$* aspcT A 0@PKj$A?G oIc#`$߸ZY hGP{e d`j 5t~P¿H!%QL~œ_"&(Crv.?1qm`,D.Plxm<)п)f<g`SKĔw/W K'yRct:a-w1Y9A/O caL.4ꯤA0t% ف0Hh;$dvCel`b|Q`5?+煊Y?G( !|TX{NэGHm'lxNuQ_QxW83|Tqh!xjU{{ZIp)گx6V|^}TOVQ.B  ,ֶUzn{SUe8 6 nU `< '&SH+S08TƎڑYɬ|%$:- 6ȸBꤱ"QAò01Q46 ['7?l8\+PC|x .,9+^0n `@2:Bac:jg^=oVX}[zr{p)Z+k(Av Ulhp$,:ԜjtY1h3HFuqtr'c:/\}*s4<;3o&$*q >4#T͇ʠ |[PPvqװB߹6DnR ڒY-Se4w-c7%tcUnw|b~*:xW1E'6ڤ! 'ñɔ,~Ti^*^᫕F2OthIH/*z(\*碊+ijHl? QxwٚvЗuti\$MuϠYsfA7W5"HS|K1jHpn՚}Nͪ o/t;0R)r^Y3*C;!eg_olu<4hs6}tzi$>6zVK|&Q鎰:#TnrIײ:݂H<oB!{(4L$IXMJW_Hq7 W YWxd-hIWVrs<7\/9إ ,Y9Ce,9W"Yx0uwEK Fϻ6CiXDkka7_> K. UZl0Eѯ:B/A$M͵L`2?L9& Fb*7GES]WQ/MY7ƲgԶ; 'хF9JFwPR;wG|UlsLIxv%ɂaxƦq\v%u#5To|5Z\o\!yD[UυB6LCkh?v݁Z]${BSEl4xIkI@Ԝ;]c)j6{"eZr1V-eD+ꔔ(FDZf'{IOj<{Ƚϥ>; ͈9Uۭ&ވA-^FIݬ?0:I~J^8LIHPR3Ѧ^]vc<׳wඬ7U3΄2JepxoU293Gjd]xG ەڍ~zSiDb} ʽw} ܋.)8)$R]TJ4Wl \:H\\7͎1a fy/(!n82dxi`X%L1`lbEgVcޜeI!;׏ώ5rDm5K <>p>h ݟnWI{VS Nuywi>i).7ͅDGD$#Kawi$f4\ .倴t /=CHdĆ^ML gwM9yfްXiXQ^^/ٕ"FE)!AHxU3H#bQ\Gc84$R ʵb|'"I>V:]# "sw⶘<'"m%/\O)5кgN|>a{|IPkO~)q\]KiYcg^EkSo}3xw#lFSخ1^Y}Vܲ}Y"z 56B @L~PGwW -2w #upk+T:Е K:?Z-9זYyVqS&f`5gz% N{" -3O6ظMoVT^g絹WvJHaI#"q+z{z41sa!80~&x}(QWj`_ Dl[Wg6}p;"3ƫ \eqi *nkX30y>="x$H)mwYQ=EB\ ^7n˴s,2%Ȭp8QYAx!<㳄rwJ|5Ȇ6ZaAo4 ^7]O&\ 4į)[+g0h N%&w_s 0 . qܽ[BQ"eZɕpJ 7IeC{j, LvFK^Z|$x^kAEn!ʬr ͚BdlU|n%o[tiٷ b8{Xny"4d:5Y`m5ݼAo/Joyww ?P[Z2drWs!-Fc8&р gvd!`aIur{ .qfռ?vjC2.N'JYSriIȢvdDxT޹$'P<@5T_s4{{SdcV{-)Ci8K1k4IXbx|"oMy$'Emq)%\jLRae׉IՍݹ?Be}TewhV]~ ܵ}ET5XI~[34wjEӽ5-j,⹜'[5G]ӺG5.gtqEcbye`m}:GɗS/%>'ׄ᧸0lD4O333=[ Nf4:V2HDVv>+*aD@ou>6 B_w b {xaX KBZ܈* @10a`񔽴H V%A}gX,ɾ IB2Iht:{(<^xרmZ 2P8bS8$0=$gj}D(DN,ڽz+hx~K,rZd;Me~XGbR ;,3(;-}e!߷ۜ[$I,s?2iR]_ɒTr:b U*t[76c-&]Pon|Q˼MZxCy2;!bbJ WŃw5mNEvИe3#ĒtxȌA %2qe]kܻ! d$P/j `yd Цe?k-Oj;Е1JWQؿ>xu>n]2̲5E%=~vܰDi w='|yA_Qt+CY; WZj: $EOdt VJIu Ҟr5J/ Ku-ٺ!$k*I 2\͓{VLm{W缣(-x8[]Jv,ɦ$.@X"O;^VAo`vzob&4S} i _` ͱ|8}N:Zi4ʽ(X5C=|ͥu"'Kbo>Sçh1r{]_L5r_/B4MIY ѶɦzXc4 έ/Hdp#:g]nJ4$ʭv;Z_`Wi̥Qthy]3U ;t-[p (Gt'(ȳ+|#|Ƭ:nYUd[ E`p0sN̦B-;rV=mOԭik5u y(XDν/ 2;[QT)Ujjbv}GЄzC\M𢡄Zl4vICfsLeʵ$a`\ =J5ڴ}/y!-kWDF(d=gۚ}pw*rR Q_YTyǦn5$~|34;\kxq"Qwr$ \AIs&{1'{Uj'-EbY]aXÕCf<>_|leWlEڶ̕яlo#,7EbP)y\$trWᆪ˥+!V#p cim=J4ϔq{S^٠v 2vr;wZh3iʦ6g xgl]ٳW|_:*_qq̬ 6Ptǯ'xoDh@>nUSV@;HI_aT{h#"=kCZ:d7FSˁԨIɘ)XrʓT}#j4f%[LU޺ѽaӗݣhak(;=;.='A[N>6{gL\>X'ےK<]H$7RRQJf6ko^俑;JmN9O$ۿI żk0JH+ɒ7J60oCn@C^`$d92|- sן`syrkj@zt^Ư-қFp֝Y*̈́I<>`@ vzIi1ˈ4ωƛL?Pf :sWaްRrS nH0ǃX/E9\ȬvO5z5K*h?T|%>d!m YalVOߞ !5?c98uPWEI윛 NV"wfM 4$X90muv ftmLCf'9jyp]J^3XɵvR78-;.;ż^M5azyi2竢KqZ?MYű)Tp<|QY/bG0gbr۹z6}Zd_EEbIa#//LH>=789R85,sW!ط#Vd3rTja&{ .z4@0,Y$=|^wрzwUy{bݱȢS' &p說[_¯l2Qo–y!%^ T~R|TWb׋ˊ${xVCT2Li2# Y\.)Kw i,Mrp[{-蚮')ʫ[AZHM#m09JBuŷxTŤhXa+ylG7. )(U-;gWnljd y^{ ?cX#0~k$>kmɠݪlz8w>}|1w}݋}V {}/ep{m^OjdSx(h7j_ y=l:*{c{<4o]Sԥת$z,Fص4?ѷyW8K(?3-1v9wkΞom"%)h<7-y>Zl.էUͳUV/(JuZ WȾ 2jx" z5癹}i}^4d_/LVWAXf6E2q.$ gs<*GE ^[!؎.i5> stream xڌP\[$qwwwNNc5@,wwKGs-c\sTEQ(bdeb+jhXXؙXXؐ()5Avi$@WkG)M@`NSttȹX\||,,6SttH[r@W$JqG'/kK+8}ИXyy4]L& +=8@ +ȉÃޕRa ].@sLUƄD аvWwy` ps0 e'_ )0 w[Oc33G{'/kK,1LP4suۛXۙ % 0wyf.N W&Wk?Jd ˒@+IXmbdm=aĬ`[L!, ' ;+ zY1^ O\\j\܀!̭@So`h'@<{?f/sG;/_#sx3rl.^XoKY G_}4-࿾3 q}N3A|m7!)7;?4&v^+G EG8U[Td^QKh*e 4WY9њP;?2^ق W<)%/6N. x89ެE4z9f&G`ǁrqEB\f߈,%A,f߈,e~#voq#p<OFxj8o`jF\F\~#p. ^;w[p$W3kk3k37xV6 k;s?L#տsAw hk#m G chh ݰ?w 1wwwo OP?n/mgV;dQ6}g7Gwټ\Io]@Xl '?[ ) rky8w9t;G·9=}t37|/@@3G3{{Z.nhI5A.I=k;47"+$?Z?%?<ũM#-M,!OHȨ!>S2ٍM%ޣOڳ|u,laOuK|1Z3J?d24k H@u>ws;3J"G{^䭻kzk.. 4a΢wiqԦb6 -ĒCw-s)"e4w@.&uґ]q| FΌ&CΏ u#ʢ*YΧAVbOMڭTk9iXHULd/!EϘFC3AYi'e")N):韶~J3i5tE3qxP$ftUOFHq7oG͙*5 fy'oWS yHQS}MRJ U ݒpH@JS2 wۡ;J@ZDVhki6Bmzg>uڲ e-Ƴtɜ T雙ev47 dSmtp!0uG%f<.R]%uY.ק_C{ nd)R&ÃcR-$=NSjT1R %2.C3y0c!7s )x~S#ʦ%u+oxԬ6ߓߔ%-. anDi#U;e=LWXTX,Z_sQP!.Ĺ$ݴSG،O@&V yQh֢; 59/qU!=/Txn窖RHSxEv*yg-ec]H#>Ai/;$O6HNLG^kկN=^s.l>JAwicA#}J 56KzO>=t j,%$ۘM<.Պ_6m\Ael MʇOHɟCuݾnBՔyf$iAl }4OEV;SI~-ƯUAE&8}shh] eDL-'*n_f(u-Ki^5re`Oq0g@đ2iռ8AYZN;v I-sKɹFTqETfODf$x#UWNVS;Ŧ@^"y `]EBYFZ'4k~iClQ99xtr `no@⴬#@ ~`!\6ɐo䭲Oi%+LSi6N s9Pھs+DN90z-lbaCCʥKc"$ <YoDP.<1%ᎢΕ~0op'Vߔ}iF{r\mQo@:am4lMt*鍟I4XiA(-|hèWX(q cD2!i"_ēهCƏgwXV@~TOa)n_=>Yw.1sv!z%7k,òVPJ^;WTbDHߜ#̎!nu}:ES'gKGi>[JcXB\a0(pvիvNU-kMYcF8ӑV[I2VRhHI Aؓ?x~*f/³gnEV+=-TDwF@STHZEn`$`Nm8+ѬdìOsL&3'Ede=Ft(XZ$a6$SꀚDO>!S#zp9az$ ޫPr+{85a!KI| ׮6H1_-Ԛ[Cd_^_~LiiBqbLjn6|-5Jt.+l< i9ěOQ+0 !ܶ z\w٧#$//WiQɃ0 DK^8z5* :tYe Uh~%tn ^O:yWBkXAu.幒(ZpԑO|/ Qpˀ:F퉬X)otwey sUjCeuvT)+qcV~4αߞ d a[}w.% AܜM,Ak 7َ kkѽIG7+TQW;m{ElEJ,6d ɏozs]=rYw\/%%.jfgJΧVTuSZ\Obl=z-+3Eܺٞ fa5x?fVz_` 'Ŝ3Pcf;\_X1KxkV³ SZoLU)*I8 7Q?E4֫2x{&K!1րRcLh9|˗[ԟο1!=7vwE\CRs_#v0Mz\9|xW;t=j2_FN0gO|l~\NXzw7([O"qt8Ӿs/nJk*s#:-!pO8> s>S歴JfDZ8 x~P#l|Q`&np#0e6\a&;JB>|H`2#{؃RwGRa @{^TH .p/:$o[8S50=K_!IH[UXy\e_/(ߤ_5K|%ڰ;%wmE?ϩ]QP.r%j$ %c{7]%˙gOx +gE֡n~ᘬi[Teźc-ϴ2Uxar ʗ1Tλ/™Kչ=D.L_oCAIS =-&[m4~}` .4[$:Α+v[U,R[|CO&xάӦI_baY$,Dpۮv u!Lr"Cm+~30r\!f;ZS;"yޘ3C(o%O{4`SÙs {QͲW՘$J̄!DN{>#Siݜ] G+3_kXUc_?44-qzZ#F }z1moPٰcA*qdœG{tp\!wu|@Vk%- {J77$= yplO9IPnIF!hޞI+'|亗XG>e"{~1Q}ΫU 7›q]C@,5c]G@ːoSFLҚ?Cgԭ`QeWj>aB|!"0^ tl\3HԒĪ=ҁ^šVQ2nSwxGu64p;{,nbOcn1.0 9\CWH=CxuO"ƂeޕW/;(=vAxG4Tt~& ia*$,?0꧍ØjZTxvFI9jo}umqsEřPBIh94ס{]m Fӧc&Շ:ErˡEIVU4y6*ILVZ$Ӷ7,_)iMcS0:)՜SoTv%Wť2~ nW<r.xY7_CIZ029}R ^+xL d?s<ܣ HR.;> jR~Ty̩0׽%vzsh>ʖ1H ݡ8+Ȝ\s"K䂔ķM*!#يbچu5m:fXa SdFˈ>+Lq,ސ"͏|Wx?GiBN](=OfCHx{MV|M1i5~M a갏l MS.?Aq w_B" ¥"-L1 Z9vg;zH+# KP>LdY?z0M;[h]Ť"TP`Z:՘h]3=狭v1d{u>4OßQz_p͠yCQͣjM+DY\i,VQ:!ؿ |̟2\(zF+9k91H\?a )n!6. P+3Ĉd Pg uyD.s 382>Wr,EUqdC1 r6x5jW%_RRo,Ox[o ®NҼdKNJ267p'X]\Z(͛ BKѴy#G%u-hAWͭޕ サjykp:/{Xq,%^ =3[<Ip` 3OAl݅D{~36.FhCB+L&?ʊZdb2s̾"lC.^) |EaGôT5="ڝe^loX;oDU~Vj[Bh0Wߞ[ 9-%Vt#l -.Iv5Dy_HQ(?~Õ({W?`\<9)V J@yA,Y'wa[ˈQ>BR{iRe8^SnRMG%PF$yġ#$ꏣ7}OAd=ElyVe}WD/I@V/˛Gp '`\mG7aΦ| 0FNZ HD"{Z>>qDɏXoݲ?h.s  -/2εSzxzeƣ,vͤ\}`}R<ځn.A]AtnNfԷejNֲ2Dj{_g%X,(k m&mpC ەODIb\MoB+Lge[=|wnv3X*-`pA!ziIQR࿞`lC6F5v)SBs`|}xgZu3y{S̐xKLҤRJQmr:=T4fSDܯ^*/k( gmzrcݗEHNrcU@߂|@ρ>! W<UuPnd|G;N ĉF<ZC{(_jcwkCeFf[Ӥiܠ{?Z(>p>k@pR[P-PMLd%u)\FVt''2Mt|>nИU?Tͅ = `\HtqCD''>xn׼]QRZ!R{(ħq \d jg῿J x/ձkdv"gd2`Z=++,x/ɀ(/lxY'뤬ۮ 8XWPYPJwE(AhD)Z{r*B Tu.sa%S/klt4kJ$6oSF\\Au?ؾ Dp&MƉ`` ]gҧ@b?4* tsq$xAo.tB fr2>Wɭ띶!斦2_^5+po%`\[W/>- t-Hca]bt !Q:r]U[wsVha*o[U~PzD\)}QCQK͐Q2a1s@=rF ȫ Y8hRH`hb`sSW}+9h8.MZ(K{mN΂[b)eg)D{5eD+Ӣ>$5ؤuڕP_Dz)1 3BѱP+I祬 ̄y|Lq#X .xa#/\K:2q_lcdݾT۔j~ 'PݍZ߶_z1<6fk,--Upꢧʓ5TnrRVWT.jCԝFĒ4E5@n}&1mX^,)bHC-ҲOVUjSV]G,+ zcoō"/Er0MU~2T/nC=t [3a`, % r5IWMM,kF<:=a%'TClL[v6 s?Cf?) mU[s%QZǹy[i.p>z-MAXN+p鏮%mƏ< Qd|)ǙpP*n%+=8rWa3OSaY Oiވx?lj]n#^k 7rbv`I` &$.:b||:xm@T v-M=XUoCk蟣91gxc1 nY@C"჋+}Z=ʙ|ƽO>矰m:nYуqwK!l+{ |8 ŰyJ4.xö~@^>D>vмbuo=Ne3óU8#2N ,Bi.zI$ʃf|;H[#r e]^߽O?fb9Cx[6=-GzGQJm>kax%׺Z>Ƕ6!7]tJBhaF?[lz/ >G4؍?fVTEÊ`$hUr!2oÇm] w/"S7tieyp:=%)N OiVB=CΒ |ܷ >9.R?Fm.3(U=cL0ƅS&Eюwo0(v;?6!)'|&b&r^s6| JK%OT킻(xl%]>#8upn  vKkCfe:vF`]l.DCtkFۉTwDM*gy] Q98}7>a>5:nq\w<-%Hcº# q(=,_R(ua)hxLJ߲'kdJMQahӗi\zBhԍhPFP1$U6yj^beJwZ_Qx|5;Ft ^G0ۀ;$P=uj?UkuS[BXbNΪe͙ʋUR3ཡl(^ϕ(ns_X({(ZC~RG}ܣg:s[OjE1~xL:k6oB&K1i6X2l"ս0fR܊"4bAQg7Tw}52\;ov}e,'~ZCGeFDme>x7*߭G1å`ޭ,ƨ>ltF[bQ=o eiGq GhЖ D6zo.՘}R n}SLukcES= HT3^wpoXi*LEPc_4ٮʏCj?q\ 0'2S j|(H˂_fܷ.p\5 fy܈Y?/1s#gEBBJ+e|cuZ?j^nq*ΗK8N[e /jm߹*u g3Y#p/=/&d]k mțu<Z%QzmׂTRa8L_4_Ծ&.>(SÁ<7OJ(s Pu}lW)?$VWyo[nP/mS=@HhТl[E?p42BfݴBshIE=NXpΨorhƼcnUhZZ^fYZ;zZ]N=wL#y[lb`~5GXkVk=cC̪-Mt]?m{^D0Z*tiA(s q.HY|bR1_'هoQSyl.ab~ׇjcX*jEy=N|G#^C/KJN2UU⑘WۼVmf;J{*%mXdt3N{T;T:cX@yA:Q敷 =kpTuEy͘Ti_aؗ<;B}E66c u'RBؤ 2!z ]{ x+^yʆܻޥw)uazP qr$[e 5"zrD\c!F{+01oCGU͑ilJ^GOB'^Dʏ ofP%_N*cKH6޸~jzbU8}aJ;kƈ /}fdf=5&JU@3<Ͷf31(G9@YR`cQӂB3 Bb2Oi̱S~F ]&Ly5[H#>oeit;ڊni^\t&w~sh ?eRVpKDA\bߎ}ՒUnwGsmx:!i*EFq #%2KE} d,o \CN_HإR7hǾm2M676mZJ\~nD?#Df^{C7ta9|Z/Ь^ҫoj6Wjxp27"m w??1~Ml6]Nr-WrO+JC$P5ۖ)c̬o*9RcOЙ**;hz2-@v\cq!wEe4;-*<2* ފa&B#[e!ga۟nj G"Pln`{ilay]3JM5 Kf+Wֵؚ q>>~Nʁ{K)n5Qv7jAA'Lld(M8ܝĔ?)Zf7$F% ~čg $ۊA9rlCA j^.GS]V0ǎR5yO\|Ѥ;=U  (׃~PͬL"%U%^߮!ڬㅉ-< +ύ]U{dX rW#17JbM*-|]#%Lu#q:"\o-ޜ*y;+:5Բ2'GwmMwu-QmЗЮPVυsN;l7" |c rR3V1%>,W˼>`fXe?E޷_ im=T2~}ЌbXr=h^|t0]Cn!9Ul~y`Gy2]rśl4R-vl̀)8]|?SZĺU̟s~_Kd܂-&|&짫c,UtMy^^YDW[U9(V pcTzmK#.u/EzӍ,ԚGMkҦg|Z&p'Se=D>W%š3%%QGOp9|>pLh{Ȭ:ˊ7&e\u>ՔǥCjBTl dwdjj(|'9kU5wcs+b^4/tၨ щW9%켡8|yHG|e1N}?o_7nl_w^H[`./|S E<xf cY&>C[xH--S>0u$Rf5z@%d!ED p' PXĥWMmgםFRNm(83+5¡݄V%wKm£/oWsõr> 5' ״ڨNy=E*Qf9DrȘRk䧕7v}&g1Y{Uk3EZo ;WeW̃KH$`ڼ؍)F]͞Q䘖'jb xWeջ ?8*7KqSe@2\OHv1U`F3~pX*{lߋE9W|Hq[;Ϸ=tSʪjgs?}r+spoJO;U[Fx0摓Zi(_ ly?qjdֻzG9r,㧼|9tB,8IS1"p} 3A}xe.GMa흨Ce#5hl=wy&tosbJ{!"|$޼(%%F;n)Z$gpeGh Kg[XjoP<d h@0վݚpD qUB@,w%nx\P k_aT+ 3"Rm$GLd~Og>Eh73jt@+Cָlժk!c*~y\dŒü#@w9l YqQirEFwm)z0y7GKn-Ütha|mD_zeQ4"FܳS[֯.h WxLdߩ|#t EbmLNie; b$a `GCӠ|9Ěq3E盯r{?V*r߶ȷ.d7'YTHJDlbtSnS5b9{)>,Yzy}D1˪(2:qm^[=T<- BD2"ZҶA<$#՛hEf7u$?z-(j) ^}!l9h]EJW:ňv,4nalc>&©"{uL Ǵ.PO-Cv̩C{, hh$c>oUj>Lٸ+{NU? ^~BB+|>7YķeУX7=Wh sO")OI iXK{i:*O 6dSyrOll¯}Ȟh}V y^A6fJP֣cj^&VP]=a1Z9}ʦ}?5qjCokԘ֏1hPDì5hۈ|kv1phH=E8MېBxy{uU^BS?g'ay# mv>x,Ah<'꫏ukT?ix@ͅм>fieJi( "Y"29X\'~:,>A9M!=$ltW&Kn)^09EB(8΀{1 ?(TOз;#H zKi"F MageM meiWܚJ-)q-X'X!8ϫ4T˫kv1F:_N=4 N 탇q;P#olsR l>Ob=Ha@}D].lYעv*"4ԠqAa{7o%fdl4$y ٌpJcgmYA>Z/ }`Ni􈆬o U|r >,Yz)Շ68W^i.tBr4_>>ZȘUqu J()JN)abd@`џmǢӱ4(bAVO o)X[c!g:^4v $ ~oNxɍ.*Daukȓ?oQs;VP:Cz%C"a7r\ r"C wmD~/N^@ G牔h]7m߫ Vn|flQv)̙5)䍕Dk:H?wv QXgXx l"}X@˙E3|ג8bEH)я<,=}`4d͙8qquXnɈGkVp 76 UD?3׾&Mf 9$OYh+& "< l$;1H"Ȧ@ot*9%4E͎/&oNE {}aϳ: {ǃr䤱0RÞA|3o؞ADM桚g T;<(q,v.<O@G!i; *s!w;HoZVWm!H(p*&W |'|Mgx:Ss[WRk9rUƻD\SZlNdE6ТLx- 0Y(=m4J,x5i ,GdA%K?M- C"AՂmz g]O~qӶjȌf& kS, ϊW`ܣOw_A\yO1{V1O+Қ|';l#~\Bx'Z[c1!Ywfn[Pb 81Y7N})۹܌σگ^OsoX8%DTs&& ZD~i(>DQRo-5I|q>=NHU tlCx  9U;tC+> stream xuT 8mNR~%ˌ{VĘc3cflYSd%{Hd˾},RZ{]s]s?999q0pm )&{CIBB$4ppAkBp@ !X r$A"Z!L@ ,}E 0$8H4 #Kܱyqx /u! àQ H-z' (4p0qG@DkgE`'8 pG8t8H1NVA\S vP HG`Qb/  "I)^P8T ǹ"'m#A+0 E$yHr 0{W ) O0X&ڀ#ŭ('0$& uw#@h<@{u9(7I CG\E@p0R. q _@XI,HrhPFWKo!Dy=GA2CT^Lk#0$8BP:Oph8ϓVQ0[NH ?YX$S88I-nbv턥b`IHMMzF4&:^'@\ !B;4+!(>A B!9@qu W|I8'i@DLHE卅=9:!; >2uu#* D%dey +)L;GZORa:'&'J.wiU,!1 jVbh N++]>}DWwEغnM'}/W-kdEzUg~wg3Vo]n54l!{xҷw~qdNFu *3Ui#l;IXrEvlZ'εBѻN|f-=xUJ#>sCb4secVh>/wip5/liT! YERU-ɯÆm谧kt4JFd2M9A|09oOqy| GTH*-ĸKt*vH˕d_LϞ`:~B-JZ)(ŔzAe`vzƳYnc 2GY ^^\ ՓeK)#2#uh\.eB8~O^XLشe qhAݔ#>UU:e+蚍̞cY3@qb8'm5iwq.ޫ덄KK ;M+M%l%vמЦҠh=FOL+ZPŭ9d&?YXȭ: E]֔&x4 N0{諏-yaо-Y{X54g5FrA[ȏb3n))+FD|Fv3on>-isMggA/DI>Q(\[Ed(cSܦsRi,JaD,\~e=IvE}KvN=^>O͕ՍF1 {aoT{~²#(V7Xw؜=5Ņ;fd+`Lڼ_UO3(e%DtK_gxH)[OвN?g kh<ܦ^t2-isՏz^&ve+$qͷg"Z꿤.byrINRB{(k|ZOhrXd("ɠq.=!I63^魠,/\6r7|(ǣcʝ0A'vBaLŎYltOY^ˍ._i-M$uŻV3S n  $"Q"WԺ !|9Ry(.jD{Rkx%%K:ESYvn_j]ɱ2.]`sI" m<Qz)R>ʿo%1u33t8vV\{q+ښpûp&C9RA~)u;k7:/w5۴15o*\4*(i6>:fdcG3!mM7*\ow4||Z[S'4j2?:9ZmyQ=Nb?Uꘉsq5ű_(|SeqT),jvH{/hEGNêCZoqEv"A Bϻoq*bswaNurvRR/F1iﭾմqzDڞ*dR)U[u8Yn7~/ŦL6P@Ucm\v&HXK<z):azd+x%aƭ1pz,7힋=]aSi}?TGe&/Ǽ,X`2ɮ83!%/D1]S}^euzyz3ވ!ސU15,5zF3 VXz(\`t= ESZo vI'7u~I.ck^'~]-HڿN>}w4Qa W@S-^ENapc>[ՎٿV=Eo(NZvAn{ދ&\-'Ҍ ΅*|h^ /oJQQWU߿2ZO̚B.s>XFE)̋"]Tp~v#9r=&ٻ?vd̵#%WIږ(wcٛcb{V9w)T ^>Z5"#R!Vt_fU{ hbBa36:ͺ[<4r=f#l<'~NWzAqr8y͋;.a[*^j%<={5k #\ۻXRSUQi*į|á??$jh <-==O^* lT.{%BE5kr76J= K0PN(4ee\k (Up.ShbnQ|á(Z-(\J\ dY}7ere> .2_<:KHB/P'j=@%kuBOKvILHczwV^{TS$:5Q&UB3<]RrDe{LFmvĮܢ 1AgVlr,x)ՄI밷sz1^5c?TQue`i Ea?[ JAe]dΎf_M~j493@ߐ |>5,%sܽ-|Z:ggRzC~Dfuj|th5EGM<3_'Β7ho#xF,xNuy]j0Ւ,zh oXx?$Xww{aq7FDnDD';(Kb5j9K7Yȅ\7 VM\]N`}UA~2_ڤmk`Enrn6/-&ol>1]D|wﯰSDK"¤yY2DVtLY9?jǻs

> stream xڍtT6!ݠt 0tHH#=H 0 Jw# tw(%-H  }[Z}]w>=z 6p+*J  PDgg7 AH(& %)Qp@ $@D8B vpϮwB@QҀ}BRR|  hQی`' Ay#= "-(!vF vr|(AB:`g_  ?F@'5uq@Z]YpBB @Pog5 P'@WUKa6`'$:n KT@mF@]PH$W܎YfwvPH_)C۹{ u0-fc 7A# P/έ 6; @\Ok{_ \ |\.6 ~P[  vP7< l( w[3POV~B__ ÜM}ł*/PQ UDD tk?聡apğjowI3V׿unZ'_QWwEnNNq?;C0Tܜ &C6Cv`vN AQT?}U`p_[",&#`/|>BdB up+"]ݠvKoUUn>^Wb??Pz^@9";ɾigvI]L!=u L?}jqBA-W?,7[({G_)0>( C=MX/ܣ[ͳP&hB\ h()WVY,(~\#OӳI&x^|hᘋiRCad' )5)8NլOq9FC+| >ͽlEZUd$7(j cn:bX Yr\}F>s23b@\#b؆Ps!-wSɟS vN.{3Jid]M:<N%*s==J3sw^E',&/OW¨i W+0U`YJVZ}z~RZ 9\+ٓ0> @a5~ )sƃ88{ h+:-Xs@Re6п*)0hcn ]%jZRi÷V]Y:dwU2yHw2|X;RfEHA 8@o V;< aD$XNl3>uفw:9 J pjѰ"_Wl(/)R}.H2 Ӿ9'~fMo0仜.Gn4'XLgS .=Vk䂋V)@EӬRZ K(w,P)Le<"{\ʂtN=xQ i:goж7uzX潙(CDp#8|*58^^SݎOϱ] I"8)YG8F(x։O*ߣOR"nm΍#:u3 WO,庞 IG4C1N5=-YdH$I:?_:Wҿm z?x*vR{eOm.|%,-᷉{hű KX^x&jG<~9Y٘Š7KalVv?/&IdZxexގKK ƌg\ʍƳk:C?,b0U5cމ" (Phf9M[')ީi˃eģh_3t-\$4qA3:W6uDvE$AVo!LLz~޹\p/6MmT ȡ56t⭪<=f>xe>n@JlQSxGmL#oL̽ yyP -\T9xfY6YVBVIs`c':Xw0Ba l&][Ϸ56$w =䧧~3”|:;7 RUd->.-V@8ޱtx~ӏ!C\N>[#iGtۛ򚧼"[k`|xB'e@Sr"71Fu#[a5hxúwͭ3bDU1Q.q&<o%}/?54B7$ڝ%YuI^5,0VjiRV Ͷ,F9Ն2H b˅'}{r^N;L&g}?}?\ro"}7d(C0<  mFKce\ )*y0<#0jUjLáelO(CkFdΩ1۰p\č%TCvq*%6L%_Bԇ-ihM:~ջfoEԘ|`WO }֖G:}NcY$Inf|c=MGNg–+[ۊS?FkDrwilaNfN) vNuϹTVKׅ5w FjېW'V|Q4Ritܓԍc$$ID"y$FVj'MRMy-X+t[D4ScΏy;T՜3Tjk[w_gaJ2{ef ]XCGu50oq /uVB wAor%FmɥIj05= S}(If+P4)Fm1nF 'Hծ/Ů}$P̒^i8T?uiCr ^mbl0?r9&0y@86^q*K<1@u^y0#+Q[m:֖~KO@%}f&2}-6j@0a6/Pظ eΞtxg`Eiqb&Œ}G(#jWSeP/%0X ̗aWfnթ^)GI6V 1XD1>e5 { ؿob×u.~V.hCEp5G-eLg%ٌ C6&s%gwF}hF3^EVĊ:AmzL4s0: }6x|{&gI_,(澖eqCE$jE 'XP}%//:Vy 5j^G&bN9mEZMDHBNGb3{:iDJS'Ox_hY.ڍrs.+p*|=ӴKBcf f~+.7+bn23S27?;\5W / }}M̻NBqePJlM"nϊEAYᦠ6һ7qLi%x:wa( kdܼx;Jĵܑt~hv,;tJqI.ѡ,LX `XccXlyN.iy\EvW%eg" V &=8+'R:tg6E&O τD| cf[1[ ;>3XZRkPfqޥ4RVq裦 ]G-k6SI Y8_/V,,N=V@s|xbhJԍ"qqIYaY~ܓ>u'OY<@XACmp1)ՑcQW/8OUik)8(yh4[m.4M/ν1JkkvN=)d-2@Vx(~\r]ZBB2٠cR+sz@zQj1*s`8ݛ̄զ]lva=j؆{TKш]raW͇> #٧]hXi횃Ҙa% 920Iϥ$3$ve9٤.&'؎nD hYۺl&-8} .\iӘatCʽIE{aM*v0ηR4ibhGYz-E=sT#Mw0-R9]nO xB҂!M9Q§tKһ'UM{OeNݸM."B=>L#R|H,*?@;dSa)60jq2.E3;}p/,ǎ>Mevs!=kOYi g= K$BIP ?ZdIoy"XqnOqvNM>?> ,e`9dքBl&yK/ԝ ϿMppu>]$\|$^s2p=G`# n%[8Z׉1%.TN9]TrMg9Gd% W wpcCU~B"*frI؏ҎHq;*R O1 'Xq)3Ps&2C _D$cbk6]P_^B6;hɨc\9*j]jv"o 4xUm-ro'+ Z%/Gyˇ\5x0$>2.J@`)!p^I ];4󓿹m!YESv޹cy߁ *ऄOaAl #('R\BqShX\  e(`tghM>&(HA,=%՜|Z]؝ <- zljz]b7wN,6|Nk=K;Tƞ|{pdϽzԽIܵ#U38Ha53hZAYl|O F; (Sv5*^[\?G7XԻ]!lt{$rQoe!N\e.Jݙ\Wj_3(k5 =r׸;#9 I> C4 JdIP)Nn7%Hͪ°ظtX-Ɨ} ruRnfEWrsH@ObgWTu.tKQ/I1^QthҘy(3cፒR-f|(1Q,e=AII͵ߝfD}ͫ|h[HܪIAYޒ&è%_^7WBOzbou 7+r{=x\u=jce~=NkmbD@v珼D~2W7EJ7A1\}c]jUsHZ :^З4'vy\3&Y4yfaa=lRV"D/HsɊuRpܟ  |A%-"; Y+>HʉZ DcrZ+lޢ,_m=) 1xB5%ZDs 2sPN+&J׀gsL] ځ/r m'Lcy3 g0Ybvu_>꩐{ LxO;ۆA(va?, endstream endobj 582 0 obj << /Length1 740 /Length2 1311 /Length3 0 /Length 1850 /Filter /FlateDecode >> stream x}R{<r 9c.ncRr]|L=oj|\]$!]%gV-VܙbHB$rQIsvgy>#yl9h"jBa|,䉬p>Op1ٍ}H@3@#s ! qd B(Oemf 0[>d2?Zrac"=51?+`!K1P8?oE;;TD4:@YP)tSN3#- [K>0/Bl({c9XEioo6Ҋ]ܖԺqTos|Ե 'hעfkNݮsͥ״NcƲSrvi.޼G7fYϮxoYlŬ%wkv//즪5;_hЄ[2WpYZ}i{YJ=pYܙaPe-{WX;f'P_9#Q ( S ^zZfDi/ܮH'=M&}$r\o۶mqi:h?gJ8. =T2pug |uB} TBshxlO435赪2ujv!ʓvvcPItbRVss΋C:7 -!ve?- W\$,hՓQ;{QD1t6MzXu`Ɇ{d7eUbz7s<Ŭ*2[mvt_M CNn~qlqd:YlmS/g7H_LxCӡTk>ڕDy~ҳK֧$ع]'l[PuN\u#i37m`6YA?4(v!o3ֺ{UǘԞr~i2S#Z- Yr=+g뙊1)6_d3px߯][t1ka'N}X8ۖ~UA!ًiG퍭쵲XЯmq&yq`gMVoɌȅլg4m,TG?Ȧ-s٪* A{IBե-o֢fqv[gyGdziF33{5_ Ϊz^E*@rݗ7evrކ;E:%D xtt&ҠQlyҴfjy6+W qU6Sesqs =IZO_1)qGTF>ϛa{M/'t0 瓳wY>t8Ϋ]/Zb~ endstream endobj 584 0 obj << /Length1 1614 /Length2 21899 /Length3 0 /Length 22734 /Filter /FlateDecode >> stream xڬzctߗfl۹T̊mvRaIŶm;۶m'N==?{6s{׺$* ¦@ {;Ff^,)௙B hbio'fhMb@++ jdinACGGBƞlinwڹNT.@  %%/ WHNF6EWcK H0w`bogjOkΌFg4 =dk` 0w2s;{?Eo__0E{gg'KߪbΖ{&/_^#K;g Z@,E?FN6@g0 ?7rpW3ƌoM-*Rvf: Qgh02]P?'#'8BK; l-m<7Aۙߌ@SEK )ˮfg tU_003?c7R+п3I7*D?{~0pؘY|x8|bϵ@o3is_`LM+*.Fvq:9U_'oF=&pK&߂R3\js&tzXJT T36N~y.9|H`PN^nRvpd/AL;zAvBYpwBIYp Ɵ-$>2j`txh-d>]v ,7#lߤ3DOCOW72XyB -eS-0l ~Aj2f^}C8gjk/}P$B@ռ:sG^ :)J 7Du\i1H-u{iW[?9tw^p2FI^5u0 :rٓD9ȶ{YǠmvFVdݍ4"sJ9ftFUCٷw! Re 姯3ۈr~&qr5X$.kʷ/Vf_D54LNLzVp#%G[8H(5C`L(=I˟i-S|T=ðJ de 6` !L͍ vkG|&"V(Ш{{Im*6g(܄z5|'Vv qAT%3W?OJnH^DVSꉇdSGB0`tM;Rrjy=Xa}ƚfGbb/@Y)L,<~JߘU_B: ZT(yPzm- CX"A -c$JonGkkFd&n+mRUi0#d|-2{2!l|DH=M|8|lz JNo$:wLf! NƄJ~{\uzuTdwKP`/ay1Rm檐Wn H^ (~8D/- t(8"R_ !# RaE wAuCKXйu'QYZ΋qgy&l)qK5 wf7$x_W VSwaW)YE\ IXqҷǴnWrvp#MC+PY<یxcl0Nh;A9ͦTl=?bΒAHc= 8ȉET7P ʓB],e]Qǃ_v-;3Jrp>CBo"圔c2*Єk,d剺T,uJ$]hG VAߦT6HX]Rn1ɋܲ;PJҍ0˱f-{tE= iHO[|W@f,ràakģ_iXaʕ9pj|?ck,3\&vyPVIuk#LNYlrc] 1m銱>aOo7a>W5OP݋kFMޢOvW(Yo& T+ghKJ={VG!6Euu負WJRNw 솾]o#2yŠ;+Df螰 +6 o5Ax72 yZ߭k%MSG#3Rj X A*bf>MK?_n)axw:$B1$@oq-7Rs5SpGF[ho*aDAP*Pi`‹_8_s ܄G3\f|B+ Hvs"B%adsfbbPm蛣W|02gXAϝ'Taݱ)0苂~[Cғ&}YZwЖF;0茉8He6 =Q:WN>#Ń"Ji{u_dy ׷hZ^`V[UaХNK?p^KQ}aB;' qkn&e. l+vsL^*bO])vդTI&Ec&h&hH:q&ɅAd?o⼱Ň,}aaI-./f5=N$j ]~E5FOGz0Ȝ*BfqTU?,3o6dW*`8_3!! ATRVMmUHp#]] ېmhPr_W| +p|rSKIFfbw&GyƳDSUI_Fj8cp'9+4pt&[͸*77JVbQeJ {3KۯoXW34E[9-.럂BK&zR{2*iwDψ^{ɢ}ly)[q s `N GLL':-TR Q-w믣Vfs39EQtQ÷4- &pA꾒qR~֨ _auES6r}:/@6,]B#Pv$ 3ZU "?/x$#0Bub̩ (T89yI;yrgv7:Qr/`DE31F;'}E]:{7҃X̤KcUF 7L {HfߥEVه,ntc+% ݘô@{pz Շ$zQ3K-ide࿦3ɑ7.P_p%̧omw?4Srӱs3)Q:MoDmBXm~$qYX2"P&⻲򐔝yDT8;[4-=׎/ԽSZ/ }XIUuRXL2&Qudĝ MuoM UpgI9$E/qE?4tr$, 漻am(Y5 |لxI92X֘q,-Nǹ~7wyZiIL) 33YF-{&%7^Ժb<,G V?x%!fz)aI 0-Q;l_}e]ķnȬJ)fXl5`i )VO=[ד=MO12o>b}  #! ϠIU]:u. %^_Fxhz(F/\)+i:6slO5WH%:4%Ǹ3`LB;}&j/WnpTXk .B@~2*b@1b "*؍´%/qu+pjpцHKRe A,o0eԃɅldƏhQ8['Qc+=!mմi%Fh ۖZ̵g"06L>\XF}BFBkBRC^`;e^tX>OS僮00RrcY8?kaTiѨ;B@x>񘆺.G>EH:յ9m'Dñ q8y EJىZ.|iLppN1t,YuR/BQq߱bq}݇o *l}yY'\~fp|c>3xk\Ա[%npoK u4@ϧQ,fv.lWDJ+5עLd~011NRk4yA{=myPސ]j`7nϚ#$֮gS"Fg9be" V΅m8CmCdHZ8m,E3 06@.d> tNpO=/;%13.zTo0$)?O[fyw 䬋c&eh+!hO)rgI:+T!?0 ,rqiV>|p IkcBqtveh&mc^/USlR9e ?ICd$mmk$=믿G -N8w6G-C?Ɛˉ-se?1s`.}H2]tq=C`#]]yGZm515.l3΀S3C)hrž"13nDP<1F! Xϻ' d@?a:`jә5Bn\G+j=jieyx^D%uwN->c'50CpM9l9A-8 ظz%9ȥDnj.SAG-PLʡ-鶫ؤL\, ~؍آH&c-2hi*hx6.92pΏ@d۞uO'!0_nwWb@cʐʣs +=9Ѷ.a;(z*sv܄8B$Z3Qj,oN͔-t԰Pxk'ATO2>22* c?ޚưőDw3ا?=ŸVu;0 ߷rh*_J#;ȥMR)_\tN&=jY/?@r Y8S1?c-guN̏Z찅g Xl7 mc~Nƨ'?4wY!!M\)R{0@@( @PY,R k)=b^_6ՅFR U)Ic6k2+0 S3K VЖ4 N!f躙EFj[:тlBo8T=hh.5pqsHIlxUG;c_/f&Bʋ^yhT޽Z3~7cBO.=>BZr}9_/88 l)AyQg8}(lhTx bVaS<~ mG 54`^geVE W>06<^ es3(VK,@} ӌb:rcCs7WVRY)<^aP?1B8d{3܆;- ޻i4SKO tש8a?ޫ.y~Jg#8\9] 6gaEr9qii"z2wh&>¶5ef PLUu՞=R1`N^ʇ]~ಲI}6DtܶƷ  2p)ϖL{$\vTV&*8c*T+@ڪH,eXVг4jmG?@3W>}rǪ}Ӿ8S d^R˲f#n_3<$DsW&e,ӸyZ1d][{,.x̽bta2:Yj[ *ܽ`mtbICliȤڰExxvIۤrVPvyGo'ՌSxEwďqO?Ъ.sٴnEz?*b? ٳ J!Tt k`L,I& ,>1Q\('$%Sf2t,$b'P6 nGbNK.Ӫz1-;gs"zto=g&Rf t2Y7"p~Q>~;.h`9kҜ>toZKEeXXWr2/OʬVu:M#`*8)|M$Y|JӅߖ% pig, 3P`,p ŊP:=: SAa'~6лY]n6F#."d+(]U= P܆cp,p!2 Z+ubQi/#*Ύ}:BsW<(;J5:#ʼҿ^9J4|]<ڟ0f߅ROD`Qb_vŅtݹ(ē+Ӻ\}hJͤKF7p|rަ¼Hc9DS"ZSw굀$tM5rVUJGғ'`BK BHϥ>Z-7-OYZ}kJ&MW7T-G0(TWT3X@p愂9󊖥w Τ c1y$`J+m%H1(N +s-Cn;lsCIpbUX &&'u I E/?>RMcoR"=4ufL1_i:b-Lq`vηs(i&ACb\ƯJ:t\87A?3E+YnݎIZjB9̘$EIr_{2ġ@>NR5][Gzv m}pt}X@>&Erc;%ex2t}:. O;kX@(2+ۃ"اK-?uwp>%c5qG{+*;|~6Qxe24=Ud |^/(2m@IbG!\Ӝo7!>Qme[k+y.cbiԍkAvԩ 9DcDp f拵̋1&e`V~WAWCun_]F ~VT}1\>JA6oQMZpz :N!ʓ6+tδϸY )K΋>r* #)M_g\A ͌^mr1ڂ r9f<Rސ`ֳn;Tł1cu~H `k<t@ʞc|0_eXC|{ufع%r@NV`h1~n]q6Qs7>hUC+(ggumAef/& 4@Q6VgvOw=Rjte#>sD',AZ7JM͎(E8l7CqjY:~<M ,Oe\Þ>j-emKx:vNQDRVTQUty^)Ҕ,S&-ddC!B8YBC!68-*Pn!7Yq0k@P1ʋX^#Ĩ |rWeўg(Cfc#w * Mn)y%]^)H)XHTKYu'ٷg6 p`Tȳ1mFgNIxw%Z$P×ۧYXoH2>6y%W!|+fB@$Km ijCM5ku/N)ޑ̘׍kyjxJFnė\K'ɽw=Fq-㩕W'$y!09c}`TS!]Q.~Ks*ޝCggpfe*:,R :ZӘs&` QeH &q*2 7ɧxOolEcz-& trE+r_1unҌm,pc7J ʲ[ޠ(0fԄHy"BZ`'h?Mͯ@]Bmu }MZ|@0=Eq&鬑, dRs\ʫ@L U~ӣ`Bx&:-%sT`p{zJ,N9!eъǤArO*ի́bMmjkѵpP}x&9%l9Rah{:aRV]Tk F7\5쯸L_Ұݜ_))TcgJ4kHG2-،cCb+X$+9>WJx _~>[ǩVJl;ujn Y.eҔai9wlCii ,+UZHKbR6VOYXv0 ڵVI粹Iq<2;:/dzOŒ#4&>*vu!Sv FN-Ơ"ZAUn{p$S;N4”ɯ?9P!:b*_o3Ʃ,src{뭳=ئؐŗϮB7 Fbwvt@2Ef0V"P!\@K}𥹓0}3twTAicJOY!<[`[a?9n SMvB]St,͗j(\Am~S|EjLv݊D /f4h_%/>L7U3#f`\[UV,SUX>)8Kf}ӼSG|5Z7q9Ksȕs]A" y'CG)0'.u%܉DҔE#΋IP!| -䵵 xJi1ir:.]z+Zl62 slXW1HXܓT8]&5Oέ#j@0/}$! 3l0,'a20o.&8bZߗU_WD,@NRSmّxt8E@Cf&?m2vr7 M TI͸&PkE?SgLo0"b+UfTp#nRt;C6ZǙOYmSX0CH0>)e]ٻn%]`T1Sp,%d0'Bn)^YNg D1<<] Z&l3-? =o}NƸ7 /LJAj~eN2.@ &4=˪jNFg= yR]OtڹoD;, 4U&Z/nKf]譫\ʇW(9- `B>(]%?#UŞGԬ}1`VlWp< : Ԏ_oqhb4u~бHQ>ua=P&+YliwPHYz Nнd G{7s:]qKvZ}`gxm'Uq5ɢJ&l 1n_ӟۿ6RTQx)?)'ʭaȌ=795Y{nAl=y9_jO\B.D(}JdCrYLL)\=C8Ÿy8vӳفe,Ɲ:[5Eq) qp 5⢞C?@3`BeH|YOgE7Oo987ٷ}wX\ʶ٤gXFJO! svW#f%r6"J;ʽ4@ @]quԠha`COoT~ kQw;N9'xenzsp`?o=AxcA,o^d5ߙj˼kʮw05Z| 43tݰ*ťTέVir VJ3'3Kɉi/1{6 _fHu#QFxELA;7 4H-4e.+3R vF~ 9J5K8~-q:{b=3\n lq HÇ.tߙl׹J['4/.v9hGmvYsm25*wk,g ʨtq(VFӗww:Cw+P.#M4oGy) 9jpC ^.ޗy"M>uQXMByDCozX/ WV삃hʦ 6@_8!=EZ:6CIu=;[d{yeYmhxaȃ3O#kFq`*CO$E@yy֓i|E2DGc6EǛO"Ԅ|l#82^Snն=kbʩjb B:]+#u\$#|Fw4 ᡇ OH-[6+(X2-yolҗmJ@lo<J/UtH?_9/|}TFU^2Wbj妫Ğ ɃaՕ,;M>k ДZ ܠDTtXNJLƒ!}};~/pLoτϛ`1 Go[FSSCኻoن'eGUʌ.8Z.)6"NhyShT?{G F9= Ma4^f/|u9`j)&w^ͳDs%^XU.[~p뮁Y:a- (4g?)m-rL^Dqhi 8ck1zpFmɬED5`/C[C1؀y(iE.Ns" 1V#T=K382Lp У-a^ !;"ߪ|pa5_IH#h-&tkAh)Mz\)"jU )~r\2$0ץڳ"N~TTvo`#fٿz5 s̲9Z 1Zx`%un5]F6 j} U,&2n=xqA /ŝBѕNPyo(؛')*Wiu3K'K%½2˾ Sy;(FD醘 л3V~ë,[GǷ_9 ei,~IfE],[=vSqc1\ \aPpO}裪+bMaS\&r}<ˎ&WVc7ɼuK+ fB[.bafZ'rwݢAj,kO?O7GN}i86LX Id:Vw.H'lEpAAseT}Dg?-&oI*2a}Ҏ&g].:,=;5hυH(<% {ꆔpjϐ_9K>p =Q>Lʂd=P98}[ft6U[WrLq."3VC|* }2:ჼ6켞.e9FWTӌ;{>HɽSg3I(8,]P5|$ ugz꩸@B#Jmƥx6脮i)g,Bc=ف~Sw/`$H>QD*}N %)we X07RV܃MVFd)1Y/r#䢝)TyABgi0U=T~ɩui[&ԇ~`2`̯H 2D*$eČ.{i}C+9j}m2fAv̚~Z>R0ќQ9:%e/|G IX\~u˧2 ͙k nt׾fNʔIo-]o5'xA<7嬴"}*\t?.L7C0ȹW厜﫱wj ǯ=^r**\ ~w&1Z~Ϧq4'Ę-#3H{;xx{2Rɗ;+뽂) .SD?jm(5@PVfcaZ1bi^xbc@ A_Zp MGgm}lr "Igg}J~CXɸfV[ Z%6:;iN=={\rG͙ԡD|܏ c*sĐ1h*Pz="p.QJNԸ`Ŀ۳g|3*L\= |z@y)CA͹x[F ,!!ŘjEM3Y\1mo4HZ_Gz6TqSmaIIwSf 7F.cuŷk9lISDi`裴|4ufg(Ӈ tŢGd!*ǟo-:<僡:}Kw腸rYᖋ%Fmӆu6)."۶/{)7cl=d*$?yߣ|{$hGH *tP?1M#)09P 6waScm65;ʅo1Bl7I15?  d9U|+|`iaF'-tփ}@.gL O_b/AD2:hMF:ίxEk@ZƀVRp.sbֱMx.^˪\Xm:<9#2j]KMBWsgqurb>݄s$Kj԰0MV>WU.6>e*1Һ@:'Wn,7L]֠CxQn\Keռ?|wِ*32w,zRyk^gS2-l pP$ /7b&z38C vEvVۥ5xD7Gr,I--BoK=>1-GO%]e*<2k Ռi݋A i|B ]Is! Tל1W_+?dC]y0:"m!olQмlVp Pכ-c)QUfHv%"kְԡFW]  Q^ֻ[~ -|O>vn֍obgͺ J N= n2=${J5[!?~* P-q[(b7q&ti`Ƌx>Rہ-kvV7uH-/qe_1%wSIҍ]3f}Y~+\UaA'ʸڈ?dBN Gw~RN>lL9uǨi5.V0IvV Tt5t}lظ,0j5pv~&ue{eD kf1}G<qo؝𨂥t )"ʰpn*(!E"moÉ.яFJ1:cTx~]tG*m 6UY9@̕~aaM͸O0aɗԧN!($RE-~@ZpwmC""1WgUBdUՆv.'/ Mcǀ0j'Q|17EM9OjZǖŽ3|!+'B`uC] bּTQI6ӜͫWK?FA~h}{@c~ͺt乡Hb"oX6 ^= :(<%0c*7P7k9%x&Xct:l~.Nș4ǨV[ï,;BRb$"JޏO1jMc^!A^/|.eE7/bɤPt5F9FFC/hd8!wdYhIL4jZ2K(Mdk`3w- %F)>g%WՔ60P{ 33/s y; 3!|6S%E= /z /M ~oEQDY*f39x;Ѣ|xG-ٿ!6gBzu4_ JY)g 6 AI6GdH_w2fتmzPZk:aO&h6 iOͮ5BKRIp17pUݒ;etTrvɩn",C AWUb*6uA> 4d82_b$[e9*+6յn#O_ŝ;0k.7ڀcC' GI @UERȾf2YIAF3}.Bν9sۡ]>KiJp"Q_X(}8Vd_Ő~p-&Id4;H<Cüc,Wi- f"UY}n@ٶ0lߺ"/q}+!@AJǢKMX!cs{Q6ğ:l'2OE1ate!zzY"$KrzX"Dt h7YW@^JHL3b?Lhu%bK5S5+l @ZҤ-,w;٢88Mm+#8iW(^q l\⒫2k0[I 'o/ä9 X;V!Y^y徒R?`K&* ;zoݼywN]Y$LUZBfRSZcfz ,; Q`#ШK{ q2\Lˤ ˫Aq]-euˌ^-9y bRc"!&.~K(Cg*q}Sv/ 1bWǕؐfSգ`LCw:?}%@>LfM>R*C14>-EdO+9.g%kVV$tM؀P?2YΕ$$j;W]~$n BI#EAMmLO-Ԋ+}zʶGm1 XVZHQ~ U OBLhtW:f~Oػ<ڊb+~`]Gġtu%1 rg q`"#& z9~zZ,fRI q"Ӗ2NB 6>t̲-`-wH5PL֠2WH~zZV,]Eؠٲ*67Ya9Ii!e)DF"\0odgRېb.SS*u! [vdpWzI}B_0lI0Z#ml#*_RluZ38 maE(ͫ|G9{_*"Zc-$4|mS9t*swhZ YjŝrȦxu̡E70,@qa[#FC /E s`[[?g:Vئ rHa_G槺䟼kR(EZhwe 7lk@V}VJ[g9m핐^P*T 5$̼SEVsXXEwY&7 -ORM&Sy:~)kAäTwJ)(Zj14z:\ $Bϰ VS<Ο,),3[8}506v_RBa ƦCmބkOw'.d͍ LFUe<]M@=<}HO'p8i+Rs?-I.^9O+D@`(*_FR`M x3\i6$X4K} 2g_!V>bzAJI#[FLpI{<2kx81!$!4kD˻iL:̛pjtǿ\XFSYN5gϺE#[e˾Of+ ]rN'QīK |ѳ*Km3z$ac1ד؅Y'u@nf;%X)L7LcŲD?╩pn9O 52pgѦOP|#W3\rA$yBzln|'`7Aw6A}1'V]2^n2 >ܜ/k6|5!~IRQDE/|Yl qG :q4/xnX:.ܙNsj%:nƉNlFǭߪZ| a& Mw8'QIGO( {7HZQ/H39K[ƨæL98?'8$GSJȯ6ϦIQ\*,˟FvP#).m](QSS2:6+~9@bre!WZ'CeZk]͏+3Ri!"VK7 脴d74c(loeS{GA6ɞ܇enzRjՔ,2z ˴6N 㡞k$MM7sL:*ۯS{&*X׼y)f;R[Q;\,S endstream endobj 586 0 obj << /Length1 1630 /Length2 5485 /Length3 0 /Length 6305 /Filter /FlateDecode >> stream xڭTgT۶*MJh!tB#E $!$"UAD:tD"]wy=www~$k5\eo^Ns5(BbEEK3k0Q"(T Fp4)/QHM0&A0@B Hy(O4  epEbHM܇ !8:``8иebg104og0C`H LB UFǥO A` a' `p8#`Q8~ Dp8 Gf`14 e5C'  x*7X0`a~_a(r<21p_ h+ E0 WwoՃ==Q.,.+I*k].(8;O _;#B*fR)sCF oѿ]};7a  ?1`8?E_dVCf"ac~0  qn["04q or@0$q\LKTCL?}Mp[7 /&uu PD\J@!o"F`,NwF FBq//F& {a0?tjQ瞑bдko',~eQ<3*uQ%Z;$uϋe}V_Klk0@sٛ B+b ; leV+ fE? 5Hq<9 $]oţ_߸䘯}OwWq I$ `Ɛ뜩X'+O3YLEëGw1Dh2=SRU3v& mt$BQ9<9dk"E{}lnD[d_o R~> (4E7NSȏUtG y*]zx/껸z]?:2va)D1*w>zMMMW}αhzG XetfђP϶nj6dvѾSIݭ Lc#x=NV*`!+hNoo#ཀ"oLlFD~žT3|9ֱ]5DO'a8f-*#OVNL~)Aק~eo5g\$񽐽.ѲwMgPytiQM~qPVI>`E$&cC0@Dk[S*)7Jhw3@ž3 J#7Q2OH "r?8 sQD-|aj kz ƫs鼏ABm^GG 3U"jjX e L%۴ !4^\)y@P&αh$Oc{>]z]!cnKg0/p\ @S0V;|oKm!Zg9tZJH(Eo#ucL+%O_RWK Dh6Dr?<8i]v_FNH Lqe"1 >Rͻ=u =p@FdrA^jY][7ԕnEe,v퓻1ѡ̭ΛOfj XI3o$%),±e .q7yݐzYxʞBeӨ6۹̚(*08¯*2w[pyi[1kvȰnƀ 5VӗVe;"9,~4Nk~OApo\^8|\ݝʞ/pN<=- YH5[u@Lgm[}&6s)aᷩU"/s)>t9"02 ]oK?ucx[t݄t2,e "뫈w ~ȰU#o•Ӱ~kt;.JDBwJx,ܺ0E5CC$9:F<}( m}7#6#P۬Gұu[!yfM,JwtִG/OBi_Zjb)Ubͺ@C Cμ -6@H0ϹXwhC=qUq;TVb5,S4z5~:'/Xۦ(d`]OiN)]+&ٛi(ٸxe $f?';^ }YG|ij .z}멁‡V0:k/UVԎB$98eF__9(kɛ٧Nz0>! W'xX˶ U)ALMi2@ v,G'&a'YZQ<˝rF2cV%l̾TEId`>*gپnV$Bg{s,I.`'z {dU(oј_bl,M~⻉q4/]H+u T33@ f 7f4A`gli%[ou7o{T&GzTƟLݯ(͛p@nhfIUt#^T'N}L.xQJ':ֈT%Ӭ'+os0UmhzOt[+zA X2֫pvI {;=)yʹ0fE@1}ĦlFZ|)4:ILɓ#dǽ'Q؝fvňy3{re%kvϡ4DCUB!3dG}Eϥ鼢2#)wtE*POk7:4jkD)|:jeNlzK TH <߼F>>Nj|`kEug8'Mg̘]j$&8N~6\{~y ^6) 2 $ּ^\~,aTѧJ>}x v]n`jSYO{eJԉ^/M`j:f_ϫY{2Eƿ>kMXZ*c$~k s o\[٫=Qk1.Zl_~6²u6*ϛ.N^N[}=כtd+<9R9YP:_p.}<t~.2Kd@X(S˞w6ܹAMk)$)7a e"25s,F.qφL_:M6-W)(~vxkFng#3F^bi[)ĖڜV#y)ig<5 O-iru?EL$!?n5xE{--ۜY*h|%I7˝O)&uΌg PevUWlCuV?w -t00uy4W>+pY.o4򊙺]p3sSaT*isN#u&*cv$[m.,AMm`Z88³-ZsՄյ)7=x]uCK ze+n-n缛o5=I R6loƉ;.Y4x֪p\Թ&|~ٸm:gV5gNbT[|tHgW2}q " IS+z'(+MQU=T<8e-)|e-z {KՆkJŊIWv r<ƹ/;6.@\01d!sjiin|5pﱔ;+?N%Wʺgu]NĦ1zV32֧hI7"KYY#e/7Jhb7f LC9[ܥٸ5~6X^hN|+BTyvoW*& `v#Yl O%6ځ]@(J6*]ޏG&Wȳ" yoe_uhIY^V|5a \2,SiVl-1ixNj?<> stream xڬc[&\ʲm۶m۶mwٶ]fm̯ιsκ3ֻ#b?'bk$#RT2u06wwcg)k(Z9);l0dd"fFVFf 3S CqprtP~cPjwXYȿl]!7\-VfE-)y @flke21w1;8lc0q7'5o,!{?*Z3`ld]W?| [ bl (*qZ[ p04u0q'u0ZW#+{?V.F^߾ "8Y9ښ||cSdohng V.f0L>M\}[X0*R&9Q3TA:zLa\](XGw!;ZVM7;`G{SJe3,P7OT$Eh&M =H-@( )OGGoqix0ΉR] M>_z4*;H,v|Aw#`&UTD{Xs)~Pl/My跽KB`%w?-^8WsVz32=1m;.\Tn[&: J :ӏhl>oHN5Քln/1> J(-e4+3$;yg#zΐF?ԱƁi:Pr1 = q6}"M6+*kʚX̐4m= \&LYaOF3ٽ!5[7iEZ5]*˂q9u=QtdT'fx7[F;?r-F%"e^\{ }IU _tAN!>xW#@?z p5S+7:"Q v) _dJzgy,nL-`q* 1߂lm*"XNjwNP, ^i94g(n/ a֫39>cR̹>y@B3 4dvk?D3@C1QB2ϭ-!hWH;sxrՉZhF[ډFEWF݉ǿ!ǖOxDbqdQKW#Rm0AY' cܔc= FZC2 j92g4_Yɳ~v6rj_}55-KQ%#iXUV^?v[y PZ[՘zr[*m{p"WKh>ŶYޑ>bQXx->t /Hp5QP̜sZi4Y _f tOK.f_ϻD% d^'*~ =̂e*ee`M`ߜӣ# c/=*RBU@HnM_'`rЮRߺ}mD ?/GT}=iFd8f%FsIÐŜ)ǸINZ(## +ϲT\j Vo8t/(%i\TG[mK`䚦 c6lLA ԪUT|eˇ72bN4N^vZ@k[I c2cAN oAr^ ` ߉nTjG$iyuWAgxKmYF8hf=ul0, 7 ٌʅr'>g^u{NpcJq hX^dG&TEԸ FzN= ݸ06 !O0~KK&b7.ūIjH 2R XQM #VoR.*bO\~v'fV]!:@+Ahe? myTӰSoo[$وo~AܖXMeF}=Kꃌ._#S+eCU>H ޸BK65WyOR_W`)ۻQy[x_(bV oQI:$yss+ӈڔHkzW@Fضj Ku8|>ؔllQθ$􉥳j-jʼnjW;qXYޱvFc\!sVT:rxg <^;`(++D[FIpKH4s+o1r>{c2E!y!W9!tѦyZRC KOz>hPlfJ.=F&iϛf_D-ԼiXR|l,6ʼnõ蓞7+n?vIG Bydu¿fzjm,U5vXI<br!ֺ`^ӑdPdr<^ }4j0}#J0٬Zb@6ݩk^˸xOͿd(@~n4?A( WRRK{@"$]zbIŽ5 hf%!7=U=sSQUR1%jb`ފߣ ƝN;J( C$&]dڿN?K@/ '}$$TGy];ҠUm j2~jt! BPul2T@vlp8%Oí@hA;FU϶V&9#A fSze2 v=K=9Yk٘neX .6njIujM[@\0L.G-z#D"ҐqLR*84 :2F`e~>G]S5ٍ7GG!z'V!\&8q`<r'\eaȥJrΚEynݭ\a,"jR3V{~1!s`CA8MD+9!BXT.YxZrQS` fʫ\H(W"UF (bbx@@ɠ"yA. v6W/ N=qBR쭍q60vٴ[e vC|a& q eta? -0*S7 Н{0'w 4^[ 1C m!ӊSXV2zw'% (sꋹ\z'YHXK]"?_#ťP! 1*~<1C 5Sg0wc t!&eSR}B`")ek*7[:FD(ip]"/o@u0y1nBEL5|N-.8e=zYoVdc:>8<C-@;5AΚ;Jed_7x? S!tB N=rS<?)|T q} ͺ)kaF\0^f璖6ٝ@v}ȯ{71k7[Agb'b!r xJb$MIn +2E徛Pf!~UBEs ky><*>{=WK_.WZhmƝ N<Ա$_ ;/[(};$GSPϩC@Mٚaa eKßk,gM^V-sjI!B\FĈN;E2 ɠ 0;LQo)ZXa'8?,uSĄy4PIQ-SlfOt4UC QҬ#'ff>x;?ǃ&~-ZO f\U噢^MbSQoeRr-\d}qҬM9QoYؔ9̽}m6a73z2me^m9xՆ CF%i n[ eȤFSfJd;Ft.m)IE#֔CCjǤȟq;ijynDIQ,w GoG=G玷[Q$yG Ep9!&~FXC2.W`*ZmnWK[`AzP ~3٬ؽ rnG񹰻%j%p'T`}V_)j'.qBX-Wcٯbt&Mhߙ͟M!kRTCmi+T4GP98 Z#ż9ND("E< `P$ViDN`!ěGI)*lR/֦ĜZcÅ~ C z3XKNNA+fWnqx.K( ;k"Om$ ͯyuӦC=c>O՛%ђfGyxoucO Ń$q*zK2]=/)V(ܵ'Kh &5 _SAJW%tςg=H917'^t "!|( HtX0c|[112ѰFh8BN@mOjuo а74֥fRqıJe&ۍ yAh7 #~eA՘gB4;&V+!?0l x`K2k[VW*lŬ9 [? B>'+9Ln*̓'+ 5N#FYpC]sO3Jɹ.R;\gg>i.W3v)<P~_ 'P(ktVDc2'YpbXN殣? W-(,fOԼ/.Yu~ p)^#,-K k_h9]P^} msIy)i!t "^=`*,M=g7bA dT\%2Mgה-&oNky{S!išQzlwE.jJa9oFŒ,9g# Q+8kh6F>JJb8c g9.O%o; @Wv.COqcvVDnљ6[㋬;>=5ssS E^0 #DY%cHxA[tCjpQHYdEр+g0"Ǿ<l1F1:F߻8u"Pj4Š$\" v? ^!2zg{^pS!aF?%Tt6@}T\@Y// #3nsJqܺpSuP0 j)pQ{[39,gQg-C]El>NjӉ ]1N~q4l&$|6yW.n:SVeQ̐ 6S`Rp!91߉M%_>o9tNnɖ0Z\7etKab(JKMe+5ק._HyG~bVIpp2s0`+lC|\3ޘ[,Y/UO$iOriS,oOuIFqѨ;^tjzVW{3PDPѠX\xv?RR]zL~CR_'MpRwYZީG2Rtuujº׍>Ƈ=uơsd1qT%5L҉荿$/Z<Sxo$UUܟOJ pt>b#v[OBo~,5#I!}"8AwcбD Ӏ"Sh.Z_׏$N _u=0lK&|zP=nz## Em!4Yi+ gsϡ{:R}-]죽_Gg5Vb&fA+ֶ.jC`>H7唟e! <`oou$t\XtV?dm ag#֏'yd&S8a(D ,q-Q0 Q?pwH,0X%֢Ei &;-϶wW,umIاycB>Fsӟp%1fK?f2Ԁ=nIC̈@+_[WA`:*Ϗc9>t4F:@M]8S ;軣&URhJ#h3U4h<Hxtܿ O ~=+ǓcEbo 5ݭ!dx%Gjltm5ɑ03޶ʢBz1*G~rW]9 JaٓZ-ׄ%va ֣sl ^hhlh֜ ڨ{7*S&0FjAl.}0[q.!-rarE.QĈ̃dYrrHY>ŒC snhS%;S>i1ctlBQR3R=hN|"N5Vz>iE>+H͡:VVd"0DiXlȃvab8D1Abף2r,Z]_=CnR|w A3_An<DHO ֪%jvq "̮ZƎDiygc'k:NfBe_η}H"г+#d?\& mh?s}:ےPˉ\TzJ7nvՖ9+[f.8(b&BzyVlA0 <IďW@zO0%8L9QUQp)OcX,"F8(󳼒v'C4gkf"o7j*a(țu܃Dɴfb;ظͩ!#ď#O*" ի@ĉv KqTCmEQ˘N1m2Ϣ*>%JXeA bؾj2@i_Tɭ0D 5Q ٷ6`$ꅨ%8Hwڣ@8(ΔNX'ȉ%+Knd0֓ 6&i1U%%@۳z&z* K>75ʨċ 7ciؑCR T[{): ƚҰ?*Jd4 qd[yP|ZA`0@1)b#U!ltu/`P^f+B ^G&u GiG()26Y㕵rWn]M\>~Ǻ}:dYa~|"6m{8Bۓipp{߸Wǩ#+''dD ;G{E!i$~F}rAIdni/0cV7/t\ǦvZQ>&|^O`){V:b aVEB(o uN~z\RS6*'Y,]E W/{IKLԞ+WBjs"F3x|,e[8e璇HyC *oK^[ sQu7nqCΕ۽^P"tRp"vnNd :Ե:"լ.ab4q=Yl%K6Nc[Wtu B0><߮]sY?@&oI(cQx.J(5p&⚷=:튉iGlt A{mf41L:ty[jݱdp@qqBZ!-eCl8Te&q!~ulD"HN.WMIG\٤bO komU{ liOSE 4M h֧2ŪOYY(OI$<,~SJ4#)gD̥VJH[/QZ \Ȱ#諢k $&_Pݦ3{tG82LeŽ5SIn>vyg݋l/†U㽠oS {Yj2\ _V*_03)6jmhz%ڈ#uu7@GCͧm+[ tgƃ5&v>3=V>|m&Ê3<Kox/PF:ރY_Ӱ+pϗPfG>z,(-k9ߜNo.'Qix B~t2GZOYKZկ-"xPc">jevGt+^~ҝPx9x_[@0ЂHpԮoW X2cGWj33Ϛ6oZfgj\ѭo_WlNI*IKAOZ6Rd8sUw0棁^~18}?"pdx?MX,*>|2ڿL:* &=" p,{lB7\og F$%ū nj8p~O`šW)r\[^,peuۏd:&bao2E>69QH9Dc8 b5.xr'r&ĢpǠ6!"vhF iKΧrӵ䯌xNQb Sao;"-@?sV̬i|kzWhD 6Fjwsk}ody̞VHx7v{% ^Qr:K(hV 'dMVo",ul0FKž*55^Ċڨì 1ng [ZS̡!Zgx1fJUȀ{3lyBDn-dD z| #r6ptI%~@Y2v k֚8$x'DG d?Jѷ6zg4[)NWVFLK %=ůis$ P]'//}Ud0[I/(*њ 5{?0=aN"l. 3y1?Q$cD{A"\:!p)`x7 yiK!Y<>C!Ke(˴aP1/m":дVؘ~QuSM,U&?˶_=D }OTOpTX+@˵qmI_,F:?L=;0ךae;iY 5 _M"0__`6)p+Vז ~%73ZzRQ4qh͢#$V>u="g :3Wo#^ėܽtN\=j 7|lW/Rٴ_`87w}n@S+h跍4wyW=nͣ#ȕ!$h)4GÔ۟U6FX[#v!njc,G|IU ʘVӛ5"4~/M}'6~<<Ӡ# d}Ř 8ŸO+q]Z/_qYG ڙt_\Eͬ |ߓ~(r̨jbm,mdHql~¾f KBo/G,)fd$XGl$n/P+.Ze`tH~Uxu-0[ aЭ*z&L4$ <QgWWRG{E.W(ciRDz}%hGue%H٩TB|M]kڦ [)gϥ*@yTmBw˷qK BhC;m)AD]ZoB-N 74 6]Kti[FD>/5J|D#㕤γF& H] h;qFȨ=rs3hL(Dn'Rޖ 3 n]O=eX[ā1\nQe*Ev*gSUԾPK ^ gZ OiOf>iMh7w=r'Kl$(ʀ˖RHsdȄ90 TD BgxW}dhBa?IUvm<ь5h&;d!;={>4[b/F{¨$ki N:p]fQ9t&x\J+~N?kpӳD88 l+x؏wͲ?M*u6{QS{alԋ@uX:IHSA|,ޘ 0 ֍G5i]H9X|U#FV о DыDX3 +k]!`z_=}"i 23%(a8Q;9&nWRg1~D-B)Di++9` g:_TZ5JRVar 壄]V>9yޖ;Per]y>yb"z;7  %^6rW>0\vn$Y w/ v3[g-F/zP%17v0h1$}뉯{=zi#u9W[?Ѭ ,GhHs'HT%$~Lv+6ᎫZ$,]|}DHIb׍6RVH{\9=Sʂp+GŜx@K㔼[n8H"^F波5WjNbvw4Ab*'0}p87<[t.f6|lA[RJ2pQrYPr1 /ۊ/`_=֡G "4(v= %ڕoI}N5[qުh\9Z!aRyU^k6-r}.)j_?͘im7#r9o!⓴iQz]Vvk)!k4)dܪ.o}"~u"HCI}9> 79b'h=p'ٶQl)[MUbw~KuHP2ցF.>=J>eB)xcz\Z9c1tz, m"jR_T띁MΗ?>U/6IH vPmﱤ7э޿ȉÎ!U7H`.1~u[.ƪ1AN5vYќesq5#OJ A`L_4NčP`H4dc 0%cC(qJUEx49|; Ye`6j`uzߤ*TɒIճe ;YBE{drCFmYIG隟P,(wAFQn u]hhϲ싍5:+b @Sf)0Y)={o g%a'Ƀ*VW&'l m4<6Ѡ 2)xM7i=#aiEyj{כHO}_54y؛Ua{ X8dq>}709rQ{8*6~'/g7Rch?2,2뢿!:z2M>jS%}AEx`Y/-k0@iwgf(&r T^W;WVJڱN/VCU(n0^ @Nx$b}_وېm{kFĹԱk *1yJ}(-V>G.70,gj-$G䊍d#>f=Bm$ff)_ä t_Y"Lϥq?mf ")U7-ZН L<.o,fXn~ z$z\맑[<\N0_:v`-GwvQFuTrUG),~ͯ"] 6JtFXR2٬ W2RAw,S)-ԿsX(i^.Z $poZ94n)Bgz1T 1̟cmk{2nWlz*%ꏕP1i/̮fDY'+87K1&!edd„s?AT0|R%e"%ُs =B]N5AKEwcӗo}63FmĪgs|DӱL8CBJnֶ4nDŽӰ> G.2ɃN6t^[onے'8M<K? nMGK/i$ЄS|rf(Y;pKM)V5e uėGQC!UVw ?`i"Zv@}ˊc}q46^8-W~Ijwp 9s:&[&*]I,8GCǡr$\bEݸ;C58ߔ 2;dhzr˲7}\1i^ :mI7^+{`Jͽ4{su6{V+2U*Z=?/?&n%`eV,lo 9绒N\rR맊KQ{+SSAYuQyؔ.#(SZaPvT#/o>D~| z>j~jz;[Ҧ>kщ!<~90U=?QംPՋk>w҃} ZHdrH2/Vd*KhշfrIgzMw5^M1jO ]$t.K  J <6|uq7wߥ_KP3uLj$ы6ȗ;LmɘI)*hŸz%[d4OS2o!{ G9=BMFSV!ە_jTgX!{-^/&S?ՒiFfӶimiQAJH'40}!%8j.7Rj+qf-l;@Q^%"9Bu\lm WhS ќerIX*2YgS69z:ٱfxt*(wu_Bw(0i(:n,z읐&ֳ R?oӿ!%wx1߮<< RkqF )97<1:̺&gx\BF5yG8V zG; 2(NqT!o;ݗON^&-BGNK6lڱG)qx%/֖\ %S" n[VC2!O#MD.Q )u]~"h'_W}H !4!YPD hLЉc,긙{ W? vb@)ilsHvbH՛ٴviϴyIK0UYP;{ b4>KkUUZu) 644. MG7rsxn['Vo-Ab.NZ0%mƭ 5F'9Z45goނZY>mݙoEȭBXnns=]nw$'?`tr31  xDCP+@Az=K J2+ǵ̜H&GLo_G}jCpWIq";e y9t3r m%2~CJ8ƕVdMOE6?ůPiJ!n{QDx) 1I:V)LdtVַuMEY42iDԛO IumwL2I`j&` o&UuSf3&hϳapF E=7_4rzŐ:/EvO^Ƚ&UԿ!N8}#gfg4~lg$nzS[x9 R3gi='V7]5MPBq1Y$nx K X+L V =.TOONpRVZVbe&%k&[ (s7AT=f#_EqqG͚k\$|iaP= J,wZ#- Կ^.RC-O*Gf1LR3gIH,{w_(8}2_SxӄڥlmRU ?-P Z9x*ˊ^g4ߏ;Ʀ]{K)ci2ʗYM=qXL\5ⲋ3Ҝ{>}ρos1z{BπAҗ쌯x-=8"KS;ıy0ڭeW*3gs!d㤣v 9-9N\=S('}طj)R8p!sr_iިZk @ޟFC; ?(ZE[ /m$9 Ψ VG>&<+9+ݭ>#F8>a"t53^1)~I4I.= nyrZѲCk_^vC:nqͨ_AWpUag#|d>'mPY`HĦ!a훁AHy 3Mv]0'(P;>9Rw O \Է_ 7 msgvNQy"vH5wn1>WGܙT1kZlFz#xp%̟ЀpPׅ&ynipb2 6l$6jQ}0Y /{YT6M~&!aB<WD̂,naV͖72**{|a(}i Ǜ@>3ӭE2ɯN*R )\-~N]`>+T3jpJ+ҺvdP{-UCQ~JVߡ˘jռq.uOq8/y/\cص~W \8EOd%Lv^vo]v=L= %Q*Rpqlt|:\% Xe!{>V.Mxf\8x)ԚE)d 丰hBaf31Yw_ \FjTnDK} өèҟЎ#ĥTHm*|I+YÛyocz94~ qrUj“q=i7 2,vU-x1N4`Ax &kIwW?ܮWZkldkQ\Ƽ$aPcH?mчa-=~mx=Gu3z4.0Ǘoa OVȻ匷!+S;-s_ÇґvaxoUU@HnHA9 5 p.UShYo;od6L3eR\Fϐ8($ٵ},dܞv,zXW^HyO6)FPP9aL_2.`SXW)>-xRV¤z0'@l] +#VlF}QӢT"TL)ӡ@D<0TMPiu򡟋xO;,O!lZXdao St~KDMIxOFGIv\EAVvtK6nOe)ג5f(ՓBI|ǑuӔx(Ʃgl|?Ck w!Gzc)<\Ԡik4gHnq '(i]h5o01Qߕ%H$(SB*f76OaPrg"LΨdkAhk=\hxl`A./ѻy Mvwt飵pQqWKlzwj̬`@ T fUvrBla:]L"v0!dOcK*TanEx* J 4X1-Rr'%=2r9&Pi&m %Y(aW&n[z>Ъ<D(i jq 2/ f;ȱ^]zAݡahui%X̵ݒ̃iˮ@9,FgI$ Q"lzK;6Gm2*b.A2.L'x}ì#AⶪTѯe"k^Nch6+ڃ6P$).(\S95rN& )| ~DV3`jMàSN?O2os:Q Ct(DQ][קt}v?Ӻo7cM-G)'?>e4"}"}wS(=ME.am$wp3+~MI0ךm?x=Jy<6,1Գt . -..FC1yf0Fs/6ͮR~ꠃ9^bS{7nx0":w[Jp*Nc(+y_D hp4x{zJlqVm7Q]l֪8ħΊL aYy'{ pUpW -l*/lmధ=)alfyt\A%wi6Mßc$Q\|yLB̠' @6t|A-EBzq¶YRbN~HvJlMW[W(Z0+Vn_{^ qWp5t]B#;3b$RZGqiE&}[ L!@@%ҋ5Mgd{NY,<ªx&e5UmO;N\ 9Dx0T 4 21"-`{ak%'l4}s>$&o[EZ(4uJ>oR=V.3/<7ZEߑr6y2> xՇ >;3s*r5բf6}. +8d~d/fDUwU_=? e?ΒO o:sM* ^ je!Q`7E%qMF̍\`taL)qh ..24rqSNPVJVR2:yx|66d0yHz"u endstream endobj 590 0 obj << /Length1 1620 /Length2 16490 /Length3 0 /Length 17336 /Filter /FlateDecode >> stream xڬeT\]-SKpw; w[pww/~}GQ5^sd8Td*L掦@)GW&6fV~௙ J4qvt0q LJ@wtY[Zhr100 #]-܁vN@׿ׁ@ ĕUteJi 7S;k3Hp9:[Ӛ _.Q hf7 itb8A...K:)_9z8\HHNW+rX=i__ O.S odN b`_0@@K/__}M/hg7ܖ,lY GnNA?{o&v^sߔ;DDy/b6h~RODLjQ1OF5 Nt.&͟FBpSRL*Cz?Ǵe[Y(5l#s?Dzf{]~~uhlj(2w&v^P e a2@8EG a:YC \K-%B Ӌ B[+7l0Y8nM)Aw TuZ&L$gU[GՃ daCq'Bz k&o74z1e_@^x3pl@e#_M+.J&ѝWmg\LJ?S=m05XK}"c*vՖ$qJ s\qESib"0L¸)3/4(4vwjf7;﮷ZZ-^ndRͪDWBtj"dO-(xzT&9l0Z]4X+ O Ln啥+v k.R=7ޝ*܊@\"~^'6J;T;\R $N-Ӄ.kv\,ARp?潣s ]Fi 0EH;]ﱐ'w3kLO!A,S'E8'z_6btV/ږ9M6soLrn* ͆)BVHU? Z޹e繶B5Y7EME:^sy2D 2g3BOmyw= _cS"&[7 yvm]wLDnQ M%g"nޤnLAeج7ja.x팡qsٱffIPv&.F3Y*wO i&EbH.#?YZu`#/o~;^jb~FW,6Cq ώXċs=~3&=#pO^yUͲ1垾-X :n65GV !iNJ q޺ʰčv 44sBͽbahSUyBMtNN(ϑ%<':Y|QYhDcJ]W) &HrlTbE6h;|=eVeyx3D:#[AQ14Oݤz9 ZW3QN6&OrM@? ?(gVSet `Hk͔T<^ͼ=2D᭑7FX拹rh˨2UҨN%h9{h4;y"Dg:Tn|%rbpA})Tb_/9_\f2U5KҚ(ӵ{0pw[8_")PA%>k߫J]&v0X˷;gX靳~c˝[rZ`) S_{pʚ:!nE2}2)8qUk q9c Swt5u&*'YW#W^fn]8wDbxi)p5LܠEYa?: *t;X:Tަp GB )p(?'Y ncVH@*KW Ҁo;b~8Q\5ݩTqBrPz&PN%`#Xr/&6w}n|ZFi*L\qye OT!犬!0r,R"W&V0@mϪӹ)X0 ]8O[}&gLMV5{+ S)U'Ŭp#غ6RIG2Gn>'Cz3o%ڡUωXJj+۩Ic( ʆ30F1(l],NH2YrU{)&% T~~* q)7ewt}(,ߩV4m;v- o[`KYf*qΠiֳY]jg*Ueex0_t#cyK .}=;dA2Lm3i-U##y[x\NRdPPydP Nb) >s~^X䁣+NS1X%M B4o`[eq{_]^_P$ȿkx8{ u'a7;x=´y\f"pDAGycNaޏ wRkI)7x8ZIAԥ)[%d%c'c%3Lfk;?{H/ݷNm>nE3Ŏ@s(!F=1 \0` "A 6tΉC@=#eIMˠ^ rg/J:5i[J*c7œi ۢhP%`hf"PǺf>ۗWt2,ZMҐݠ3;/ÌսuO9 Qe'V$b00bGˁ#V iϚ+Aw/ԡHHZF4W^k##K'-}[5;'&xNҊdqqdryi\Öfh褃_l63b WI+_%r[PޠT~/9Ҭx៥:he-_UZ܆]+OfW:'N3@<{WYK ,'d~Ys} uFt\}.PON'V 4)%A!)n5?Dtac7'J*&@lCdm]únqhӠk#?rid7%J~Njh[yG/nWׁxMQ~Z|~ C\킚n-/qܝ#~.K-6_mþrc9_iFf2} N/:H:l9B+(&/^F9m%O(tY֘z2ג/BCIڼ.m:0h ,UW">?,6vqٲyG P|ⳐgUS7nzz"LPm5rk>}Έhg E_G ΎfN5jߒ8x4JŃOS}_DlQU 3=,ӯ.L ?*ܠB]T$EG4w0f33uZw>%33h\=CqLrTx|Z;X x:t5jOk勓epH 6=`Cj9x#o|*`gol ʇ}!b Jb՘ōebaIPZ݀1caeMÔJ<Z;ߨ)Zt f!9%JTH4L4RWl ˗2 #jr)jƱv `>q krv 6PMEGz(jz7.]͓P.%lQ׊Uݞ.6E(^{%GG2eaY ʎ* l?:Mg#w%si mk`~LM(?oQ¯XoS!q${cw @qk3ɳ <v\@wFyOy`':{.oCk"YD0/LFO>0F1Σhmv.膐^Iz|%e.ԏVy DǐlQ=QXN(n 0_ur~7d=MplRuÀ"I(gн؝Ieⴣ9{Q4I[Om7R,f<­G΀SX8z# ^spss4wo?~S'n#SBssQ)|r` 9q>ʵ$pd?! PŚ\c^7 ̋KNJdT{g4{yF%y ea6=zrHUy Au t?ܘď]?Yzec[Y2+hse1e$tUT~Bs7?yGY`M;ƽ:tSUEҥJt$۬GouKad(wmyi3_r~6ܟ<]"3mW֘.:FxCp>$+if <˙or- r]X\(q4c_K&QPEC ky t1k6Y!U#(/KUp?&JOS ){)ePٓMm1φ[d5y8)-XOUrrE[Nj @ r[p, P2q pF>dt^Mњ O1cE1kސ6(6 c_[Jv*p<&!3Dp g {;$x9r8H~rIĚh7$ RZ{l. L\yY~ޘL7$h: m(O-]EvUۈ4l`354(|ҙCT ~Kt;MK<%5A](z(I8#]*}qn"["Wb̲*x{s)N|PWg*$:}XVJ gG!pֆh3Ê $N V:~0\wv,KS?ML(V̂qCǶ0']xEahS2#2q =DR7 G% TkWD|Ƣ5#BF'mg;C-\]<Lx:l0O~P 0xsDBn-(\۷Ixߛ]#1UJ7[l*?RkKǃ4҃N|AbT)M S{sc'eƊ~< 5JYo:5[3k3 o*n[O\-W.ܙGL 7L= riM˱="yLv,d {UϠMM8Akm;Ŭ~q_-=|xO0h6d&8}4A@J{o,4LsgC= m򃉐! SRn}?ʹFO:F[Z0=#X f"o\!|X29BK+)eOXCdj; xp=BnVU畞q2Jc$&_FW.E5Yz.϶L\"j^-Yc'}`wnZN_-}QQclbiea*nK/ aŌϯ܁hx $9浺@@d:\8ۅoh[m0O#N6kev_b'ŠzpZjy+ʜA uusVB}RH܂M ع~J+m.kx>g#]qx|ߦcگӖ7xW 7E2&s_M}qLll%rc!d.7kP)J"\Y<(8AV_`v 鿩ٻl4^b?z?ZWx@/:GC(jyMX ,I "evR9~X;%>{Ѧ?I. !䙳H5gDBK*,!MmtN6FL?!Ro2| #bw`W3%01AѦEYcpO]IZ^uǙrsi4 pIiY֢_DJ'C5p +.s}B?n&HC;.^m #̄ 9 '$ J.JZ^]0H/zr,BSq/[^!`FC-/FTw*:K ֕Gh4hWͬ@V2 0<33B貪мwnLn1jJ5Ԯ-z䫚emS nj4 ŷ(Ҷ5ۓ%t=]r僃,?6Rv]/28r̨S& 7q3t]qoReo݁dDFTOZauƏEƣs 3';kBBalw&6ώayANl2UI4ЊM731E?Dk-*oWb,"U|gٙUp]ur\C|RR)w4|rtY̭ ;rn('c='{"3uN :\l6am_=M>\Ɉ/W3GINT1F4 .h"Ǫ a!D V_a fbQ[Eo F >hRt#PHߡ^;2D@^h@9kxzK ȹAejzB\F׺~&\A?wB.i=_BS@f'6VG~^+A㑏Q@XCZ.p` aV E|j0WG3o3[5%&!4?#ϵ [;}-n')*[(Y΋+N>2^:;nH! !&<ςe)[Շf=ߠ}o YʸTKOiI$+U| -'{ G.fwc[n#,د; }x:n#z LS8uq+2GFZv-w=G!n49B̗2&U׻p8'o:kN|2fep4Ä!D#);Dj?lDh)2\rnjB5G0a,Be?=+7):Y: p`!kq|yVqP#o^ˢ+JԷ ugJLn*ٗbwߚ,ޘѭ.0o͜_piF}E4B cnk-]b<@ N@s嫃a'P|C 5OόnaΔ-TcjN!Oa{JH)Ɓ}{(' {LC"*[g>왜$Eo7? M;TNwӕ$/ySS+eK'QǑ=L.+ʅ@ Oot3n RZ1ܛ`=ClK9jaĬq`(uF"wL#Dc/iK/b7~V&IO_InYEA/Y͓$1W^vDYmGѳT>̞^Q;gaR8J>tk o?40mH\ ;%}i, ۊp_a־ _/\,b@ /X(%5t{+|p(] -P[^p^hۖb $|=ؔh~泻?%Ѵ1J 6(ArIIKRcBUg¤EE7juȅ E <!dR_(Z L %q˦~ߤf0eõvN9/)/0H58›[8AD2!UoKS5=5yIIX)Ʊ-3X1v.N =3yK$r?-_Q.~jqï]oCB5FYܣ7O0JLw'n&}U?e"*n 1Jw(&;aBU|Mf7୾[A躝XuWZK6%;2m0;q~^'ԢÔA!US{ޜ"ÊzX>R-=;ߚ r>OgK>Ժ1^[Bugl↦wt}e2;,P./U և &(Dž@8rDLBVK=R[&y}%G.q}2D@.(mQESUEr&esVt:aLgnuۏ߫`+_*S!ijZ;Njjى`GȰxn X#5KaȩwȄےѯY~,!3sr^w;pikѮ,^ U"EEo]blkbb\1睹 Ьs%B@ [VEV.y_L bt#Vp,{MX^LVs:k "}}5@WUD* ZqgQ.nR[8b/Pɇ2.._7X] l;mTFO(|k4ʥ*kUd:J%ph _hQ ɫz PLL3iRμ {`_Vg8$72(SN0zL5jDwqXUIWQ؏HwqJb_-{eίG ,XiAo(,X1%K)uyA#L>.qW?, )з65 w@3 ]Yk\=HyLۯ1!tzhj3~ӇH|>TUPh&1[1x{l+O13dR)>T RI>/r$*Zl'υ,[\-K4 Mkf](nM\)"q˯_?2 4田(TR Jn6 Lœصh4Ii5`fn3M!jHuТbh&LDSܽ-'H; E?ZO|YS+ V|R4Ni-<_u{C', It[hBr 2Ipm͟\xd]S#堜K1/RArm}]OnaZߏyj]4~Ef˒6Rq5G<<6ܡg=]LՋZ{1~tdbQ'7 cDEIli{{'&]0mHP2$3e\3->dݚ|K-t *ܚ' оz+DUlO!vgq{рNm'˦`-*o_dh ]Q=~o~hNJkɓSQ.w{=JKV[c~K$Y1TC6H<kĨ iCשG58dF.#,)_ZiCVSZ%MkC||a_ZkVp|c}8 3.ۨLP`ȝ;Rgłe'C1~﫞U8i&$"j-{ ѫ BQu5Ϡ6]a3gb:0%QZy&^r_}FQ4vy7vηqD4cZd^ћ6 Op0sP eTwȦe>BSi[583M&Q.D)^{@ǪFMp OtUOuS>;zu RA% q ]*akn4aILA1<=(6OSU 9ۛ_PWƐ{wx,nP=؂>DB+(C\99dXVbx:Rk%wNA)G4) ^͆$ )`4NJ?*!Rs /H2 ,uCNUOd'pzJ^;n'cϾ\Jθmuپ!}w$ph1'`@!C>AX~i\)d{-P. Y}lU`ɵ>H0Z86taqGtE%':(w%y>6v{f 6kUmLk SG:>U3 0;Zo?|矡shZgƪmΕbKș4+M ozhW8E>؉L?;uy@ =U/z%_bJ nZ~i4+=ʤD5M9u"L ]@_vqvڎ-QS}yf (/I~ Zٯn (D9ƫ=RS aHAJSPշC~XG 8{`T8?t؄fPеF0 M}"6ԄJQ:ɚKVx=_ep - &V0// =O](l$9VU"ҹA,CH]*6v?kS{jM4Ax)QoX`qԤf_,wR}DY[oé |õpX#^`7VGFE]D余q╅@;Z"q00+SKkf.mgZhN5K2ZS K S |9 2Lˇ?6B[_24Y| E[ș\ڢcLUwnub*ij t?UuQA9HT i{Z:D}Uzdp;f*ںzxg!X!Ҹ5U6MK2[oѾS%m"/Gf)hV޼Hu'U` 8MXe.]뾄ۖOyŽ  !.x#6JZΫ ꇅnԤ%&h+WN`FO !&^bM[7QHA{@NnA1g!C䵔La "lj'PC\/yc51:bb :ouOA\Ho1X!:[ lm=hC,qw+*4,4E8,t x~$Ưfha1 R*%c(z`DGu}\peר6б-3R<1Ϭs=4c&]-^#gTƱ0nwP穁/:Q*O.4*%Q{XNqIeAϪ a3w$,蝜 9hՎWY*9!f>Vq\jրw:v=Nj̱]KtFXz7\'iRYݜzUt%;>2^Zj!c|tHYxana '1 WVna AWkʽX/I u}oWϜQiDSFɘw3w endstream endobj 527 0 obj << /Type /ObjStm /N 100 /First 956 /Length 4408 /Filter /FlateDecode >> stream xkS;"- ~wWmm(*.j!f;3s3d[Jt;CI()d}%D[gpĎHHbY˶0 sZL2踄3`&70P]<)D8cd" TR%dHCdi,>|6;(h2`G%X`F%TYb$R kL#Xnv8HrШY$ẁ2<.Rl)PHfpBdQs(\R0N0%$YłxPL8PX̩-◜\Br%I FhZ8(I>S,ç0CqHAlK Dn qЙ{pԻrt ̡FAV\bO-\T F>ڒH6xZ)h== .@g$f8Ǟ3H9G΍1<~ XX'ЬәEӅy%d,X qĉ3sHfX0 @O3H]pj~FQb(qkQ&(Szq́mV|- &Żh{;jv@֯dK=i\)^d6C&ym>J϶i)?{؈ZYB IfG'w&rhJ jfk 2\+a< !(3,ޡF*:WkTA`22:c D]r#;T}t&ȃBA:;@w,$S+j0aBձJ 1{nZ2hYyUܰ>6bi@&ƩY˱J!-cQ }< ,`2^cC߆7g)UB@AT:cE'MjQ3P[5z3,=W f.XIz%KPx(XuW݉W!CѐV-oQѡ#UNNۈH̀s+ < O dE"npN9@UCBܳ =x#G,bIVލEqŬFy/%pgGst1Z^`ڳEVf%0)[`%2+^Yf%I+*ឮ1Jkxz$@&4ȤJaQ`LK~( D M^,'asطH÷- `ӀD K4DK|Qs^&~8F81zۃ0@$˽Ța&1Pزzl?99Z%dC%U!u7EB-`6YLg=| O8y9('ۛ~K>mN'0 A1Y %[i1msηңE>v'W"flQ"̒\3|_HY=C/Vw0wqgo!vmsZ}HZ{D,9YcɊ%;X2"s5sO|Xϋ?qim>JoY1nF:8::{8;뒀f^V(- e,ş:/z^Nf?셛E1οu)K-뎊1P.<ɠHGӫ MtIsW )W|0e ihuZ4u1Uռ[=P7|S_z 6kལ{^ռ]մ4V;V׫ks$^BZ"vZ [#A8?3?meY`cq %Dyz;kJ"m=V0YQz21ke;$uq*g*UG^RzRz1+ n~R, 'EtCoxa?-fM/U<;ylIm' K^_][0jpts_򛛼,*Ogt>ug{wwlF,DTi5=+9`?lS.jٵgq>G˰@gV$G<1&q1\)Sh2BzyGoN;/{e'" Nċ nUvuזqusHVA-&4eLu:N1_ kX~pwd*[k Lvvp骚Q'$h_j^W5ܕUgb,y8+.T4lyç'u&O㼃Ah%6,ZT}GmWJ쭚ȘWM'{ga1+JJ{QizcgX+i=}˺H1Ox}Tbrچ5e;b^R}GKђk&Mג"&pr ?s y{!y%B+L5f@T}ԲZ=ddd$d.XK+ hQY&xT2/$^a戉ӑYg]7KDb?M񙄩lWXKwj`at7yA 'p8/"yy^.[q}45&~-"x.x3Dȱ\"wrG|+nU/ﱚ .V; >wM 4?v}wCM+f#gwcoi"W>k#0|sĿbxBt/# 7WLְH`o>7v\}sG~𤪡z׷$G}cC}D71M:V ЙΔ5GޯM}Y7 YZ "?_;Mj~z֒M\贍DgK4zIl5eLtLsDKu_sX-Moqp g¯$K\0?Gg8A3YMp= !zkk18[ ~3&Cu"مk=f8ǣCfD8{I> } [\* 0 ~ ڹpq]1fEL.k_ BƙHu k^áC͖`K^.FҞN`]yL-aon³˙'+}$v}?;l;;y_kJXN,pJ .LK ٢f]"JW0|dl )3.~o.oR,+N$jlXLC l6kTj0Y;,?]WW[J;$R ThԠP" jhcWWWo5~3aJ Jª.UAe}dM)M)R63|e^ZUWT5QVJ 6E%x!H5aɺՅeu Q֭5QV 6xcRBQ {)x]ȍW`g2/?;1 endstream endobj 624 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.15)/Keywords() /CreationDate (D:20150401203214+02'00') /ModDate (D:20150401203214+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) kpathsea version 6.2.0) >> endobj 596 0 obj << /Type /ObjStm /N 56 /First 461 /Length 1677 /Filter /FlateDecode >> stream x}XMo61.~AE^ڦEӞGu؆w]!%.ItWzμy3()JV(x+{)4E'"0D-N*pv apFD =x43 wc)ks @;|| h2Ef+ܥhg(w6ZiDЗ DH p^h(%)G1HZGF Qw4"Ĕ€ xD jꐝq$20!АVRPEZDB:E*s E(SQUt(@T_fwon8#뱬nxiox*ۧTta~F!e{q/+rw2ͮreWWJ֮&+5aSt#t摗|ʈƱF[q xx: M =<ס JB[9@C=Zh>u_fM-`E}/ݸ=ޮ6Tuuo{]mHj#+[^O5d5ϩPZ+ax{>}L#YUY\,jDB!ɭFH¿!-R,6D3$!!~I2;S `prR>%`2nZr0i/ N2G~GG1}*4e+OԜgBaxS0O sq_㸔H%1l(H:CjfeH'9x,yǼ,#>-F}z=~VBϧƑѼGeys IǼNIq ER]3}_7ts$8Kfnj7]$_? O\Z9=JMAM3fW4vIM'N7u[jMޏ'4r׋}q7p|;l,;]|<'d~sO.O_7>e&@po+ endstream endobj 625 0 obj << /Type /XRef /Index [0 626] /Size 626 /W [1 3 1] /Root 623 0 R /Info 624 0 R /ID [ ] /Length 1498 /Filter /FlateDecode >> stream x%KhUG;5jNy<51/s$FGc4/͢"B ]jB]8H)](uQ[-PA{7;3g8ȹșsqDžEi4Z=fd0w"Z̝`"Z nPvs[x}Ъ0h1(Eۃ E5cZ^^֊VסuFЄ66 ^Њ6OmhG8&tL mAZ#}h^hx0hhrF~tA[CSXhhDN4 6 Z9& ЮcNchEh040gq4ob΂hhs A@[< NG[< Юb.Ez+gZm,8֎vsGB[R>K%h221z#h+mr c7R4mCs:h+h > 9qhWC""(ى'8 Jg";\$I {iȷ@"3 V҄Zs;nPB5; b)Gat$C Btj`!HHHHp. I 50 !@mc@43W`\&319)sjk),qrP Kr#Z̒`u=,@` z d Q/:.amܳ $vOeY2Ψ1e|}@- WJ_ TkA#(5w5Sm͠ 4۞ЬwP-ZQE+4j r=5jgZFmQv˼VeWuZ5,[~Gn~QeoQ/Prŋ.Ǎ 4.'n)qRRhu)H)Z)e)T7Z]a1R7R$e>,x5z endstream endobj startxref 322299 %%EOF lhs2tex-1.19/doc/FormatRecurse.lhs0000644000175000017500000000022112507035615017704 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%% THE FOLLOWING IS BAD: >%format text = "\mathsf{" text "}" \endgroup lhs2tex-1.19/doc/ImplicitUnderscoreIn.lhs0000644000175000017500000000065112507035615021225 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format a_i >%format a_j >%format left = "\leftarrow " >%format right = "\rightarrow " >%format a_left >%format a_right >%format a_let >%format a_where >%format a_x_1 >%format a_x_2 >%format y_1 >%format y_2 >%format a_y_1 >%format a_y_2 >%format a_y1 >%format a_i' >|[a_i,a_j,a_left,a_right,a_let,a_where,a_x_1,a_x_2,a_y_1,a_y_2,a_y1,a_i']| \endgroup lhs2tex-1.19/doc/FormatGreekIn.lhs0000644000175000017500000000025412507035615017626 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format alpha = "\alpha" > >\begin{code} >tan alpha = sin alpha / cos alpha >\end{code} \endgroup lhs2tex-1.19/doc/AccidentalCIn.lhs0000644000175000017500000000154212507035615017553 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" %format \ = "\char''134" %format let = "let" %format in = "in" %format where = "where" %format -> = "->" %format != = "{\origcolor{hcolor}" = "}" %format !:: = "{\origcolor{hcolor}" :: "}" %format ^ = " " %format C = "{\origcolor{hcolor}" %format D = "}" \begingroup \let\origtt=\texfamily \let\small\footnotesize \def\texfamily#1{\origtt} >%format <| = "\lhd " > >> options !:: [String] -> ([Class],[String]) >> options != foldr (<|) ([],[]) >> where C^"-align"^D <| (ds,s: as) = (Dir Align s : ds, as) >> C^('-':'i':s)^D <| (ds, as) = (Dir Include s : ds, as) >> C^('-':'l':s)^D <| (ds, as) = (Dir Let s : ds, as) >> C^s^D <| (ds, as) = ( ds,s : as) \endgroup lhs2tex-1.19/doc/typewriter.fmt0000644000175000017500000003000112507035615017340 0ustar00andresandres00000000000000%subst verb a = "\text{\tt " a "}" %subst verbatim a = "\begin{tabbing}\tt'n" a "'n\end{tabbing}'n" %subst verbnl = "\\'n\tt " %if style == tt %subst inline a = "\text{\texfamily " a "}" %subst thinspace = "\Sp " %subst code a = "\begin{tabbing}\texfamily'n" a "'n\end{tabbing}'n" %subst comment a = "{\rmfamily-{}- " a "}" %subst nested a = "{\rmfamily\enskip\{- " a " -\}\enskip}" %subst pragma a = "{\rmfamily\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %subst spaces a = a %subst special a = a %subst space = "~" %subst newline = "\\'n\texfamily " %subst conid a = "{" a "}" %subst varid a = a %subst consym a = a %subst varsym a = a %subst numeral a = a %subst char a = "''" a "''" %subst string a = "\char34 " a "\char34 " %if underlineKeywords %subst keyword a = "\uline{" a "}" %else %if color %subst keyword a = "{\origcolor{red} " a "}" %else %subst keyword a = "{\itshape " a "}" %endif %format \ = "\char''10" %format . = "\char''00" %if not spacePreserving %format alpha = "\char''02" %format beta = "\char''03" %format gamma = "\char''11" %format delta = "\char''12" %format pi = "\char''07" %format infty = "\char''16" %format intersect = "\char''22" %format union = "\char''23" %format forall = "\char''24" %format exists = "\char''25" %format not = "\char''05" %format && = "\char''04" %format || = "\char''37" %format <- = "\char''06" %format -> = "\char''31" %format == = "\char''36" %format /= = "\char''32" %format <= = "\char''34" %format >= = "\char''35" %endif %if meta %format M.a = "\ensuremath{a}" %format M.b = "\ensuremath{b}" %format M.c = "\ensuremath{c}" %format M.d = "\ensuremath{d}" %format M.e = "\ensuremath{e}" %format M.f = "\ensuremath{f}" %format M.g = "\ensuremath{g}" %format M.h = "\ensuremath{h}" %format M.i = "\ensuremath{i}" %format M.j = "\ensuremath{j}" %format M.k = "\ensuremath{k}" %format M.l = "\ensuremath{l}" %format M.m = "\ensuremath{m}" %format M.n = "\ensuremath{n}" %format M.o = "\ensuremath{o}" %format M.p = "\ensuremath{p}" %format M.q = "\ensuremath{q}" %format M.r = "\ensuremath{r}" %format M.s = "\ensuremath{s}" %format M.t = "\ensuremath{t}" %format M.u = "\ensuremath{u}" %format M.v = "\ensuremath{v}" %format M.w = "\ensuremath{w}" %format M.x = "\ensuremath{x}" %format M.y = "\ensuremath{y}" %format M.z = "\ensuremath{z}" %format M.A = "\ensuremath{A}" %format M.B = "\ensuremath{B}" %format M.C = "\ensuremath{C}" %format M.D = "\ensuremath{D}" %format M.E = "\ensuremath{E}" %format M.F = "\ensuremath{F}" %format M.G = "\ensuremath{G}" %format M.H = "\ensuremath{H}" %format M.I = "\ensuremath{I}" %format M.J = "\ensuremath{J}" %format M.K = "\ensuremath{K}" %format M.L = "\ensuremath{L}" %format M.M = "\ensuremath{M}" %format M.N = "\ensuremath{N}" %format M.O = "\ensuremath{O}" %format M.P = "\ensuremath{P}" %format M.Q = "\ensuremath{Q}" %format M.R = "\ensuremath{R}" %format M.S = "\ensuremath{S}" %format M.T = "\ensuremath{T}" %format M.U = "\ensuremath{U}" %format M.V = "\ensuremath{V}" %format M.W = "\ensuremath{W}" %format M.X = "\ensuremath{X}" %format M.Y = "\ensuremath{Y}" %format M.Z = "\ensuremath{Z}" %format M.alpha = "\ensuremath{\alpha}" %format M.beta = "\ensuremath{\beta}" %format M.gamma = "\ensuremath{\gamma}" %format M.delta = "\ensuremath{\delta}" %format M.epsilon = "\ensuremath{\epsilon}" %format M.zeta = "\ensuremath{\zeta}" %format M.eta = "\ensuremath{\eta}" %format M.theta = "\ensuremath{\theta}" %format M.iota = "\ensuremath{\iota}" %format M.kappa = "\ensuremath{\kappa}" %format M.lambda = "\ensuremath{\lambda}" %format M.mu = "\ensuremath{\mu}" %format M.nu = "\ensuremath{\nu}" %format M.xi = "\ensuremath{\xi}" %format M.pi = "\ensuremath{\pi}" %format M.rho = "\ensuremath{\rho}" %format M.sigma = "\ensuremath{\sigma}" %format M.tau = "\ensuremath{\tau}" %format M.upsilon = "\ensuremath{\upsilon}" %format M.phi = "\ensuremath{\phi}" %format M.chi = "\ensuremath{\chi}" %format M.psi = "\ensuremath{\psi}" %format M.omega = "\ensuremath{\omega}" %format M.Gamma = "\ensuremath{\Gamma}" %format M.Delta = "\ensuremath{\Delta}" %format M.Theta = "\ensuremath{\Theta}" %format M.Lambda = "\ensuremath{\Lambda}" %format M.Xi = "\ensuremath{\Xi}" %format M.Pi = "\ensuremath{\Pi}" %format M.Sigma = "\ensuremath{\Sigma}" %format M.Upsilon = "\ensuremath{\Upsilon}" %format M.Phi = "\ensuremath{\Phi}" %format M.Psi = "\ensuremath{\Psi}" %format M.Omega = "\ensuremath{\Omega}" %format M.forall = "\ensuremath{\forall}" %format M.exists = "\ensuremath{\exists}" %format M.not = "\ensuremath{\neg}" %format ==> = "\ensuremath{\Longrightarrow}" %format <== = "\ensuremath{\Longleftarrow}" %format /\ = "\ensuremath{\wedge}" %format \/ = "\ensuremath{\vee}" %format M.= = "\ensuremath{=}" %format M./= = "\ensuremath{\neq}" %format M.< = "\ensuremath{<}" %format M.<= = "\ensuremath{\leq}" %format M.>= = "\ensuremath{\geq}" %format M.> = "\ensuremath{>}" %endif %elif style == newcode %subst comment a = "-- " a %subst nested a = "{- " a " -}" %subst code a = a "'n" %subst newline = "'n" %subst dummy = %subst pragma a = "{-# " a " #-}" %subst tex a = %subst numeral a = a %subst keyword a = a %subst spaces a = a %subst special a = a %subst space = " " %subst conid a = a %subst varid a = a %subst consym a = a %subst varsym a = a %subst char a = "''" a "''" %subst string a = "'d" a "'d" %format # = "#" %format $ = "$" %format % = "%" %format & = "&" %elif style == math %subst phantom a = "\phantom{" a "\mbox{}}" %subst comment a = "\mbox{\qquad-{}- " a "}" %subst nested a = "\mbox{\enskip\{- " a " -\}\enskip}" %if array %subst code a = "\[\begin{array}{@{}lcl}'n\hspace{\lwidth}&\hspace{\cwidth}&\\[-10pt]'n" a "'n\end{array}\]" %subst column3 l c r = "{}" l " & " c " & {" r "}" %subst column1 a = "\multicolumn{3}{@{}l}{" a "}" %else %subst code a = "\begin{tabbing}'n\qquad\=\hspace{\lwidth}\=\hspace{\cwidth}\=\+\kill'n" a "'n\end{tabbing}" %subst column3 l c r = "$" l "$ \> \makebox[\cwidth]{$" c "$} \> ${" r "}$" %subst column1 a = "${" a "}$" %endif %subst newline = "\\'n" %subst blankline = "\\[1mm]'n" %let anyMath = True %elif style == poly %subst comment a = "\mbox{\onelinecomment " a "}" %subst nested a = "\mbox{\commentbegin " a " \commentend}" %if array %subst code a = "\['n\begin{parray}\SaveRestoreHook'n" a "\ColumnHook'n\end{parray}'n\]\resethooks'n" %else %subst code a = "\begingroup\par\noindent\advance\leftskip\mathindent\('n\begin{pboxed}\SaveRestoreHook'n" a "\ColumnHook'n\end{pboxed}'n\)\par\noindent\endgroup\resethooks'n" %endif %subst column c a = "\column{" c "}{" a "}'n" %subst fromto b e t = "\fromto{" b "}{" e "}{{}" t "{}}'n" %subst left = "@{}l@{}" %subst centered = "@{}c@{}" %subst dummycol = "@{}l@{}" %subst newline = "\nextline'n" %subst blankline = "\nextline[\blanklineskip]'n" %subst indent n = "\hsindent{" n "}" %let anyMath = True %endif %if anyMath %let autoSpacing = True %subst dummy = "\cdot " %subst inline a = "\ensuremath{" a "}" %subst hskip a = "\hskip" a "em\relax" %subst pragma a = "\mbox{\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %if latex209 %subst numeral a = "{\mathrm " a "}" %subst keyword a = "{\mathbf " a "}" %else %subst numeral a = "\mathrm{" a "}" %subst keyword a = "\mathbf{" a "}" %endif %subst spaces a = a %subst special a = a %subst space = "\;" %subst conid a = "\Conid{" a "}" %subst varid a = "\Varid{" a "}" %subst consym a = "\mathbin{" a "}" %subst varsym a = "\mathbin{" a "}" %subst char a = "\text{\tt ''" a "''}" %subst string a = "\text{\tt \char34 " a "\char34}" %format _ = "\anonymous " %format -> = "\to " %format <- = "\leftarrow " %format => = "\Rightarrow " %format \ = "\lambda " %format | = "\mid " %format { = "\{\mskip1.5mu " %format } = "\mskip1.5mu\}" %format [ = "[\mskip1.5mu " %format ] = "\mskip1.5mu]" %format = = "\mathrel{=}" %format .. = "\mathinner{\ldotp\ldotp}" %format ~ = "\mathord{\sim}" %format @ = "\mathord{@}" %format . = "\mathbin{\circ}" %format !! = "\mathbin{!!}" %format ^ = "\mathbin{\uparrow}" %format ^^ = "\mathbin{\uparrow\uparrow}" %format ** = "\mathbin{**}" %format / = "\mathbin{/}" %format `quot` = "\mathbin{\Varid{`quot`}}" %format `rem` = "\mathbin{\Varid{`rem`}}" %format `div` = "\mathbin{\Varid{`div`}}" %format `mod` = "\mathbin{\Varid{`mod`}}" %format :% = "\mathbin{:\%}" %format % = "\mathbin{\%}" %format : = "\mathbin{:}" %format ++ = "\plus " %format == = "\equiv " %% ODER: format == = "\mathrel{==}" %format /= = "\not\equiv " %% ODER: format /= = "\neq " %format <= = "\leq " %format >= = "\geq " %format `elem` = "\in " %format `notElem` = "\notin " %format && = "\mathrel{\wedge}" %format || = "\mathrel{\vee}" %format >> = "\sequ " %format >>= = "\bind " %format $ = "\mathbin{\$}" %format `seq` = "\mathbin{\Varid{`seq`}}" %format ! = "\mathbin{!}" %format // = "\mathbin{//}" %format undefined = "\bot " %format not = "\neg " %if meta %format M.a = "a" %format M.b = "b" %format M.c = "c" %format M.d = "d" %format M.e = "e" %format M.f = "f" %format M.g = "g" %format M.h = "h" %format M.i = "i" %format M.j = "j" %format M.k = "k" %format M.l = "l" %format M.m = "m" %format M.n = "n" %format M.o = "o" %format M.p = "p" %format M.q = "q" %format M.r = "r" %format M.s = "s" %format M.t = "t" %format M.u = "u" %format M.v = "v" %format M.w = "w" %format M.x = "x" %format M.y = "y" %format M.z = "z" %format M.A = "A" %format M.B = "B" %format M.C = "C" %format M.D = "D" %format M.E = "E" %format M.F = "F" %format M.G = "G" %format M.H = "H" %format M.I = "I" %format M.J = "J" %format M.K = "K" %format M.L = "L" %format M.M = "M" %format M.N = "N" %format M.O = "O" %format M.P = "P" %format M.Q = "Q" %format M.R = "R" %format M.S = "S" %format M.T = "T" %format M.U = "U" %format M.V = "V" %format M.W = "W" %format M.X = "X" %format M.Y = "Y" %format M.Z = "Z" %format M.alpha = "\alpha " %format M.beta = "\beta " %format M.gamma = "\gamma " %format M.delta = "\delta " %format M.epsilon = "\epsilon " %format M.zeta = "\zeta " %format M.eta = "\eta " %format M.theta = "\theta " %format M.iota = "\iota " %format M.kappa = "\kappa " %format M.lambda = "\lambda " %format M.mu = "\mu " %format M.nu = "\nu " %format M.xi = "\xi " %format M.pi = "\pi " %format M.rho = "\rho " %format M.sigma = "\sigma " %format M.tau = "\tau " %format M.upsilon = "\upsilon " %format M.phi = "\phi " %format M.chi = "\chi " %format M.psi = "\psi " %format M.omega = "\omega " %format M.Gamma = "\Gamma " %format M.Delta = "\Delta " %format M.Theta = "\Theta " %format M.Lambda = "\Lambda " %format M.Xi = "\Xi " %format M.Pi = "\Pi " %format M.Sigma = "\Sigma " %format M.Upsilon = "\Upsilon " %format M.Phi = "\Phi " %format M.Psi = "\Psi " %format M.Omega = "\Omega " %format M.forall = "\forall " %format M.exists = "\exists " %format M.not = "\neg " %format ==> = "\enskip\Longrightarrow\enskip " %format <== = "\enskip\Longleftarrow\enskip " %format /\ = "\enskip\mathrel{\wedge}\enskip " %format \/ = "\enskip\mathrel{\vee}\enskip " %format M.= = "=" %format M./= = "\neq " %format M.< = "<" %format M.<= = "\leq " %format M.>= = "\geq " %format M.> = ">" %endif %endif %endif lhs2tex-1.19/doc/FormatId.lhs0000644000175000017500000000026512507035615016640 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format new = "\mathbf{new}" >%format text0 = text >%format text_new = text "_{" new "}" \endgroup lhs2tex-1.19/doc/FormatElem.lhs0000644000175000017500000000016012507035615017160 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format `elem` = "\in " \endgroup lhs2tex-1.19/doc/RepAlg.lhs0000644000175000017500000000053512507035615016305 0ustar00andresandres00000000000000%include poly.fmt > rep_alg = (\ _ -> \m -> Leaf m > ,\ lfun rfun -> \m -> let lt = lfun m > rt = rfun m > in Bin lt rt > ) > replace_min' t = (cata_Tree rep_alg t) (cata_Tree min_alg t) lhs2tex-1.19/doc/IfSyntax.lhs0000644000175000017500000000023612507035615016676 0ustar00andresandres00000000000000%include tex.fmt %format ... = "\dots " \begin{code} dir(^if^) ^^ ent(expression) ... dir(elif) ^^ ent(expression) ... dir(^else^) ... dir(endif) \end{code} lhs2tex-1.19/doc/FormatIdentifierRedefs.lhs0000644000175000017500000000030412507035615021511 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format ++ = "\mathbin{\mathbf{+}}" >%format undefined = "\Varid{undefined}" >%format not = "!" \endgroup lhs2tex-1.19/doc/ZipPolyIn.lhs0000644000175000017500000000115212507035615017024 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt\makebox[0pt]{\phantom{X}}} \begin{code} zip :: [a] -> [b] -> [(a,b)] zip = zipWith (\a b -> (a,b)) zipWith :: (a->b->c) -> [a]->[b]->[c] zipWith z (a:as) (b:bs) = z a b : zipWith z as bs zipWith _ _ _ = [] partition :: (a -> Bool) -> [a] -> ([a],[a]) partition p xs = foldr select ([],[]) xs where select x (ts,fs) | p x = (x:ts,fs) | otherwise = (ts,x:fs) \end{code} \endgroup lhs2tex-1.19/doc/HelloWorldBirdSpecInput.lhs0000644000175000017500000000022012507035615021631 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} > >< main :: IO () >< main = putStrLn "Hello, world!" > \endgroup lhs2tex-1.19/doc/FormatIdentifierWrong.lhs0000644000175000017500000000021712507035615021400 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%% THE FOLLOWING IS BAD: >%format undefined = "undefined" \endgroup lhs2tex-1.19/doc/GHExample.lhs0000644000175000017500000000226612507035615016750 0ustar00andresandres00000000000000%include poly.fmt %if style == "newcode" %format ^ %format ^^ = " " %format ti(a) = "{|" a "|}" %format ki(a) = "{[" a "]}" %else %format ^ = " " %format ^^ = "\;" %format ti(a) = "\lty " a "\rty " %format ki(a) = "\lki " a "\rki " \newcommand{\lty}{\mathopen{\{\mskip-3.4mu||}} \newcommand{\rty}{\mathclose{||\mskip-3.4mu\}}} \newcommand{\lki}{\mathopen{\{\mskip-3.5mu[}} \newcommand{\rki}{\mathclose{]\mskip-3.5mu\}}} %format t1 %format t2 %format a1 %format a2 %format r_ = "\rho " %format s_ = "\sigma " %format k_ = "\kappa " %format forall a = "\forall " a %format . = "." %format mapa = map "_{" a "}" %format mapb = map "_{" b "}" %format :*: = "\times " %endif \begin{code} type Map^ki(*) t1 t2 = t1 -> t2 type Map^ki(r_ -> s_) t1 t2 = forall a1 a2. Map^ki(r_) a1 a2 -> Map^ki(s_) (t1 a1) (t2 a2) map^ti(t :: k_) :: Map^ki(k_) t t map^ti(Unit) Unit = Unit map^ti(Int) i = i map^ti(Sum) mapa mapb (Inl a) = Inl (mapa a) map^ti(Sum) mapa mapb (Inr b) = Inr (mapb b) map^ti(Prod) mapa mapb (a :*: b) = mapa a :*: mapb b \end{code} lhs2tex-1.19/doc/AGExampleIn.lhs0000644000175000017500000000145712507035615017231 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt %if stc \let\small\scriptsize %endif \def\tt#1#2{\origtt\makebox[0pt]{\phantom{X}}} >%format ^ = " " >%format ^^ = "\;" >%format ATTR = "\mathbf{ATTR}" >%format SEM = "\mathbf{SEM}" >%format lhs = "\mathbf{lhs}" >%format . = "." >%format * = "\times" >%format (A(n)(f)) = @ n . f >\begin{code} >ATTR Expr Factor [ ^^ | ^^ | numvars : Int ] >ATTR Expr Factor [ ^^ | ^^ | value : Int ] > >SEM Expr > | Sum > lhs . value = A left value + A right value > . numvars = A left numvars + A right numvars >SEM Factor > | Prod > lhs . value = A left value * A right value > . numvars = A left numvars + A right numvars >\end{code} \endgroup lhs2tex-1.19/doc/ZipStupid.lhs0000644000175000017500000000112312507035615017060 0ustar00andresandres00000000000000%let array=True %include stupid.fmt %subst code a = "\begin{colorarray}{@{}lcl@{}}'n" a "\end{colorarray}'n" %align 99 \begin{code} zip :: [a] -> [b] -> [(a,b)] zip = zipWith (\a b -> (a,b)) zipWith :: (a->b->c) -> [a]->[b]->[c] zipWith z (a:as) (b:bs) = z a b : zipWith z as bs zipWith _ _ _ = [] partition :: (a -> Bool) -> [a] -> ([a],[a]) partition p xs = foldr select ([],[]) xs where select x (ts,fs) | p x = (x:ts,fs) | otherwise = (ts,x:fs) \end{code} lhs2tex-1.19/doc/lhs2TeXpre0000755000175000017500000000046612507035615016354 0ustar00andresandres00000000000000#! /bin/sh # wrapper for use with GHC/GHCi # -pgmF lhs2TeXpre -F LHSHOME=.. if [ "$1" == "$2" ]; then cp "$2" "$3" else if grep -q "^%include" "$1"; then TARGET=$3 # echo Calling with TARGET=${TARGET} ${LHSHOME}/lhs2TeX --newcode -P${LHSHOME}: $1 > ${TARGET} else cp "$2" "$3" fi fi lhs2tex-1.19/doc/poly.fmt0000644000175000017500000003006412507035615016116 0ustar00andresandres00000000000000%subst verb a = "\text{\tt " a "}" %subst verbatim a = "\begin{tabbing}\tt'n" a "'n\end{tabbing}'n" %subst verbnl = "\\'n\tt " %if style == tt %subst inline a = "\text{\texfamily " a "}" %subst thinspace = "\Sp " %subst code a = "\begin{tabbing}\texfamily'n" a "'n\end{tabbing}'n" %subst comment a = "{\rmfamily-{}- " a "}" %subst tex a = a %subst nested a = "{\rmfamily\enskip\{- " a " -\}\enskip}" %subst pragma a = "{\rmfamily\enskip\{-\#" a " \#-\}\enskip}" %subst spaces a = a %subst special a = a %subst space = "~" %subst newline = "\\'n\texfamily " %subst conid a = "{\itshape " a "}" %subst varid a = a %subst consym a = a %subst varsym a = a %subst numeral a = a %subst char a = "''" a "''" %subst string a = "\char34 " a "\char34 " %if underlineKeywords %subst keyword a = "\uline{" a "}" %else %subst keyword a = "{\bfseries " a "}" %endif %format \ = "\char''10" %format . = "\char''00" %if not spacePreserving %format alpha = "\char''02" %format beta = "\char''03" %format gamma = "\char''11" %format delta = "\char''12" %format pi = "\char''07" %format infty = "\char''16" %format intersect = "\char''22" %format union = "\char''23" %format forall = "\char''24" %format exists = "\char''25" %format not = "\char''05" %format && = "\char''04" %format || = "\char''37" %format <- = "\char''06" %format -> = "\char''31" %format == = "\char''36" %format /= = "\char''32" %format <= = "\char''34" %format >= = "\char''35" %endif %if meta %format M.a = "\ensuremath{a}" %format M.b = "\ensuremath{b}" %format M.c = "\ensuremath{c}" %format M.d = "\ensuremath{d}" %format M.e = "\ensuremath{e}" %format M.f = "\ensuremath{f}" %format M.g = "\ensuremath{g}" %format M.h = "\ensuremath{h}" %format M.i = "\ensuremath{i}" %format M.j = "\ensuremath{j}" %format M.k = "\ensuremath{k}" %format M.l = "\ensuremath{l}" %format M.m = "\ensuremath{m}" %format M.n = "\ensuremath{n}" %format M.o = "\ensuremath{o}" %format M.p = "\ensuremath{p}" %format M.q = "\ensuremath{q}" %format M.r = "\ensuremath{r}" %format M.s = "\ensuremath{s}" %format M.t = "\ensuremath{t}" %format M.u = "\ensuremath{u}" %format M.v = "\ensuremath{v}" %format M.w = "\ensuremath{w}" %format M.x = "\ensuremath{x}" %format M.y = "\ensuremath{y}" %format M.z = "\ensuremath{z}" %format M.A = "\ensuremath{A}" %format M.B = "\ensuremath{B}" %format M.C = "\ensuremath{C}" %format M.D = "\ensuremath{D}" %format M.E = "\ensuremath{E}" %format M.F = "\ensuremath{F}" %format M.G = "\ensuremath{G}" %format M.H = "\ensuremath{H}" %format M.I = "\ensuremath{I}" %format M.J = "\ensuremath{J}" %format M.K = "\ensuremath{K}" %format M.L = "\ensuremath{L}" %format M.M = "\ensuremath{M}" %format M.N = "\ensuremath{N}" %format M.O = "\ensuremath{O}" %format M.P = "\ensuremath{P}" %format M.Q = "\ensuremath{Q}" %format M.R = "\ensuremath{R}" %format M.S = "\ensuremath{S}" %format M.T = "\ensuremath{T}" %format M.U = "\ensuremath{U}" %format M.V = "\ensuremath{V}" %format M.W = "\ensuremath{W}" %format M.X = "\ensuremath{X}" %format M.Y = "\ensuremath{Y}" %format M.Z = "\ensuremath{Z}" %format M.alpha = "\ensuremath{\alpha}" %format M.beta = "\ensuremath{\beta}" %format M.gamma = "\ensuremath{\gamma}" %format M.delta = "\ensuremath{\delta}" %format M.epsilon = "\ensuremath{\epsilon}" %format M.zeta = "\ensuremath{\zeta}" %format M.eta = "\ensuremath{\eta}" %format M.theta = "\ensuremath{\theta}" %format M.iota = "\ensuremath{\iota}" %format M.kappa = "\ensuremath{\kappa}" %format M.lambda = "\ensuremath{\lambda}" %format M.mu = "\ensuremath{\mu}" %format M.nu = "\ensuremath{\nu}" %format M.xi = "\ensuremath{\xi}" %format M.pi = "\ensuremath{\pi}" %format M.rho = "\ensuremath{\rho}" %format M.sigma = "\ensuremath{\sigma}" %format M.tau = "\ensuremath{\tau}" %format M.upsilon = "\ensuremath{\upsilon}" %format M.phi = "\ensuremath{\phi}" %format M.chi = "\ensuremath{\chi}" %format M.psi = "\ensuremath{\psi}" %format M.omega = "\ensuremath{\omega}" %format M.Gamma = "\ensuremath{\Gamma}" %format M.Delta = "\ensuremath{\Delta}" %format M.Theta = "\ensuremath{\Theta}" %format M.Lambda = "\ensuremath{\Lambda}" %format M.Xi = "\ensuremath{\Xi}" %format M.Pi = "\ensuremath{\Pi}" %format M.Sigma = "\ensuremath{\Sigma}" %format M.Upsilon = "\ensuremath{\Upsilon}" %format M.Phi = "\ensuremath{\Phi}" %format M.Psi = "\ensuremath{\Psi}" %format M.Omega = "\ensuremath{\Omega}" %format M.forall = "\ensuremath{\forall}" %format M.exists = "\ensuremath{\exists}" %format M.not = "\ensuremath{\neg}" %format ==> = "\ensuremath{\Longrightarrow}" %format <== = "\ensuremath{\Longleftarrow}" %format /\ = "\ensuremath{\wedge}" %format \/ = "\ensuremath{\vee}" %format M.= = "\ensuremath{=}" %format M./= = "\ensuremath{\neq}" %format M.< = "\ensuremath{<}" %format M.<= = "\ensuremath{\leq}" %format M.>= = "\ensuremath{\geq}" %format M.> = "\ensuremath{>}" %endif %elif style == newcode %subst comment a = "-- " a %subst nested a = "{- " a " -}" %subst code a = a "'n" %subst newline = "'n" %subst dummy = %subst pragma a = "{-# " a " #-}" %subst tex a = %subst numeral a = a %subst keyword a = a %subst spaces a = a %subst special a = a %subst space = " " %subst conid a = a %subst varid a = a %subst consym a = a %subst varsym a = a %subst char a = "''" a "''" %subst string a = "'d" a "'d" %format # = "#" %format $ = "$" %format % = "%" %format & = "&" %format \ = "\" %elif style == math %subst phantom a = "\phantom{" a "\mbox{}}" %subst comment a = "\mbox{\qquad-{}- " a "}" %subst nested a = "\mbox{\enskip\{- " a " -\}\enskip}" %if array %subst code a = "\[\begin{array}{@{}lcl}'n\hspace{\lwidth}&\hspace{\cwidth}&\\[-10pt]'n" a "'n\end{array}\]" %subst column3 l c r = "{}" l " & " c " & {" r "}" %subst column1 a = "\multicolumn{3}{@{}l}{" a "}" %else %subst code a = "\begin{tabbing}'n\qquad\=\hspace{\lwidth}\=\hspace{\cwidth}\=\+\kill'n" a "'n\end{tabbing}" %subst column3 l c r = "$" l "$ \> \makebox[\cwidth]{$" c "$} \> ${" r "}$" %subst column1 a = "${" a "}$" %endif %subst newline = "\\'n" %subst blankline = "\\[1mm]'n" %let anyMath = True %elif style == poly %subst comment a = "\mbox{\onelinecomment " a "}" %subst nested a = "\mbox{\commentbegin " a " \commentend}" %if array %subst code a = "\['n\begin{parray}\SaveRestoreHook'n" a "\ColumnHook'n\end{parray}'n\]\resethooks'n" %else %subst code a = "\begingroup\par\noindent\advance\leftskip\mathindent\('n\begin{pboxed}\SaveRestoreHook'n" a "\ColumnHook'n\end{pboxed}'n\)\par\noindent\endgroup\resethooks'n" %endif %subst column c a = "\column{" c "}{" a "}'n" %subst fromto b e t = "\>[" b "]{}" t "{}\<[" e "]" %subst left = "@{}l@{}" %subst centered = "@{}c@{}" %subst dummycol = "@{}l@{}" %subst newline = "\\'n" %subst blankline = "\\[\blanklineskip]'n" %subst indent n = "\hsindent{" n "}" %let anyMath = True %endif %if anyMath %let autoSpacing = True %subst dummy = "\cdot " %subst inline a = "\ensuremath{" a "}" %subst hskip a = "\hskip" a "em\relax" %subst pragma a = "\mbox{\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %if latex209 %subst numeral a = "{\mathrm " a "}" %subst keyword a = "{\mathbf " a "}" %else %subst numeral a = "\mathrm{" a "}" %subst keyword a = "\mathbf{" a "}" %endif %subst spaces a = a %subst special a = a %subst space = "\;" %subst conid a = "\Conid{" a "}" %subst varid a = "\Varid{" a "}" %subst consym a = "\mathbin{" a "}" %subst varsym a = "\mathbin{" a "}" %subst char a = "\text{\tt ''" a "''}" %subst string a = "\text{\tt \char34 " a "\char34}" %format _ = "\anonymous " %format -> = "\to " %format <- = "\leftarrow " %format => = "\Rightarrow " %format \ = "\lambda " %format | = "\mid " %format { = "\{\mskip1.5mu " %format } = "\mskip1.5mu\}" %format [ = "[\mskip1.5mu " %format ] = "\mskip1.5mu]" %format = = "\mathrel{=}" %format .. = "\mathinner{\ldotp\ldotp}" %format ~ = "\mathord{\sim}" %format @ = "\mathord{@}" %format . = "\mathbin{\circ}" %format !! = "\mathbin{!!}" %format ^ = "\mathbin{\uparrow}" %format ^^ = "\mathbin{\uparrow\uparrow}" %format ** = "\mathbin{**}" %format / = "\mathbin{/}" %format `quot` = "\mathbin{\Varid{`quot`}}" %format `rem` = "\mathbin{\Varid{`rem`}}" %format `div` = "\mathbin{\Varid{`div`}}" %format `mod` = "\mathbin{\Varid{`mod`}}" %format :% = "\mathbin{:\%}" %format % = "\mathbin{\%}" %format : = "\mathbin{:}" %format ++ = "\plus " %format == = "\equiv " %% ODER: format == = "\mathrel{==}" %format /= = "\not\equiv " %% ODER: format /= = "\neq " %format <= = "\leq " %format >= = "\geq " %format `elem` = "\in " %format `notElem` = "\notin " %format && = "\mathrel{\wedge}" %format || = "\mathrel{\vee}" %format >> = "\sequ " %format >>= = "\bind " %format $ = "\mathbin{\$}" %format `seq` = "\mathbin{\Varid{`seq`}}" %format ! = "\mathbin{!}" %format // = "\mathbin{//}" %format undefined = "\bot " %format not = "\neg " %if meta %format M.a = "a" %format M.b = "b" %format M.c = "c" %format M.d = "d" %format M.e = "e" %format M.f = "f" %format M.g = "g" %format M.h = "h" %format M.i = "i" %format M.j = "j" %format M.k = "k" %format M.l = "l" %format M.m = "m" %format M.n = "n" %format M.o = "o" %format M.p = "p" %format M.q = "q" %format M.r = "r" %format M.s = "s" %format M.t = "t" %format M.u = "u" %format M.v = "v" %format M.w = "w" %format M.x = "x" %format M.y = "y" %format M.z = "z" %format M.A = "A" %format M.B = "B" %format M.C = "C" %format M.D = "D" %format M.E = "E" %format M.F = "F" %format M.G = "G" %format M.H = "H" %format M.I = "I" %format M.J = "J" %format M.K = "K" %format M.L = "L" %format M.M = "M" %format M.N = "N" %format M.O = "O" %format M.P = "P" %format M.Q = "Q" %format M.R = "R" %format M.S = "S" %format M.T = "T" %format M.U = "U" %format M.V = "V" %format M.W = "W" %format M.X = "X" %format M.Y = "Y" %format M.Z = "Z" %format M.alpha = "\alpha " %format M.beta = "\beta " %format M.gamma = "\gamma " %format M.delta = "\delta " %format M.epsilon = "\epsilon " %format M.zeta = "\zeta " %format M.eta = "\eta " %format M.theta = "\theta " %format M.iota = "\iota " %format M.kappa = "\kappa " %format M.lambda = "\lambda " %format M.mu = "\mu " %format M.nu = "\nu " %format M.xi = "\xi " %format M.pi = "\pi " %format M.rho = "\rho " %format M.sigma = "\sigma " %format M.tau = "\tau " %format M.upsilon = "\upsilon " %format M.phi = "\phi " %format M.chi = "\chi " %format M.psi = "\psi " %format M.omega = "\omega " %format M.Gamma = "\Gamma " %format M.Delta = "\Delta " %format M.Theta = "\Theta " %format M.Lambda = "\Lambda " %format M.Xi = "\Xi " %format M.Pi = "\Pi " %format M.Sigma = "\Sigma " %format M.Upsilon = "\Upsilon " %format M.Phi = "\Phi " %format M.Psi = "\Psi " %format M.Omega = "\Omega " %format M.forall = "\forall " %format M.exists = "\exists " %format M.not = "\neg " %format ==> = "\enskip\Longrightarrow\enskip " %format <== = "\enskip\Longleftarrow\enskip " %format /\ = "\enskip\mathrel{\wedge}\enskip " %format \/ = "\enskip\mathrel{\vee}\enskip " %format M.= = "=" %format M./= = "\neq " %format M.< = "<" %format M.<= = "\leq " %format M.>= = "\geq " %format M.> = ">" %endif %endif %if style /= newcode %subst code a = "\begin{colorcode}'n" a "\end{colorcode}\resethooks'n" %endif lhs2tex-1.19/doc/AGExample.lhs0000644000175000017500000000123412507035615016733 0ustar00andresandres00000000000000%include poly.fmt %format ^ = " " %format ^^ = "\;" %format ATTR = "\mathbf{ATTR}" %format SEM = "\mathbf{SEM}" %format lhs = "\mathbf{lhs}" %format . = "." %format * = "\times" %format (A(n)(f)) = @ n . f \begin{code} ATTR Expr Factor [ ^^ | ^^ | numvars : Int ] ATTR Expr Factor [ ^^ | ^^ | value : Int ] SEM Expr | Sum lhs . value = A left value + A right value . numvars = A left numvars + A right numvars SEM Factor | Prod lhs . value = A left value * A right value . numvars = A left numvars + A right numvars \end{code} lhs2tex-1.19/doc/GroupExample.lhs0000644000175000017500000000030012507035615017531 0ustar00andresandres00000000000000%include poly.fmt In the beginning: |one|.\par %format one = "\mathsf{1}" Before the group: |one|.\par %{ %format one = "\mathsf{one}" Inside the group: |one|.\par %} After the group: |one|. lhs2tex-1.19/doc/SaveRestoreNo.lhs0000644000175000017500000000053712507035615017674 0ustar00andresandres00000000000000%include poly.fmt \begingroup \begin{code} intersperse :: a -> [a] -> [a] intersperse _ [] = [] intersperse _ [x] = [x] \end{code} The only really interesting case is the one for lists containing at least two elements: \begin{code} intersperse sep (x:xs) = x : sep : intersperse sep xs \end{code} \endgroup lhs2tex-1.19/doc/stupid.fmt0000644000175000017500000002770712507035615016455 0ustar00andresandres00000000000000%subst verb a = "\text{\tt " a "}" %subst verbatim a = "\begin{tabbing}\tt'n" a "'n\end{tabbing}'n" %subst verbnl = "\\'n\tt " %if style == tt %subst inline a = "\text{\texfamily " a "}" %subst thinspace = "\Sp " %subst code a = "\begin{tabbing}\texfamily'n" a "'n\end{tabbing}'n" %subst comment a = "{\rmfamily-{}- " a "}" %subst nested a = "{\rmfamily\enskip\{- " a " -\}\enskip}" %subst pragma a = "{\rmfamily\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %subst spaces a = a %subst special a = a %subst space = "~" %subst newline = "\\'n\texfamily " %subst conid a = "{\itshape " a "}" %subst varid a = a %subst consym a = a %subst varsym a = a %subst numeral a = a %subst char a = "''" a "''" %subst string a = "\char34 " a "\char34 " %if underlineKeywords %subst keyword a = "\uline{" a "}" %else %subst keyword a = "{\bfseries " a "}" %endif %format \ = "\char''10" %format . = "\char''00" %if not spacePreserving %format alpha = "\char''02" %format beta = "\char''03" %format gamma = "\char''11" %format delta = "\char''12" %format pi = "\char''07" %format infty = "\char''16" %format intersect = "\char''22" %format union = "\char''23" %format forall = "\char''24" %format exists = "\char''25" %format not = "\char''05" %format && = "\char''04" %format || = "\char''37" %format <- = "\char''06" %format -> = "\char''31" %format == = "\char''36" %format /= = "\char''32" %format <= = "\char''34" %format >= = "\char''35" %endif %if meta %format M.a = "\ensuremath{a}" %format M.b = "\ensuremath{b}" %format M.c = "\ensuremath{c}" %format M.d = "\ensuremath{d}" %format M.e = "\ensuremath{e}" %format M.f = "\ensuremath{f}" %format M.g = "\ensuremath{g}" %format M.h = "\ensuremath{h}" %format M.i = "\ensuremath{i}" %format M.j = "\ensuremath{j}" %format M.k = "\ensuremath{k}" %format M.l = "\ensuremath{l}" %format M.m = "\ensuremath{m}" %format M.n = "\ensuremath{n}" %format M.o = "\ensuremath{o}" %format M.p = "\ensuremath{p}" %format M.q = "\ensuremath{q}" %format M.r = "\ensuremath{r}" %format M.s = "\ensuremath{s}" %format M.t = "\ensuremath{t}" %format M.u = "\ensuremath{u}" %format M.v = "\ensuremath{v}" %format M.w = "\ensuremath{w}" %format M.x = "\ensuremath{x}" %format M.y = "\ensuremath{y}" %format M.z = "\ensuremath{z}" %format M.A = "\ensuremath{A}" %format M.B = "\ensuremath{B}" %format M.C = "\ensuremath{C}" %format M.D = "\ensuremath{D}" %format M.E = "\ensuremath{E}" %format M.F = "\ensuremath{F}" %format M.G = "\ensuremath{G}" %format M.H = "\ensuremath{H}" %format M.I = "\ensuremath{I}" %format M.J = "\ensuremath{J}" %format M.K = "\ensuremath{K}" %format M.L = "\ensuremath{L}" %format M.M = "\ensuremath{M}" %format M.N = "\ensuremath{N}" %format M.O = "\ensuremath{O}" %format M.P = "\ensuremath{P}" %format M.Q = "\ensuremath{Q}" %format M.R = "\ensuremath{R}" %format M.S = "\ensuremath{S}" %format M.T = "\ensuremath{T}" %format M.U = "\ensuremath{U}" %format M.V = "\ensuremath{V}" %format M.W = "\ensuremath{W}" %format M.X = "\ensuremath{X}" %format M.Y = "\ensuremath{Y}" %format M.Z = "\ensuremath{Z}" %format M.alpha = "\ensuremath{\alpha}" %format M.beta = "\ensuremath{\beta}" %format M.gamma = "\ensuremath{\gamma}" %format M.delta = "\ensuremath{\delta}" %format M.epsilon = "\ensuremath{\epsilon}" %format M.zeta = "\ensuremath{\zeta}" %format M.eta = "\ensuremath{\eta}" %format M.theta = "\ensuremath{\theta}" %format M.iota = "\ensuremath{\iota}" %format M.kappa = "\ensuremath{\kappa}" %format M.lambda = "\ensuremath{\lambda}" %format M.mu = "\ensuremath{\mu}" %format M.nu = "\ensuremath{\nu}" %format M.xi = "\ensuremath{\xi}" %format M.pi = "\ensuremath{\pi}" %format M.rho = "\ensuremath{\rho}" %format M.sigma = "\ensuremath{\sigma}" %format M.tau = "\ensuremath{\tau}" %format M.upsilon = "\ensuremath{\upsilon}" %format M.phi = "\ensuremath{\phi}" %format M.chi = "\ensuremath{\chi}" %format M.psi = "\ensuremath{\psi}" %format M.omega = "\ensuremath{\omega}" %format M.Gamma = "\ensuremath{\Gamma}" %format M.Delta = "\ensuremath{\Delta}" %format M.Theta = "\ensuremath{\Theta}" %format M.Lambda = "\ensuremath{\Lambda}" %format M.Xi = "\ensuremath{\Xi}" %format M.Pi = "\ensuremath{\Pi}" %format M.Sigma = "\ensuremath{\Sigma}" %format M.Upsilon = "\ensuremath{\Upsilon}" %format M.Phi = "\ensuremath{\Phi}" %format M.Psi = "\ensuremath{\Psi}" %format M.Omega = "\ensuremath{\Omega}" %format M.forall = "\ensuremath{\forall}" %format M.exists = "\ensuremath{\exists}" %format M.not = "\ensuremath{\neg}" %format ==> = "\ensuremath{\Longrightarrow}" %format <== = "\ensuremath{\Longleftarrow}" %format /\ = "\ensuremath{\wedge}" %format \/ = "\ensuremath{\vee}" %format M.= = "\ensuremath{=}" %format M./= = "\ensuremath{\neq}" %format M.< = "\ensuremath{<}" %format M.<= = "\ensuremath{\leq}" %format M.>= = "\ensuremath{\geq}" %format M.> = "\ensuremath{>}" %endif %elif style == newcode %subst comment a = "-- " a %subst nested a = "{- " a " -}" %subst code a = a "'n" %subst newline = "'n" %subst dummy = %subst pragma a = "{-# " a " #-}" %subst tex a = %subst numeral a = a %subst keyword a = a %subst spaces a = a %subst special a = a %subst space = " " %subst conid a = a %subst varid a = a %subst consym a = a %subst varsym a = a %subst char a = "''" a "''" %subst string a = "'d" a "'d" %format # = "#" %format $ = "$" %format % = "%" %format & = "&" %elif style == math %subst phantom a = "\phantom{" a "\mbox{}}" %subst comment a = "\mbox{\qquad-{}- " a "}" %subst nested a = "\mbox{\enskip\{- " a " -\}\enskip}" %if array %subst code a = "\[\begin{array}{@{}lcl}'n\hspace{\lwidth}&\hspace{\cwidth}&\\[-10pt]'n" a "'n\end{array}\]" %subst column3 l c r = "{}" l " & " c " & {" r "}" %subst column1 a = "\multicolumn{3}{@{}l}{" a "}" %else %subst code a = "\begin{tabbing}'n\qquad\=\hspace{\lwidth}\=\hspace{\cwidth}\=\+\kill'n" a "'n\end{tabbing}" %subst column3 l c r = "$" l "$ \> \makebox[\cwidth]{$" c "$} \> ${" r "}$" %subst column1 a = "${" a "}$" %endif %subst newline = "\\'n" %subst blankline = "\\[1mm]'n" %let anyMath = True %elif style == poly %subst comment a = "\mbox{\onelinecomment " a "}" %subst nested a = "\mbox{\commentbegin " a " \commentend}" %if array %subst code a = "\['n\begin{parray}\SaveRestoreHook'n" a "\ColumnHook'n\end{parray}'n\]\resethooks'n" %else %subst code a = "\begingroup\par\noindent\advance\leftskip\mathindent\('n\begin{pboxed}\SaveRestoreHook'n" a "\ColumnHook'n\end{pboxed}'n\)\par\noindent\endgroup\resethooks'n" %endif %subst column c a = "\column{" c "}{" a "}'n" %subst fromto b e t = "\fromto{" b "}{" e "}{{}" t "{}}'n" %subst left = "@{}l@{}" %subst centered = "@{}c@{}" %subst dummycol = "@{}l@{}" %subst newline = "\nextline'n" %subst blankline = "\nextline[\blanklineskip]'n" %subst indent n = "\hsindent{" n "}" %let anyMath = True %endif %if anyMath %let autoSpacing = True %subst dummy = "\cdot " %subst inline a = "\ensuremath{" a "}" %subst hskip a = "\hskip" a "em\relax" %subst pragma a = "\mbox{\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %if latex209 %subst numeral a = "{\mathrm " a "}" %subst keyword a = "{\mathbf " a "}" %else %subst numeral a = "\mathrm{" a "}" %subst keyword a = "\mathbf{" a "}" %endif %subst spaces a = a %subst special a = a %subst space = "\;" %subst conid a = "\Conid{" a "}" %subst varid a = "\Varid{" a "}" %subst consym a = "\mathbin{" a "}" %subst varsym a = "\mathbin{" a "}" %subst char a = "\text{\tt ''" a "''}" %subst string a = "\text{\tt \char34 " a "\char34}" %format _ = "\anonymous " %format -> = "\to " %format <- = "\leftarrow " %format => = "\Rightarrow " %format \ = "\lambda " %format | = "\mid " %format { = "\{\mskip1.5mu " %format } = "\mskip1.5mu\}" %format [ = "[\mskip1.5mu " %format ] = "\mskip1.5mu]" %format = = "\mathrel{=}" %format .. = "\mathinner{\ldotp\ldotp}" %format ~ = "\mathord{\sim}" %format @ = "\mathord{@}" %format . = "\mathbin{\circ}" %format !! = "\mathbin{!!}" %format ^ = "\mathbin{\uparrow}" %format ^^ = "\mathbin{\uparrow\uparrow}" %format ** = "\mathbin{**}" %format / = "\mathbin{/}" %format `quot` = "\mathbin{\Varid{`quot`}}" %format `rem` = "\mathbin{\Varid{`rem`}}" %format `div` = "\mathbin{\Varid{`div`}}" %format `mod` = "\mathbin{\Varid{`mod`}}" %format :% = "\mathbin{:\%}" %format % = "\mathbin{\%}" %format : = "\mathbin{:}" %format ++ = "\plus " %format == = "\equiv " %% ODER: format == = "\mathrel{==}" %format /= = "\not\equiv " %% ODER: format /= = "\neq " %format <= = "\leq " %format >= = "\geq " %format `elem` = "\in " %format `notElem` = "\notin " %format && = "\mathrel{\wedge}" %format || = "\mathrel{\vee}" %format >> = "\sequ " %format >>= = "\bind " %format $ = "\mathbin{\$}" %format `seq` = "\mathbin{\Varid{`seq`}}" %format ! = "\mathbin{!}" %format // = "\mathbin{//}" %format undefined = "\bot " %format not = "\neg " %if meta %format M.a = "a" %format M.b = "b" %format M.c = "c" %format M.d = "d" %format M.e = "e" %format M.f = "f" %format M.g = "g" %format M.h = "h" %format M.i = "i" %format M.j = "j" %format M.k = "k" %format M.l = "l" %format M.m = "m" %format M.n = "n" %format M.o = "o" %format M.p = "p" %format M.q = "q" %format M.r = "r" %format M.s = "s" %format M.t = "t" %format M.u = "u" %format M.v = "v" %format M.w = "w" %format M.x = "x" %format M.y = "y" %format M.z = "z" %format M.A = "A" %format M.B = "B" %format M.C = "C" %format M.D = "D" %format M.E = "E" %format M.F = "F" %format M.G = "G" %format M.H = "H" %format M.I = "I" %format M.J = "J" %format M.K = "K" %format M.L = "L" %format M.M = "M" %format M.N = "N" %format M.O = "O" %format M.P = "P" %format M.Q = "Q" %format M.R = "R" %format M.S = "S" %format M.T = "T" %format M.U = "U" %format M.V = "V" %format M.W = "W" %format M.X = "X" %format M.Y = "Y" %format M.Z = "Z" %format M.alpha = "\alpha " %format M.beta = "\beta " %format M.gamma = "\gamma " %format M.delta = "\delta " %format M.epsilon = "\epsilon " %format M.zeta = "\zeta " %format M.eta = "\eta " %format M.theta = "\theta " %format M.iota = "\iota " %format M.kappa = "\kappa " %format M.lambda = "\lambda " %format M.mu = "\mu " %format M.nu = "\nu " %format M.xi = "\xi " %format M.pi = "\pi " %format M.rho = "\rho " %format M.sigma = "\sigma " %format M.tau = "\tau " %format M.upsilon = "\upsilon " %format M.phi = "\phi " %format M.chi = "\chi " %format M.psi = "\psi " %format M.omega = "\omega " %format M.Gamma = "\Gamma " %format M.Delta = "\Delta " %format M.Theta = "\Theta " %format M.Lambda = "\Lambda " %format M.Xi = "\Xi " %format M.Pi = "\Pi " %format M.Sigma = "\Sigma " %format M.Upsilon = "\Upsilon " %format M.Phi = "\Phi " %format M.Psi = "\Psi " %format M.Omega = "\Omega " %format M.forall = "\forall " %format M.exists = "\exists " %format M.not = "\neg " %format ==> = "\enskip\Longrightarrow\enskip " %format <== = "\enskip\Longleftarrow\enskip " %format /\ = "\enskip\mathrel{\wedge}\enskip " %format \/ = "\enskip\mathrel{\vee}\enskip " %format M.= = "=" %format M./= = "\neq " %format M.< = "<" %format M.<= = "\leq " %format M.>= = "\geq " %format M.> = ">" %endif %endif lhs2tex-1.19/doc/Indent3In.lhs0000644000175000017500000000027512507035615016727 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt \makebox[0pt]{\phantom{X}}} >%format foo = verylongfoo >\begin{code} >test 1 >foo bar > 2 >\end{code} \endgroup lhs2tex-1.19/doc/InteractiveHugs.lhs.in0000644000175000017500000000065112507035615020643 0ustar00andresandres00000000000000%include poly.fmt %if False > module InteractiveHugs where %endif %format . = "." %format forall a = "\forall" a %options hugs -98 > fix :: forall a. (a -> a) -> a > fix f = f (fix f) This function is of type %if "@HUGS@" /= "" \eval{:t fix}, %else \textbf{?hugs not found?}, %endif and |take 10 (fix ('x':))| evaluates to %if "@HUGS@" /= "" \eval{take 10 (fix ('x':))}. %else \textbf{?hugs not found?}. %endif lhs2tex-1.19/doc/ParensExample2In.lhs0000644000175000017500000000042512507035615020246 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format eval a = "\llbracket " a "\rrbracket " >\begin{code} >size (eval (2 + 2)) >\end{code} >%format (eval (a)) = "\llbracket " a "\rrbracket " >\begin{code} >size (eval (2 + 2)) >\end{code} \endgroup lhs2tex-1.19/doc/RepAlgIn.lhs0000644000175000017500000000127212507035615016573 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" %format \ = "\char''134" %format let = "let" %format in = "in" %format -> = "->" %format != = "{\origcolor{hcolor}" = "}" %format llt = "{\origcolor{hcolor}" lt "}" \begingroup \let\origtt=\texfamily \let\small\footnotesize \def\texfamily#1{\origtt} >> rep_alg = (\ _ -> \m -> Leaf m >> ,\ lfun rfun -> \m -> let lt != lfun m >> rt != rfun m >> in Bin llt rt >> ) >> replace_min' t = (cata_Tree rep_alg t) (cata_Tree min_alg t) \endgroup lhs2tex-1.19/doc/FormatArrow2.lhs0000644000175000017500000000016012507035615017452 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format ~>* = ~> "^{" * "}" \endgroup lhs2tex-1.19/doc/SaveRestoreIn.lhs0000644000175000017500000000066012507035615017663 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >\savecolumns >\begin{code} >intersperse :: a -> [a] -> [a] >intersperse _ [] = [] >intersperse _ [x] = [x] >\end{code} >The only really interesting case is the one for lists >containing at least two elements: >\restorecolumns >\begin{code} >intersperse sep (x:xs) = x : sep : intersperse sep xs >\end{code} \endgroup lhs2tex-1.19/doc/HelloWorldSpecInput.lhs0000644000175000017500000000024212507035615021034 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >\begin{spec} >main :: IO () >main = putStrLn "Hello, world!" >\end{spec} \endgroup lhs2tex-1.19/doc/ConfigureCall.lhs0000644000175000017500000000022112507035615017640 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} \begin{code} $ ./configure --prefix=/my/local/programs \end{code} \endgroup lhs2tex-1.19/doc/InstallationInstructions.lhs0000644000175000017500000000051712507035615022221 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" \begingroup \let\origtt=\texfamily \def\texfamily{\origtt\makebox[0pt]{\phantom{X}}} %format ProgramVersion = "\ProgramVersion " \begin{code} $ cd /somewhere/lhs2TeX-ProgramVersion $ ./configure $ make $ make install \end{code} \endgroup lhs2tex-1.19/doc/FormatArrow.lhs0000644000175000017500000000015512507035615017374 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format ~> = "\leadsto " \endgroup lhs2tex-1.19/doc/Guide2.dontbuild0000644000175000017500000000000012507035615017433 0ustar00andresandres00000000000000lhs2tex-1.19/doc/Card.lhs0000644000175000017500000000030712507035615016001 0ustar00andresandres00000000000000%include poly.fmt %format abs (a) = "\mathopen{|}" a "\mathclose{|}" %format ~> = "\leadsto" The |abs| function computes the absolute value of an integer: \begin{code} abs(-2) ~> 2 \end{code} lhs2tex-1.19/doc/InteractivePre.lhs.in0000644000175000017500000000077312507035615020470 0ustar00andresandres00000000000000%include poly.fmt %if style == newcode > module InteractivePre where %endif %format SPL(x) = $ ( x ) %if style == newcode %format QU(x) = [ | x | ] %format ^^ = " " %else %format QU(x) = "\llbracket " x "\rrbracket " %format ^^ = "\; " %endif %options ghci -fth -pgmL "@LHS2TEX@" -optL-Pdoc@SEP@ -optL--pre This is a rather stupid way of computing |42| using Template Haskell: > answer = SPL(foldr1 (\x y -> QU(SPL(x) + SPL(y))) (replicate 21 ^^ QU(2))) The answer is indeed \eval{answer}. lhs2tex-1.19/doc/Indent2In.lhs0000644000175000017500000000044512507035615016725 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt \makebox[0pt]{\phantom{X}}} \begin{code} unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) \end{code} \endgroup lhs2tex-1.19/doc/Variable.lhs0000644000175000017500000000010512507035615016651 0ustar00andresandres00000000000000%include poly.fmt %format test = style \begin{code} test \end{code} lhs2tex-1.19/doc/Indent1.lhs0000644000175000017500000000032012507035615016425 0ustar00andresandres00000000000000%include poly.fmt \begin{code} unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) \end{code} lhs2tex-1.19/doc/Implicit.lhs0000644000175000017500000000036412507035615016705 0ustar00andresandres00000000000000%include poly.fmt %format omega = "\omega" |[omega, omega13, omega', omega13']|\par %format omega13 |[omega, omega13, omega', omega13']|\par %format omega' |[omega, omega13, omega', omega13']|\par %format omega13' |[omega, omega13, omega13']| lhs2tex-1.19/doc/polytt.fmt0000644000175000017500000002710112507035615016464 0ustar00andresandres00000000000000%subst verb a = "\text{\tt " a "}" %subst verbatim a = "\begin{tabbing}\tt'n" a "'n\end{tabbing}'n" %subst verbnl = "\\'n\tt " %if style == tt %subst inline a = "\text{\texfamily " a "}" %subst thinspace = "\Sp " %subst code a = "\begin{tabbing}\texfamily'n" a "'n\end{tabbing}'n" %subst comment a = "{\rmfamily-{}- " a "}" %subst nested a = "{\rmfamily\enskip\{- " a " -\}\enskip}" %subst pragma a = "{\rmfamily\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %subst spaces a = a %subst special a = a %subst space = "~" %subst newline = "\\'n\texfamily " %subst conid a = "{\itshape " a "}" %subst varid a = a %subst consym a = a %subst varsym a = a %subst numeral a = a %subst char a = "''" a "''" %subst string a = "\char34 " a "\char34 " %if underlineKeywords %subst keyword a = "\uline{" a "}" %else %subst keyword a = "{\bfseries " a "}" %endif %format \ = "\char''10" %format . = "\char''00" %if not spacePreserving %format alpha = "\char''02" %format beta = "\char''03" %format gamma = "\char''11" %format delta = "\char''12" %format pi = "\char''07" %format infty = "\char''16" %format intersect = "\char''22" %format union = "\char''23" %format forall = "\char''24" %format exists = "\char''25" %format not = "\char''05" %format && = "\char''04" %format || = "\char''37" %format <- = "\char''06" %format -> = "\char''31" %format == = "\char''36" %format /= = "\char''32" %format <= = "\char''34" %format >= = "\char''35" %endif %if meta %format M.a = "\ensuremath{a}" %format M.b = "\ensuremath{b}" %format M.c = "\ensuremath{c}" %format M.d = "\ensuremath{d}" %format M.e = "\ensuremath{e}" %format M.f = "\ensuremath{f}" %format M.g = "\ensuremath{g}" %format M.h = "\ensuremath{h}" %format M.i = "\ensuremath{i}" %format M.j = "\ensuremath{j}" %format M.k = "\ensuremath{k}" %format M.l = "\ensuremath{l}" %format M.m = "\ensuremath{m}" %format M.n = "\ensuremath{n}" %format M.o = "\ensuremath{o}" %format M.p = "\ensuremath{p}" %format M.q = "\ensuremath{q}" %format M.r = "\ensuremath{r}" %format M.s = "\ensuremath{s}" %format M.t = "\ensuremath{t}" %format M.u = "\ensuremath{u}" %format M.v = "\ensuremath{v}" %format M.w = "\ensuremath{w}" %format M.x = "\ensuremath{x}" %format M.y = "\ensuremath{y}" %format M.z = "\ensuremath{z}" %format M.A = "\ensuremath{A}" %format M.B = "\ensuremath{B}" %format M.C = "\ensuremath{C}" %format M.D = "\ensuremath{D}" %format M.E = "\ensuremath{E}" %format M.F = "\ensuremath{F}" %format M.G = "\ensuremath{G}" %format M.H = "\ensuremath{H}" %format M.I = "\ensuremath{I}" %format M.J = "\ensuremath{J}" %format M.K = "\ensuremath{K}" %format M.L = "\ensuremath{L}" %format M.M = "\ensuremath{M}" %format M.N = "\ensuremath{N}" %format M.O = "\ensuremath{O}" %format M.P = "\ensuremath{P}" %format M.Q = "\ensuremath{Q}" %format M.R = "\ensuremath{R}" %format M.S = "\ensuremath{S}" %format M.T = "\ensuremath{T}" %format M.U = "\ensuremath{U}" %format M.V = "\ensuremath{V}" %format M.W = "\ensuremath{W}" %format M.X = "\ensuremath{X}" %format M.Y = "\ensuremath{Y}" %format M.Z = "\ensuremath{Z}" %format M.alpha = "\ensuremath{\alpha}" %format M.beta = "\ensuremath{\beta}" %format M.gamma = "\ensuremath{\gamma}" %format M.delta = "\ensuremath{\delta}" %format M.epsilon = "\ensuremath{\epsilon}" %format M.zeta = "\ensuremath{\zeta}" %format M.eta = "\ensuremath{\eta}" %format M.theta = "\ensuremath{\theta}" %format M.iota = "\ensuremath{\iota}" %format M.kappa = "\ensuremath{\kappa}" %format M.lambda = "\ensuremath{\lambda}" %format M.mu = "\ensuremath{\mu}" %format M.nu = "\ensuremath{\nu}" %format M.xi = "\ensuremath{\xi}" %format M.pi = "\ensuremath{\pi}" %format M.rho = "\ensuremath{\rho}" %format M.sigma = "\ensuremath{\sigma}" %format M.tau = "\ensuremath{\tau}" %format M.upsilon = "\ensuremath{\upsilon}" %format M.phi = "\ensuremath{\phi}" %format M.chi = "\ensuremath{\chi}" %format M.psi = "\ensuremath{\psi}" %format M.omega = "\ensuremath{\omega}" %format M.Gamma = "\ensuremath{\Gamma}" %format M.Delta = "\ensuremath{\Delta}" %format M.Theta = "\ensuremath{\Theta}" %format M.Lambda = "\ensuremath{\Lambda}" %format M.Xi = "\ensuremath{\Xi}" %format M.Pi = "\ensuremath{\Pi}" %format M.Sigma = "\ensuremath{\Sigma}" %format M.Upsilon = "\ensuremath{\Upsilon}" %format M.Phi = "\ensuremath{\Phi}" %format M.Psi = "\ensuremath{\Psi}" %format M.Omega = "\ensuremath{\Omega}" %format M.forall = "\ensuremath{\forall}" %format M.exists = "\ensuremath{\exists}" %format M.not = "\ensuremath{\neg}" %format ==> = "\ensuremath{\Longrightarrow}" %format <== = "\ensuremath{\Longleftarrow}" %format /\ = "\ensuremath{\wedge}" %format \/ = "\ensuremath{\vee}" %format M.= = "\ensuremath{=}" %format M./= = "\ensuremath{\neq}" %format M.< = "\ensuremath{<}" %format M.<= = "\ensuremath{\leq}" %format M.>= = "\ensuremath{\geq}" %format M.> = "\ensuremath{>}" %endif %elif style == newcode %subst comment a = "-- " a %subst nested a = "{- " a " -}" %subst code a = a "'n" %subst newline = "'n" %subst dummy = %subst pragma a = "{-# " a " #-}" %subst tex a = %subst numeral a = a %subst keyword a = a %subst spaces a = a %subst special a = a %subst space = " " %subst conid a = a %subst varid a = a %subst consym a = a %subst varsym a = a %subst char a = "''" a "''" %subst string a = "'d" a "'d" %format # = "#" %format $ = "$" %format % = "%" %format & = "&" %elif style == math %subst phantom a = "\phantom{" a "\mbox{}}" %subst comment a = "\mbox{\qquad-{}- " a "}" %subst nested a = "\mbox{\enskip\{- " a " -\}\enskip}" %if array %subst code a = "\[\begin{array}{@{}lcl}'n\hspace{\lwidth}&\hspace{\cwidth}&\\[-10pt]'n" a "'n\end{array}\]" %subst column3 l c r = "{}" l " & " c " & {" r "}" %subst column1 a = "\multicolumn{3}{@{}l}{" a "}" %else %subst code a = "\begin{tabbing}'n\qquad\=\hspace{\lwidth}\=\hspace{\cwidth}\=\+\kill'n" a "'n\end{tabbing}" %subst column3 l c r = "$" l "$ \> \makebox[\cwidth]{$" c "$} \> ${" r "}$" %subst column1 a = "${" a "}$" %endif %subst newline = "\\'n" %subst blankline = "\\[1mm]'n" %let anyMath = True %elif style == poly %subst comment a = "\mbox{\onelinecomment " a "}" %subst nested a = "\mbox{\commentbegin " a " \commentend}" %if array %subst code a = "\['n\begin{parray}\SaveRestoreHook'n" a "\ColumnHook'n\end{parray}'n\]\resethooks'n" %else %subst code a = "\begingroup\par\noindent\advance\leftskip\mathindent\('n\begin{pboxed}\SaveRestoreHook'n" a "\ColumnHook'n\end{pboxed}'n\)\par\noindent\endgroup\resethooks'n" %endif %subst column c a = "\column{" c "}{" a "}'n" %subst fromto b e t = "\fromto{" b "}{" e "}{{}" t "{}}'n" %subst left = "@{}l@{}" %subst centered = "@{}c@{}" %subst dummycol = "@{}l@{}" %subst newline = "\nextline'n" %subst blankline = "\nextline[\blanklineskip]'n" %subst indent n = "\hsindent{" n "}" %let anyMath = True %endif %if anyMath %let autoSpacing = True %subst dummy = %subst inline a = "\ensuremath{" a "}" %subst hskip a = "\hskip" a "em\relax" %subst pragma a = "\mbox{\enskip\{-\#" a " \#-\}\enskip}" %subst tex a = a %if latex209 %subst numeral a = a %subst keyword a = "{\mathbf " a "}" %else %subst numeral a = a %subst keyword a = "\text{\texfamily\itshape{" a "}}" %endif %subst spaces a = a %subst special a = a %subst space = "\mskip\thickmuskip" %subst conid a = "\text{\texfamily " a "}" %subst varid a = "\text{\texfamily " a "}" %subst consym a = "\text{\texfamily " a "}" %subst varsym a = "\text{\texfamily " a "}" %subst char a = "\text{\texfamily ''" a "''}" %subst string a = "\text{\texfamily \char34 " a "\char34}" %format [ = "\mathopen{\text{\texfamily [}}" %format ] = "\mathclose{\text{\texfamily ]}}" %format ( = "\mathopen{\text{\texfamily (}}" %format ) = "\mathclose{\text{\texfamily )}}" %format , = "\mathpunct{\text{\texfamily ,}}" %format :: = "\mathrel{\text{\texfamily ::}}" %format : = "\mathop{\text{\texfamily :}}" %format \ = "\text{\texfamily\char''10}" %format = = "\mathrel{\text{\texfamily =}}" %format | = "\mathrel{\text{\texfamily |}}" %format alpha = "\char''02" %format beta = "\char''03" %format gamma = "\char''11" %format delta = "\char''12" %format pi = "\char''07" %format infty = "\char''16" %format intersect = "\char''22" %format union = "\char''23" %format forall = "\char''24" %format exists = "\char''25" %format not = "\char''05" %format && = "\mathbin{\text{\texfamily\char''04}}" %format || = "\mathbin{\text{\texfamily\char''37}}" %format <- = "\mathbin{\text{\texfamily\char''06}}" %format -> = "\mathbin{\text{\texfamily\char''31}}" %format == = "\char''36" %format /= = "\char''32" %format <= = "\char''34" %format >= = "\char''35" %if meta %format M.a = "a" %format M.b = "b" %format M.c = "c" %format M.d = "d" %format M.e = "e" %format M.f = "f" %format M.g = "g" %format M.h = "h" %format M.i = "i" %format M.j = "j" %format M.k = "k" %format M.l = "l" %format M.m = "m" %format M.n = "n" %format M.o = "o" %format M.p = "p" %format M.q = "q" %format M.r = "r" %format M.s = "s" %format M.t = "t" %format M.u = "u" %format M.v = "v" %format M.w = "w" %format M.x = "x" %format M.y = "y" %format M.z = "z" %format M.A = "A" %format M.B = "B" %format M.C = "C" %format M.D = "D" %format M.E = "E" %format M.F = "F" %format M.G = "G" %format M.H = "H" %format M.I = "I" %format M.J = "J" %format M.K = "K" %format M.L = "L" %format M.M = "M" %format M.N = "N" %format M.O = "O" %format M.P = "P" %format M.Q = "Q" %format M.R = "R" %format M.S = "S" %format M.T = "T" %format M.U = "U" %format M.V = "V" %format M.W = "W" %format M.X = "X" %format M.Y = "Y" %format M.Z = "Z" %format M.alpha = "\alpha " %format M.beta = "\beta " %format M.gamma = "\gamma " %format M.delta = "\delta " %format M.epsilon = "\epsilon " %format M.zeta = "\zeta " %format M.eta = "\eta " %format M.theta = "\theta " %format M.iota = "\iota " %format M.kappa = "\kappa " %format M.lambda = "\lambda " %format M.mu = "\mu " %format M.nu = "\nu " %format M.xi = "\xi " %format M.pi = "\pi " %format M.rho = "\rho " %format M.sigma = "\sigma " %format M.tau = "\tau " %format M.upsilon = "\upsilon " %format M.phi = "\phi " %format M.chi = "\chi " %format M.psi = "\psi " %format M.omega = "\omega " %format M.Gamma = "\Gamma " %format M.Delta = "\Delta " %format M.Theta = "\Theta " %format M.Lambda = "\Lambda " %format M.Xi = "\Xi " %format M.Pi = "\Pi " %format M.Sigma = "\Sigma " %format M.Upsilon = "\Upsilon " %format M.Phi = "\Phi " %format M.Psi = "\Psi " %format M.Omega = "\Omega " %format M.forall = "\forall " %format M.exists = "\exists " %format M.not = "\neg " %format ==> = "\enskip\Longrightarrow\enskip " %format <== = "\enskip\Longleftarrow\enskip " %format /\ = "\enskip\mathrel{\wedge}\enskip " %format \/ = "\enskip\mathrel{\vee}\enskip " %format M.= = "=" %format M./= = "\neq " %format M.< = "<" %format M.<= = "\leq " %format M.>= = "\geq " %format M.> = ">" %endif %endif lhs2tex-1.19/doc/CalcExampleIn.lhs0000644000175000017500000000107312507035615017576 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt %if stc \let\small\scriptsize %endif \def\tt#1#2{\origtt\makebox[0pt]{\phantom{X}}} >\def\commentbegin{\quad\{\ } >\def\commentend{\}} >\begin{spec} > map (+1) [1,2,3] > >== {- desugaring of |(:)| -} > > map (+1) (1 : [2,3]) > >== {- definition of |map| -} > > (+1) 1 : map (+1) [2,3] > >== {- performing the addition on the head -} > > 2 : map (+1) [2,3] > >== {- recursive application of |map| -} > > 2 : [3,4] > >== {- list syntactic sugar -} > > [2,3,4] >\end{spec} \endgroup lhs2tex-1.19/doc/SearchPath.lhs0000644000175000017500000000015212507035615017150 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} %include RawSearchPath.lhs \endgroup lhs2tex-1.19/doc/GHExampleIn.lhs0000644000175000017500000000253512507035615017236 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \let\small\scriptsize \def\tt#1#2{\origtt\makebox[0pt]{\phantom{X}}} >%if style == newcode >%format ^ >%format ^^ = " " >%format ti(a) = "{|" a "|}" >%format ki(a) = "{[" a "]}" >%else >%format ^ = " " >%format ^^ = "\;" >%format ti(a) = "\lty " a "\rty " >%format ki(a) = "\lki " a "\rki " >\newcommand{\lty}{\mathopen{\{\mskip-3.4mu||}} >\newcommand{\rty}{\mathclose{||\mskip-3.4mu\}}} >\newcommand{\lki}{\mathopen{\{\mskip-3.5mu[}} >\newcommand{\rki}{\mathclose{]\mskip-3.5mu\}}} >%format t1 >%format t2 >%format a1 >%format a2 >%format r_ = "\rho " >%format s_ = "\sigma " >%format k_ = "\kappa " >%format forall a = "\forall " a >%format . = "." >%format mapa = map "_{" a "}" >%format mapb = map "_{" b "}" >%format :*: = "\times " >%endif >\begin{code} >type Map^ki(*) t1 t2 = t1 -> t2 >type Map^ki(r_ -> s_) t1 t2 = forall a1 a2. Map^ki(r_) a1 a2 > -> Map^ki(s_) (t1 a1) (t2 a2) > >map^ti(t :: k_) :: Map^ki(k_) t t >map^ti(Unit) Unit = Unit >map^ti(Int) i = i >map^ti(Sum) mapa mapb (Inl a) = Inl (mapa a) >map^ti(Sum) mapa mapb (Inr b) = Inr (mapb b) >map^ti(Prod) mapa mapb (a :*: b) = mapa a :*: mapb b >\end{code} \endgroup lhs2tex-1.19/doc/ParensExample.lhs0000644000175000017500000000042612507035615017676 0ustar00andresandres00000000000000%include poly.fmt \begingroup \setlength{\abovedisplayskip}{1pt} \setlength{\belowdisplayskip}{1pt} %format ^^ = "\;" %format (ptest (a) b (c)) = ptest ^^ a ^^ b ^^ c \begin{code} ptest a b c (ptest (a) (b) (c)) ((ptest((a)) ((b)) ((c)))) \end{code} \endgroup lhs2tex-1.19/doc/HackageInstallation.lhs0000644000175000017500000000037712507035615021044 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" \begingroup \let\origtt=\texfamily \def\texfamily{\origtt\makebox[0pt]{\phantom{X}}} \begin{code} $ cabal update $ cabal install lhs2tex \end{code} \endgroup lhs2tex-1.19/doc/HelloWorldDialogue.lhs0000644000175000017500000000025412507035615020656 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} \begin{code} $ lhs2TeX -o HelloWorld.tex HelloWorld.lhs $ pdflatex HelloWorld.tex \end{code} \endgroup lhs2tex-1.19/doc/HsIndent.lhs0000644000175000017500000000016512507035615016646 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >\newcommand{\hsindent}[1]{\quad} \endgroup lhs2tex-1.19/doc/CompleteDirectives.lhs0000644000175000017500000000202012507035615020714 0ustar00andresandres00000000000000%include tex.fmt \begingroup \invisiblecomments \def\bropen{@{@} \def\brclos{@}@} %{ %format bropen = "\bropen" %format brclose = "\brclos" \begin{code} dir(include) -- include a file dir(format) -- formatting directive for an identifer/operator dir(bropen) -- begin of an @lhs2TeX@ group dir(brclose) -- end of an @lhs2TeX@ group dir(^let^) -- set a toggle dir(^if^) -- test a condition dir(^else^) -- second part of conditional dir(elif) -- @else@ combined with @if@ dir(endif) -- end of a conditional dir(latency) -- tweak alignment in \textbf{poly} style dir(separation) ^^^ -- tweak alignment in \textbf{poly} style dir(align) -- set alignment column in \textbf{math} style dir(options) -- set options for call of external program dir(subst) -- primitive formatting directive dir(file) -- set filename \end{code} %} \endgroup lhs2tex-1.19/doc/CabalInstallation.lhs0000644000175000017500000000056012507035615020515 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" \begingroup \let\origtt=\texfamily \def\texfamily{\origtt\makebox[0pt]{\phantom{X}}} %format ProgramVersion = "\ProgramVersion " \begin{code} $ cd /somewhere/lhs2TeX-ProgramVersion $ runghc Setup configure $ runghc Setup build $ runghc Setup install \end{code} \endgroup lhs2tex-1.19/doc/FormatSyntax.lhs0000644000175000017500000000135612507035615017574 0ustar00andresandres00000000000000%include tex.fmt %format symorname = sym_or_name \invisiblecomments \begin{code} dir(format) ^^ ent(token) = many(ent(fmttoken)) ^^^ -- (format single tokens) dir(format) ^^ ent(lhs) = many(ent(fmttoken)) -- (parametrized formatting) dir(format) ^^ ent(name) -- (implicit formatting) ent(lhs) ::= ent(name) ^^ many(ent(arg)) | (ent(name)) ^^ many(ent(arg)) ent(name) ::= ent(varname) | ent(conname) ent(arg) ::= ent(varname) | (ent(varname)) ent(fmttoken) ::= string(ent(text)) | ent(token) \end{code} %old stuff: %ent(lhs) ::= ent(symorname) ^^ many(ent(arg)) | (ent(symorname) ^^ many(ent(arg))) %ent(symorname) ::= ent(name) | back(ent(name)) | (ent(operator)) lhs2tex-1.19/doc/HelloWorldCodeInput.lhs0000644000175000017500000000024212507035615021014 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >\begin{code} >main :: IO () >main = putStrLn "Hello, world!" >\end{code} \endgroup lhs2tex-1.19/doc/Indent2a.lhs0000644000175000017500000000073712507035615016603 0ustar00andresandres00000000000000%include poly.fmt \begin{code} scanr1 :: (a -> a -> a) -> [a] -> [a] scanr1 f xxs = case xxs of x:xs -> case xs of [] -> [x] _ -> let qs = scanr1 f xs in case qs of q:_ -> f x q : qs \end{code} lhs2tex-1.19/doc/InteractiveGhciIn.lhs0000644000175000017500000000064612507035615020475 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} %if False module InteractiveGhci where %endif %format . = "." %format forall a = "\forall" a \begin{code} %options ghci -XRankNTypes -fprint-explicit-foralls > fix :: forall a. (a -> a) -> a > fix f = f (fix f) This function is of type \eval{:t fix}, and |take 10 (fix ('x':))| evaluates to \eval{take 10 (fix ('x':))}. \end{code} \endgroup lhs2tex-1.19/doc/FormatIdentifierExamples.lhs0000644000175000017500000000025612507035615022065 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1#2{\origtt} >%format ++ = "\plus " >%format undefined = "\bot " >%format not = "\neg " \endgroup lhs2tex-1.19/doc/InlineTeXSyntax.lhs0000644000175000017500000000043412507035615020177 0ustar00andresandres00000000000000%include tex.fmt \newcommand*{\InlineTeX}{@{-"@}% \newcommand*{\EndInlineTeX}{@"-}@}% %format inline(a) = "\InlineTeX " a "\EndInlineTeX " \begin{code} inline(ent(tex)) \end{code} If this construct appears in a code block, then |ent(tex)| is inserted literally into the output file. lhs2tex-1.19/doc/GroupExampleIn.lhs0000644000175000017500000000042412507035615020027 0ustar00andresandres00000000000000%include verbatim.fmt \begingroup \let\origtt=\tt \def\tt#1{\origtt} \begin{code} In the beginning: |one|.\par %format one = "\mathsf{1}" Before the group: |one|.\par %{ %format one = "\mathsf{one}" Inside the group: |one|.\par %} After the group: |one|. \end{code} \endgroup lhs2tex-1.19/doc/Indent2.lhs0000644000175000017500000000031612507035615016433 0ustar00andresandres00000000000000%include poly.fmt \begin{code} unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) \end{code} lhs2tex-1.19/doc/Indent2aIn.lhs0000644000175000017500000000152412507035615017065 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" %format \ = "\char''134" %format let = "let" %format in = "in" %format case = "case" %format of = "of" %format -> = "->" %format { = "{\origcolor{hcolor}" ( "}" %format } = ) \begingroup \let\origtt=\texfamily \let\small\footnotesize \def\texfamily{\origtt\makebox[0pt]{\phantom{X}}} \begin{code} scanr1 :: (a -> a -> a) -> [a] -> [a] scanr1 f xxs = case xxs of x:xs -> case xs of [] -> [x] _ -> let qs = scanr1 f xs in case qs of q:_ -> f x q : qs \end{code} \endgroup lhs2tex-1.19/doc/ZipTT.lhs0000644000175000017500000000123012507035615016136 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" \begingroup \let\origtt=\texfamily \def\texfamily{\origtt\makebox[0pt]{\phantom{X}}} \begin{code} zip :: [a] -> [b] -> [(a,b)] zip = zipWith (\a b -> (a,b)) zipWith :: (a->b->c) -> [a]->[b]->[c] zipWith z (a:as) (b:bs) = z a b : zipWith z as bs zipWith _ _ _ = [] partition :: (a -> Bool) -> [a] -> ([a],[a]) partition p xs = foldr select ([],[]) xs where select x (ts,fs) | p x = (x:ts,fs) | otherwise = (ts,x:fs) \end{code} \endgroup lhs2tex-1.19/doc/IncludePrelude.lhs0000644000175000017500000000015212507035615020032 0ustar00andresandres00000000000000%include tex.fmt %subst string a = "\text{\tt " a "}" \begin{code} dir(include) "lhs2TeX.fmt" \end{code} lhs2tex-1.19/doc/LetSyntax.lhs0000644000175000017500000000157312507035615017071 0ustar00andresandres00000000000000%include tex.fmt \newcommand*{\amp}{@&&@}% %format && = "\text{\amp}" %format || = "\text{\ttfamily ||}" %format == = "\text{\ttfamily ==}" %format /= = "\text{\ttfamily /=}" %format < = "\text{\ttfamily <}" %format <= = "\text{\ttfamily <=}" %format >= = "\text{\ttfamily >=}" %format > = "\text{\ttfamily >}" %format ++ = "\text{\ttfamily ++}" %format + = "\text{\ttfamily +}" %format - = "\text{\ttfamily -}" %format * = "\text{\ttfamily *}" %format / = "\text{\ttfamily /}" \begin{code} dir(^let^) ^^ ent(varname) ^^ syn(=) ^^ ent(expression) ent(expression) ::= ent(application) ^^ many(ent(operator) ^^ ent(application)) ent(application) ::= opt(term(not)) ^^ ent(atom) ent(atom) ::= ent(varid) | term(True) | term(False) | ent(string') | ent(numeral) | (ent(expression)) ent(operator) ::= && | || | == | /= | < | <= | >= | > | ++ | + | - | * | / \end{code} lhs2tex-1.19/doc/Indent1In.lhs0000644000175000017500000000104312507035615016717 0ustar00andresandres00000000000000%include typewriter.fmt %subst code a = "\begin{colorverb}'n\texfamily " a "\end{colorverb}'n" %format \ = "\char''134" %format let = "let" %format in = "in" %format -> = "->" %format { = "{\origcolor{hcolor}" ( "}" %format } = ) \begingroup \let\origtt=\texfamily \let\small\footnotesize \def\texfamily{\origtt\makebox[0pt]{\phantom{X}}} \begin{code} > unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a] > unionBy eq xs ys = xs ++ foldl {flip (deleteBy eq)} > {nubBy eq ys} \end{code} \endgroup lhs2tex-1.19/doc/Makefile0000644000175000017500000000453112507035615016063 0ustar00andresandres00000000000000include ../config.mk # use in-place lhs2TeX LHS2TEX = ../lhs2TeX SNIPPETSGD = $(shell $(GREP) "\\\\input{" Guide2.lhs | $(SED) "s/^.*input{\(.*\)}.*$$/\1.tex/") ifdef STC SNIPPETSSTC = $(shell $(GREP) "\\\\input{" STC.lhs | $(SED) "s/^.*input{\(.*\)}.*$$/\1.tex/") SNIPPETSTLL = $(shell $(GREP) "\\\\input{" TLL.lhs | $(SED) "s/^.*input{\(.*\)}.*$$/\1.tex/") STCFLAGS="--let=stc=True" endif SNIPPETSIN = $(wildcard *.lhs.in) SNIPPETSLHS = $(filter-out $(SNIPPETSIN:.in=), $(SNIPPETSGD:.tex=.lhs)) DONTBUILD = $(shell test -f Guide2.dontbuild && echo yes) # default target ifeq ($(DONTBUILD),yes) all : dontbuildwarning else all : Guide2.pdf endif # in-place polytable.sty polytable.sty : $(LN_S) ../polytable/polytable.sty . $(LN_S) ../polytable/lazylist.sty . RawSearchPath.lhs : ../src/Version.lhs echo '\begin{code}' > $@ $(LHS2TEX) --searchpath >> $@ echo '\end{code}' >> $@ SearchPath.lhs : RawSearchPath.lhs touch $@ srcdist : $(INSTALL) -m 644 $(SNIPPETSIN) ../$(DISTDIR)/doc $(INSTALL) -m 644 $(SNIPPETSLHS) ../$(DISTDIR)/doc $(INSTALL) -m 644 RawSearchPath.lhs ../$(DISTDIR)/doc $(INSTALL) -m 644 $(wildcard *.fmt) ../$(DISTDIR)/doc $(INSTALL) -m 644 Guide2.lhs Guide2.pdf Makefile ../$(DISTDIR)/doc $(INSTALL) -m 755 lhs2TeXpre ../$(DISTDIR)/doc touch ../$(DISTDIR)/doc/Guide2.dontbuild dontbuildwarning : echo "----------------------------------------------"; \ echo "To rebuild Guide2.pdf, remove Guide2.dontbuild"; \ echo "and call make again."; \ echo "----------------------------------------------"; \ %.pdf : %.tex polytable.sty $(SHELL) -c ' \ $(PDFLATEX) $(PDFLATEX_OPTS) $<; \ while $(GREP) -c "Warning.*Rerun" $(<:.tex=.log); \ do $(PDFLATEX) $(PDFLATEX_OPTS) $<; done;'; \ Guide2.tex : Guide2.lhs $(SNIPPETSGD) $(LHS2TEX) --poly -P.:..:../src: $< > $@ STC.tex : STC.lhs $(SNIPPETSSTC) $(LHS2TEX) --poly $< > $@ TLL.tex : TLL.lhs $(SNIPPETSTLL) $(LHS2TEX) --poly $< > $@ # determine mode and then run lhs2TeX %.tex : %.lhs MODE=`cat $< \ | $(GREP) "^%include" \ | head -n 1 \ | $(SED) -e "s/^%include \(.*\)\.fmt/\1/" \ | $(SED) -e "s/verbatim/verb/" \ -e "s/stupid/math/" \ -e "s/tex/poly/" \ -e "s/polytt/poly/" \ -e "s/typewriter/tt/"` && \ echo $${MODE} && \ $(LHS2TEX) --$${MODE} $(STCFLAGS) $< > $@ .PHONY : all srcdist clean clean : rm -f $(SNIPPETSGD) $(SNIPPETSSTC) lhs2tex-1.19/polytable/0000755000175000017500000000000012507035615015646 5ustar00andresandres00000000000000lhs2tex-1.19/polytable/lazylist.sty0000644000175000017500000000512512507035615020265 0ustar00andresandres00000000000000% Filename: Lambda.sty % Author: Alan Jeffrey % Last modified: 12 Feb 1990 % Modified 24 July 2003 by Robin Fairbairns, to change file name and % licence requirements, at Alan Jeffrey's request % % This package is (c) 1990 Alan Jeffrey. % % Version 1.0a % % Use and distribution are subject to the LaTeX Project Public % License (lppl), version 1.2 (or any later version, at your % convenience). % % A copy of the latest version of lppl may be found at % http://www.latex-project.org/lppl.txt % % See the Gnu manifesto for details on why software ought to be free. % % Tugboat are given permission to publish any or all of this. % % This package provides a pile of lambda-calculus and list-handling % macros of an incredibly obtuse nature. Read lazylist.tex to find % out what they all do and how they do it. This \TeX\ code was % formally verified. % % Alan Jeffrey, 25 Jan 1990. \def\Identity#1{#1} \def\Error% {\errmessage{Abandon verification all ye who enter here}} \def\First#1#2{#1} \def\Second#1#2{#2} \def\Compose#1#2#3{#1{#2{#3}}} \def\Twiddle#1#2#3{#1{#3}{#2}} \let\True=\First \let\False=\Second \let\Not=\Twiddle \def\And#1#2{#1{#2}\False} \def\Or#1#2{#1\True{#2}} \def\Lift#1#2#3#4{#1{#4}{#2}{#3}{#4}} \def\Lessthan#1#2{\TeXif{\ifnum#1<#2 }} \def\gobblefalse\else\gobbletrue\fi#1#2% {\fi#1} \def\gobbletrue\fi#1#2% {\fi#2} \def\TeXif#1% {#1\gobblefalse\else\gobbletrue\fi} \def\Nil#1#2{#2} \def\Cons#1#2#3#4{#3{#1}{#2}} \def\Stream#1{\Cons{#1}{\Stream{#1}}} \def\Singleton#1{\Cons{#1}\Nil} \def\Head#1{#1\First\Error} \def\Tail#1{#1\Second\Error} \def\Foldl#1#2#3% {#3{\Foldl@{#1}{#2}}{#2}} \def\Foldl@#1#2#3#4% {\Foldl{#1}{#1{#2}{#3}}{#4}} \def\Foldr#1#2#3% {#3{\Foldr@{#1}{#2}}{#2}} \def\Foldr@#1#2#3#4% {#1{#3}{\Foldr{#1}{#2}{#4}}} \def\Cat#1#2{\Foldr\Cons{#2}{#1}} \def\Reverse{\Foldl{\Twiddle\Cons}\Nil} \def\All#1{\Foldr{\Compose\And{#1}}\True} \def\Some#1{\Foldr{\Compose\Or{#1}}\False} \def\Isempty{\All{\First\False}} \def\Filter#1% {\Foldr{\Lift{#1}\Cons\Second}\Nil} \def\Map#1{\Foldr{\Compose\Cons{#1}}\Nil} \def\Insert#1#2#3% {#3{\Insert@{#1}{#2}}{\Singleton{#2}}} \def\Insert@#1#2#3#4% {#1{#2}{#3}% {\Cons{#2}{\Cons{#3}{#4}}}% {\Cons{#3}{\Insert{#1}{#2}{#4}}}} \def\Insertsort#1{\Foldr{\Insert{#1}}\Nil} \def\Unlistize#1{[#1\Unlistize@{}]} \def\Unlistize@#1{#1\Foldr\Commaize{}} \def\Commaize#1#2{, #1#2} \def\Listize[#1]% {\Listize@#1,\relax]} \def\Listize@#1,#2]% {\TeXif{\ifx\relax#2}% {\Singleton{#1}}% {\Cons{#1}{\Listize@#2]}}} \def\Show#1[#2]% {\Unlistize{#1{\Listize[#2]}}} lhs2tex-1.19/polytable/polytable.sty0000644000175000017500000006352012507035615020410 0ustar00andresandres00000000000000%% %% This is file `polytable.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% polytable.dtx (with options: `package') %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{polytable}% [2013/07/18 v0.8.5 `polytable' package (Andres Loeh)] \let\PT@original@And\And \let\PT@original@Not\Not \RequirePackage{lazylist} \let\PT@And\And \let\PT@Not\Not \def\PT@prelazylist {\let\And\PT@And \let\Not\PT@Not} \def\PT@postlazylist {\let\And\PT@original@And \let\Not\PT@original@Not} \PT@postlazylist \RequirePackage{array} \DeclareOption{debug} {\AtEndOfPackage\PT@debug} \DeclareOption{info} {\AtEndOfPackage\PT@info} \DeclareOption{silent}{\AtEndOfPackage\PT@silent} \newdimen\PT@colwidth \newcount\PT@cols \newcount\PT@table \newtoks\PT@toks \newif\ifPT@changed \newread\PT@in \newwrite\PT@out \def\PT@allcols{\Nil} \let\PT@infromto\empty \let\PT@currentwidths\empty \def\PT@false{0} \def\PT@true{1} \let\PT@inrestore\PT@false \newcommand{\defaultcolumn}[1]{\gdef\PT@defaultcolumnspec{#1}} \newcommand{\nodefaultcolumn}{\global\let\PT@defaultcolumnspec\undefined} \DeclareOption{defaultcolumns}{\defaultcolumn{l}} \newcommand{\memorytables}{% \let\PT@preparewrite\@gobble \let\PT@add \PT@addmem \let\PT@prepareread \PT@preparereadmem \let\PT@split \PT@splitmem \let\PT@finalize \relax } \newcommand{\disktables}{% \let\PT@preparewrite\PT@preparewritefile \let\PT@add \PT@addfile \let\PT@prepareread \PT@preparereadfile \let\PT@split \PT@splitfile \let\PT@finalize \PT@finalizefile } \DeclareOption{memory}{\AtEndOfPackage\memorytables} \ProcessOptions \newcommand*{\PT@debug} {\def\PT@debug@ ##1{\typeout{(polytable) ##1}} \PT@info} \newcommand*{\PT@info} {\def\PT@typeout@ ##1{\typeout{(polytable) ##1}}} \let\PT@debug@\@gobble \let\PT@typeout@\@gobble \def\PT@warning{\PackageWarning{polytable}}% \def\PT@silent {\let\PT@typeout@\@gobble\let\PT@warning\@gobble} \def\PT@aligndim#1#2#3\@@{% \ifnum#1=0 \if #2p% \PT@aligndim@0.0pt\space\space\space\space\space\@@ \else \PT@aligndim@#1#2#3\space\space\space\space\space\space\space\space\@@ \fi \else \PT@aligndim@#1#2#3\space\space\space\space\space\space\space\space\@@ \fi} \def\PT@aligndim@#1.#2#3#4#5#6#7#8#9\@@{% \ifnum#1<10 \space\fi \ifnum#1<100 \space\fi \ifnum#1<\@m\space\fi \ifnum#1<\@M\space\fi #1.#2#3#4#5#6#7#8\space\space} \def\PT@aligncol#1{% \PT@aligncol@#1\space\space\space\space\space\space\space\space\@@} \def\PT@aligncol@#1#2#3#4#5#6#7#8#9\@@{% #1#2#3#4#5#6#7#8\space\space} \def\PT@rerun {\PT@typeout@{We have to rerun LaTeX ...}% \AtEndDocument {\PackageWarning{polytable}% {Column widths have changed. Rerun LaTeX.\@gobbletwo}}% \global\let\PT@rerun\relax} \def\PT@listopmacro #1#2#3% #1 #3 to the list #2 {\def\PT@temp{#1{#3}}% \expandafter\expandafter\expandafter \def\expandafter\expandafter\expandafter #2\expandafter\expandafter\expandafter {\expandafter\PT@temp\expandafter{#2}}} \def\PT@consmacro{\PT@listopmacro\Cons} \def\PT@appendmacro{\PT@listopmacro\Cat} \def\PT@gaddendmacro #1#2% add #2 to the end of #1 {\PT@expanded{\gdef #1}{#1#2}} \def\PT@expanded #1#2% {\expandafter\Twiddle\expandafter\Identity\expandafter{#2}{#1}} \def\PT@enamedef #1% sets name #1 to the expansion of #2 {\PT@expanded{\@namedef{#1}}} \def\PT@addoptargtomacro {\PT@add@argtomacro\PT@makeoptarg} \def\PT@addargtomacro {\PT@add@argtomacro\PT@makearg} \def\PT@add@argtomacro#1#2#3% {\PT@expanded{\PT@expanded{\gdef\PT@temp}}{\csname #3\endcsname}% #1% \PT@expanded{\PT@gaddendmacro{#2}}{\PT@temp}} \def\PT@makeoptarg% {\PT@expanded{\def\PT@temp}{\expandafter[\PT@temp]}} \def\PT@makearg% {\PT@expanded{\def\PT@temp}{\expandafter{\PT@temp}}} \newcommand*{\PT@gobbleoptional}[1][]{\ignorespaces} \def\PT@addmem#1#2{\PT@gaddendmacro #2{\PT@elt{#1}}} \def\PT@splitmem#1#2{#1\PT@nil{#2}{#1}} \def\PT@elt#1#2\PT@nil#3#4{\gdef #3{#1}\gdef #4{#2}} \def\PT@queuefilename{\jobname.ptb} \def\PT@addfile#1#2{% \immediate\write #2{\string\def\string\PTtemp{#1}\string\empty}} \def\PT@splitfile#1#2{% \ifeof #1% \let #2=\empty \else \read #1 to#2% %\show #2% #2% hack, because it essentially ignores #2 \PT@expanded{\def #2}{\PTtemp}% %\show #2% \fi} \def\PT@preparereadmem#1#2{% \global\let #1=#2} \def\PT@preparewritefile#1{% \immediate\openout\PT@out\PT@queuefilename\relax \let #1\PT@out} \def\PT@preparereadfile#1#2{% \immediate\closeout\PT@out \openin\PT@in\PT@queuefilename\relax \let #1\PT@in} \def\PT@finalizefile{% \closein\PT@in} \disktables \newcommand*{\beginpolytable}% {\edef\PT@environment{\@currenvir}% \begingroup % new in v0.7: save counters \PT@savecounters \PT@toks{}% initialise token register \PT@scantoend} \let\endpolytable=\relax \newcommand{\PT@scantoend}% LaTeX check \long\def\PT@scantoend #1\end #2% {\PT@toks\expandafter{\the\PT@toks #1}% \def\PT@temp{#2}% \ifx\PT@temp\PT@environment \global\let\PT@columnqueue \empty \global\let\PT@columnreference \undefined \PT@preparewrite\PT@columnqueue \expandafter\PT@getwidths \else \PT@toks\expandafter{\the\PT@toks\end{#2}}% \expandafter\PT@scantoend \fi} \def\PT@getwidths {\let\column \PT@firstrun@column \let\savecolumns \PT@savewidths \let\restorecolumns \PT@restorewidths \column{@begin@}{@{}l@{}}% \column{@end@}{}% \PT@cols=0\relax% \let\fromto \PT@fromto \let\PT@processentry \PT@checkwidth \let\PT@scanbegin \PT@scanbeginfree \let\\= \PT@resetcolumn \let\nextline \PT@resetcolumn \let\>= \PT@fromopt \let\== \PT@from \let\<= \PT@toopt \global\PT@changedfalse % nothing has changed so far \PT@resetcolumn % we are at the beginning of a line \the\PT@toks \@ifundefined{PT@scanning}% {}{\PT@resetcolumn\relax}% \ifx\column\PT@otherrun@column \else % we are in first run, print extra info \PT@prelazylist \PT@typeout@{\PT@environment: \the\PT@cols\space columns, % \PT@Print\PT@allcols}% \PT@postlazylist \fi \let\PT@firstrun@column \PT@otherrun@column \let\savecolumns \PT@gobbleoptional \let\restorecolumns \PT@gobbleoptional \let\PT@savewidths \PT@gobbleoptional \let\PT@restorewidths \PT@gobbleoptional \PT@restorecounters \ifPT@changed % we need to rerun if something has changed \PT@typeout@{There were changes; another trial run needed.}% \expandafter\PT@getwidths \else % we are done and can do the sorting \PT@typeout@{There were no changes; reached fixpoint.}% \expandafter\PT@sortcols \fi} \def\PT@savecounters {\begingroup \def\@elt ##1% {\global\csname c@##1\endcsname\the\csname c@##1\endcsname}% \xdef\PT@restorecounters{\cl@@ckpt}% \endgroup} \def\PT@sortcols {\PT@prelazylist \edef\PT@sortedlist {\Foldr{\noexpand\Cons}{\noexpand\Nil}% {\Insertsort\PT@ltmax\PT@allcols}}% \PT@typeout@{Sorted columns:}% \PT@PrintWidth\PT@sortedlist \PT@postlazylist \PT@cols=0\relax% \PT@prelazylist \PT@Execute{\Map\PT@numbercol\PT@sortedlist}% \PT@postlazylist \edef\PT@lastcol@{\PT@StripColumn\PT@lastcol}% \PT@typeout@{Numbered successfully, % last column is \PT@lastcol@}% \ifx\PT@currentwidths\empty \else \PT@typeout@{Saving table information for \PT@currentwidths .}% \PT@expanded\PT@saveinformation\PT@currentwidths \fi \PT@typeset} \def\PT@typeset {\PT@typeout@{Typesetting the table ...}% \let\PT@processentry \PT@placeinbox \let\PT@scanbegin \PT@scanbeginwidth \let\\= \PT@resetandcr \let\nextline \PT@resetandcr \PT@prepareread\PT@columnreference\PT@columnqueue \let\@arraycr \PT@resetandcr \PT@resetcolumn % we are at the beginning of a line \PT@begin% \the\PT@toks \PT@fill% new in 0.7.3: balance the last line \PT@finalize% finalize the queue (possibly close file) \PT@end \endgroup \PT@typeout@{Finished.}% \expandafter\end\expandafter{\PT@environment}}% \newcommand{\PT@from}[1]% {\PT@checkendentry{#1}\PT@dofrom{#1}} \newcommand{\PT@fromopt}[1][]% {\def\PT@temp{#1}% \ifx\PT@temp\empty % set default column name \def\PT@temp{\PT@currentcolumn .}% \fi \PT@expanded\PT@from\PT@temp} \newcommand{\PT@toopt}[1][]% {\def\PT@temp{#1}% \ifx\PT@temp\empty % set default column name \def\PT@temp{\PT@currentcolumn .}% \fi \PT@expanded\PT@checkendentry\PT@temp \let\PT@scanning\undefined} \newcommand*{\PT@dofrom}[1]% {\edef\PT@currentcolumn{#1}% \let\PT@scanning\PT@currentcolumn \let\PT@currentpreamble\relax% necessary for preparescan \@ifnextchar[%] {\PT@expanded\PT@dospecfrom\PT@currentcolumn}% {\PT@expanded\PT@dodofrom \PT@currentcolumn}} \newcommand*{\PT@dospecfrom}{}% LaTeX check \def\PT@dospecfrom #1[#2]% {\PT@checkglobalfrom #2\PT@nil{#1}% \PT@dodofrom{#1}} \newcommand*{\PT@checkglobalfrom}{}% LaTeX check \def\PT@checkglobalfrom {\@ifnextchar!\PT@getglobalfrom\PT@ignorefrom} \newcommand*{\PT@getglobalfrom}{}% LaTeX check \def\PT@getglobalfrom!#1\PT@nil#2% {\column{#2}{#1}} \newcommand*{\PT@ignorefrom}{}% LaTeX check \def\PT@ignorefrom #1\PT@nil#2% {\def\PT@currentpreamble{#1}} \newcommand*{\PT@dodofrom}[1]% {\@ifundefined{PT@columnreference}% {% trial run \ifx\column\PT@otherruncolumn \else % first run \let\PT@storeendcolumn\PT@add \fi \def\PT@temp{@end@}}% {% final run \PT@split\PT@columnreference\PT@temp %\PT@typeout@{splitted: \PT@temp} }% \PT@expanded{\PT@expanded\PT@preparescan\PT@currentcolumn}\PT@temp \PT@scanbegin} \let\PT@storeendcolumn\@gobbletwo \newcommand*{\PT@fromto}[3]% {\PT@checkendentry{#1}% \let\PT@scanning\undefined \PT@infromto \def\PT@infromto{% \PackageError{polytable}{Nested fromto}{}}% \let\PT@currentpreamble\relax% necessary for preparescan \PT@preparescan{#1}{#2}% \PT@scanbegin #3\PT@scanend% defines \@curfield \PT@processentry{#1}{#2}% \let\PT@infromto\empty \ignorespaces} \newcommand*{\PT@checkendentry}% takes one argument {\@ifundefined{PT@scanning}% {\let\PT@temp\@gobble}% {\let\PT@temp\PT@endentry}% \PT@temp} \newcommand*{\PT@endentry}[1]% {\PT@scanend \edef\PT@temp{#1}% \PT@expanded\PT@storeendcolumn\PT@temp\PT@columnqueue \let\PT@storeendcolumn\@gobbletwo \PT@expanded{\PT@expanded\PT@processentry\PT@currentcolumn}\PT@temp} \newcommand\PT@firstrun@column[3][0pt]% {\@ifundefined{PT@col@#2.type}% {\PT@typeout@{Defining column \PT@aligncol{#2} at #1.}% \@namedef{PT@col@#2.type}{#3}% \@namedef{PT@col@#2.width}{#1}% initialize the width of the column % add the new column to the (sortable) list of all columns \PT@consmacro\PT@allcols{PT@col@#2}% \advance\PT@cols by 1\relax}% {\expandafter\ifx\csname PT@col@#2.type\endcsname\empty \relax % will be defined in a later table of the same set \else \begingroup \def\PT@temp{PT@col@#2}% \ifx\PT@temp\PT@endcol \relax % end column is always redefined \else \PT@warning{Redefining column #2}% \fi \endgroup \fi \@namedef{PT@col@#2.type}{#3}% \expandafter\ifdim#1>0pt\relax \PT@typeout@{Redefining column #2 at #1.}% \@namedef{PT@col@#2.width}{#1}% \fi }% \@ifundefined{PT@col@#2.max}% {\@namedef{PT@col@#2.max}{#1}% \expandafter\let\csname PT@col@#2.trusted\endcsname\PT@true}{}% \ignorespaces} \newcommand\PT@otherrun@column[3][]% {\ignorespaces} \def\PT@checkcoldefined #1% {\@ifundefined{PT@col@#1.type}% {\@ifundefined{PT@defaultcolumnspec}% {\PackageError{polytable}{Undefined column #1}{}} {\PT@debug@{Implicitly defining column #1}% \PT@expanded{\column{#1}}{\PT@defaultcolumnspec}}}{}% \expandafter\ifx\csname PT@col@#1.type\endcsname\empty\relax \@ifundefined{PT@defaultcolumnspec}{}% {\PT@debug@{Implicitly defining column #1}% \PT@expanded{\column{#1}}{\PT@defaultcolumnspec}}% \fi} \def\PT@checkwidth #1#2% {\PT@checkcoldefined{#2}% first column should have been checked before \def\PT@temp{PT@col@#1}% \ifx\PT@currentcol\PT@temp \PT@debug@{No need to skip columns.}% \else \PT@colwidth=\expandafter\@nameuse\expandafter {\PT@currentcol.width}\relax \ifdim\PT@colwidth>\csname PT@col@#1.width\endcsname\relax % we need to change the width \PT@debug@{s \PT@aligncol{#1}: % old=\expandafter\expandafter\expandafter \PT@aligndim\csname PT@col@#1.width\endcsname\@@% new=\expandafter\PT@aligndim\the\PT@colwidth\@@}% \PT@changedtrue \PT@enamedef{PT@col@#1.width}{\the\PT@colwidth}% \fi \PT@colwidth=\expandafter\@nameuse\expandafter {\PT@currentcol.max}\relax \ifdim\PT@colwidth>\csname PT@col@#1.max\endcsname\relax % we need to change the width \PT@debug@{S \PT@aligncol{#1}: % old=\expandafter\expandafter\expandafter \PT@aligndim\csname PT@col@#1.max\endcsname\@@% new=\expandafter\PT@aligndim\the\PT@colwidth\@@}% \PT@changedtrue \PT@checkrerun \PT@enamedef{PT@col@#1.max}{\the\PT@colwidth}% \fi \ifnum\csname PT@col@#1.trusted\endcsname=\PT@false\relax \ifdim\PT@colwidth=\csname PT@col@#1.max\endcsname\relax \PT@debug@{#1=\the\PT@colwidth\space is now trusted}% \expandafter\let\csname PT@col@#1.trusted\endcsname\PT@true% \fi \fi \fi \PT@expanded{\def\PT@temp}{\the\wd\@curfield}% \global\PT@colwidth=\@nameuse{PT@col@#1.width}% \global\advance\PT@colwidth by \PT@temp\relax% \ifdim\PT@colwidth>\csname PT@col@#2.width\endcsname\relax % we need to change the width \PT@debug@{#2 (width \PT@temp) starts after #1 (at \csname PT@col@#1.width\endcsname)}% \PT@debug@{c \PT@aligncol{#2}: % old=\expandafter\expandafter\expandafter \PT@aligndim\csname PT@col@#2.width\endcsname\@@% new=\expandafter\PT@aligndim\the\PT@colwidth\@@}% \PT@changedtrue \PT@enamedef{PT@col@#2.width}{\the\PT@colwidth}% \fi \global\PT@colwidth=\@nameuse{PT@col@#1.max}% \global\advance\PT@colwidth by \PT@temp\relax% \ifdim\PT@colwidth>\csname PT@col@#2.max\endcsname\relax % we need to change the width \PT@debug@{C \PT@aligncol{#2}: % old=\expandafter\expandafter\expandafter \PT@aligndim\csname PT@col@#2.max\endcsname\@@% new=\expandafter\PT@aligndim\the\PT@colwidth\@@}% \PT@changedtrue \PT@checkrerun \PT@enamedef{PT@col@#2.max}{\the\PT@colwidth}% \fi \ifnum\csname PT@col@#2.trusted\endcsname=\PT@false\relax \ifdim\PT@colwidth=\csname PT@col@#2.max\endcsname\relax \PT@debug@{#2=\the\PT@colwidth\space is now trusted}% \expandafter\let\csname PT@col@#2.trusted\endcsname\PT@true% \fi \fi \def\PT@currentcol{PT@col@#2}} \def\PT@checkrerun {\ifnum\PT@inrestore=\PT@true\relax \PT@rerun \fi} \newcommand*{\PT@resetcolumn}[1][]% {\PT@checkendentry{@end@}% \let\PT@currentcolumn\empty% \let\PT@scanning\undefined \let\PT@currentcol\PT@nullcol % TODO: remove these lines if they don't work %\let\PT@pre@preamble\empty %\PT@scanbeginfree } \def\PT@nullcol{PT@col@@begin@} \def\PT@endcol{PT@col@@end@} \def\PT@Execute{\Foldr\PT@Sequence\empty} \def\PT@Sequence #1#2{#1#2} \def\PT@ShowColumn #1#2% {\PT@ShowColumn@{#1}#2\PT@ShowColumn@} \def\PT@ShowColumn@ #1PT@col@#2\PT@ShowColumn@ {#1{#2} } \def\PT@ShowColumnWidth #1% {\PT@typeout@{% \PT@ShowColumn\PT@aligncol{#1}: \expandafter\expandafter\expandafter \PT@aligndim\csname #1.max\endcsname\@@}} \def\PT@StripColumn #1% {\expandafter\PT@StripColumn@#1\PT@StripColumn@} \def\PT@StripColumn@ PT@col@#1\PT@StripColumn@ {#1} \def\PT@Print#1{\PT@Execute{\Map{\PT@ShowColumn\Identity}#1}} \def\PT@PrintWidth#1{\PT@Execute{\Map\PT@ShowColumnWidth#1}} \def\PT@TeXif #1% {\expandafter\@gobble#1\relax \PT@gobblefalse \else\relax \gobbletrue \fi} \def\PT@gobblefalse\else\relax\gobbletrue\fi #1#2% {\fi #1} \def\PT@ltmax #1#2% {\Not{\PT@TeXif{\ifdim\csname #1.max\endcsname>\csname #2.max\endcsname}}} \def\PT@numbercol #1% {%\PT@typeout@{numbering #1 as \the\PT@cols}% \PT@enamedef{#1.num}{\the\PT@cols}% \def\PT@lastcol{#1}% \advance\PT@cols by 1\relax} \newcommand{\PT@resetandcr}% {\PT@expanded\PT@checkendentry\PT@lastcol@% \ifx\PT@currentcol\PT@lastcol \else \ifx\PT@currentcol\PT@nullcol \edef\PT@currentcol{\Head{\Tail\PT@sortedlist}}% \fi \edef\PT@currentcol@{\PT@StripColumn\PT@currentcol}% \PT@typeout@{adding implicit fromto at eol from \PT@currentcol@ \space to \PT@lastcol@}% \PT@expanded{\PT@expanded\fromto\PT@currentcol@}\PT@lastcol@ \fi \PT@typeout@{Next line ...}% \let\PT@scanning\undefined% needed for resetcolumn \PT@resetcolumn\PT@cr} \newcommand{\PT@fill}% {\PT@expanded\PT@checkendentry\PT@lastcol@% \ifx\PT@currentcol\PT@lastcol \else \ifx\PT@currentcol\PT@nullcol \else \edef\PT@currentcol@{\PT@StripColumn\PT@currentcol}% \PT@typeout@{adding implicit fromto from \PT@currentcol@ \space to \PT@lastcol@}% \PT@expanded{\PT@expanded\fromto\PT@currentcol@}\PT@lastcol@ \fi\fi} \def\PT@placeinbox#1#2% {\PT@colwidth=\@nameuse{PT@col@#1.max}% \advance\PT@colwidth by -\expandafter\csname\PT@currentcol.max\endcsname \leavevmode \edef\PT@temp{\PT@StripColumn\PT@currentcol}% \PT@typeout@{adding space of width % \expandafter\PT@aligndim\the\PT@colwidth\@@ (\expandafter\PT@aligncol\expandafter{\PT@temp} % -> \PT@aligncol{#1})}% \hb@xt@\PT@colwidth{% {\@mkpream{@{}l@{}}\@addtopreamble\@empty}% \let\CT@row@color\relax% colortbl compatibility \let\@sharp\empty% %\show\@preamble \@preamble}% \PT@typeout@{adding box \space\space of width % \expandafter\PT@aligndim\the\wd\@curfield\@@ (\PT@aligncol{#1} -> \PT@aligncol{#2})}% \box\@curfield \def\PT@currentcol{PT@col@#2}% \ignorespaces}% \def\PT@preparescan#1#2% {\PT@checkcoldefined{#1}% \PT@checkcoldefined{#2}% \PT@colwidth=\@nameuse{PT@col@#2.max}% \advance\PT@colwidth by -\@nameuse{PT@col@#1.max}\relax% \ifmmode \PT@debug@{*math mode*}% \let\d@llarbegin=$%$ \let\d@llarend=$%$ \let\col@sep=\arraycolsep \else \PT@debug@{*text mode*}% \let\d@llarbegin=\begingroup \let\d@llarend=\endgroup \let\col@sep=\tabcolsep \fi \ifx\PT@currentpreamble\relax \PT@expanded{\PT@expanded{\def\PT@currentpreamble}}% {\csname PT@col@#1.type\endcsname}% \fi {\PT@expanded\@mkpream\PT@currentpreamble% \@addtopreamble\@empty}% \let\CT@row@color\relax% colortbl compatibility \expandafter\PT@splitpreamble\@preamble\@sharp\PT@nil} \def\PT@splitpreamble #1\@sharp #2\PT@nil{% \let\@sharp=\relax% needed for the following assignment \def\PT@terp{#2}% \ifx\PT@terp\empty% \PackageError{polytable}{Illegal preamble (no columns)}{}% \fi \PT@splitsplitpreamble{#1}#2\PT@nil} \def\PT@splitsplitpreamble #1#2\@sharp #3\PT@nil{% \def\PT@temp{#3}% \ifx\PT@temp\empty% \else \PackageError{polytable}{Illegal preamble (multiple columns)}{}% \fi \def\PT@pre@preamble{#1}% \def\PT@post@preamble{#2}}% \def\PT@scanbeginwidth {\PT@scanbegin@{\hbox to \PT@colwidth}} \def\PT@scanbeginfree {\PT@scanbegin@{\hbox}} \def\PT@scanbegin@#1% {\setbox\@curfield #1% \bgroup \PT@pre@preamble\strut\ignorespaces} \def\PT@scanend {\PT@post@preamble \egroup} \newcommand*{\PT@setmaxwidth}[3][\PT@false]% #2 column name, #3 maximum width {\@namedef{PT@col@#2.max}{#3}% \ifdim#3=0pt\relax \expandafter\let\csname PT@col@#2.trusted\endcsname=\PT@true% \else \expandafter\let\csname PT@col@#2.trusted\endcsname=#1% \fi \column{#2}{}}% \def\PT@loadtable#1% #1 table id number {%\expandafter\show\csname PT@restore@\romannumeral #1\endcsname %\show\column \PT@typeout@ {Calling \expandafter\string \csname PT@restore@\romannumeral #1\endcsname.}% \let\maxcolumn\PT@setmaxwidth %\expandafter\show\csname PT@load@\romannumeral #1\endcsname \csname PT@restore@\romannumeral #1\endcsname} \def\PT@loadtablebyname#1% #1 set name {\PT@typeout@{Loading table information for column width set #1.}% \PT@loadtable{\csname PT@widths@#1\endcsname}}% \def\PT@saveinformation#1% #1 set name {\PT@expanded{\def\PT@temp}{\csname PT@widths@#1\endcsname}% \PT@expanded{\def\PT@temp}% {\csname PT@restore@\romannumeral\PT@temp\endcsname}% \expandafter\gdef\PT@temp{}% start empty % this is: \PT@Execute{\Map{\PT@savecolumn{\PT@temp}}{\Reverse\PT@allcols}} \expandafter\PT@Execute\expandafter{\expandafter \Map\expandafter{\expandafter\PT@savecolumn \expandafter{\PT@temp}}{\Reverse\PT@allcols}}} \def\PT@savecolumn#1#2% #1 macro name, #2 column name {\PT@typeout@{saving column #2 in \string #1 ...}% \def\PT@temp{#2}% \ifx\PT@temp\PT@nullcol \PT@typeout@{skipping nullcol ...}% \else \PT@typeout@{max=\csname #2.max\endcsname, % width=\csname #2.width\endcsname, % trusted=\csname #2.trusted\endcsname}% % we need the column command in here % we could do the same in \column, but then the location of % \save / \restore matters ... \PT@gaddendmacro{#1}{\maxcolumn}% \ifnum\csname #2.trusted\endcsname=\PT@true\relax \PT@gaddendmacro{#1}{[\PT@true]}% \fi \edef\PT@temp{\PT@StripColumn{#2}}% \PT@addargtomacro{#1}{PT@temp}% \PT@addargtomacro{#1}{#2.max}% \PT@gaddendmacro{#1}{\column}% \PT@addoptargtomacro{#1}{#2.width}% \edef\PT@temp{\PT@StripColumn{#2}}% \PT@addargtomacro{#1}{PT@temp}% \PT@addargtomacro{#1}{#2.type}% %\show#1% \fi } \newcommand*{\PT@savewidths}[1][default@] {\PT@typeout@{Executing \string\savecolumns [#1].}% \def\PT@currentwidths{#1}% \PT@verifywidths{#1}% \global\advance\PT@table by 1\relax \expandafter\xdef\csname PT@widths@#1\endcsname {\the\PT@table}% \PT@loadtable{\PT@table}% \ignorespaces} \newcommand*{\PT@restorewidths}[1][default@] {\PT@typeout@{Executing \string\restorecolumns [#1].}% \def\PT@currentwidths{#1}% \let\PT@inrestore\PT@true \PT@loadtablebyname{#1}% \ignorespaces} \def\PT@comparewidths#1% #1 full column name {\@ifundefined{#1.max}% {\PT@typeout@{computed width for #1 is fine ...}}% {\ifdim\csname #1.max\endcsname>\csname #1.width\endcsname\relax \PT@typeout@{Preferring saved width for \PT@StripColumn{#1}.}% \PT@changedtrue \PT@colwidth=\@nameuse{#1.max}\relax \PT@enamedef{#1.width}{\the\PT@colwidth}% \fi}} \def\PT@trustedmax#1% {\PT@TeXif{\ifnum\csname #1.trusted\endcsname=\PT@true}} \def\PT@equalwidths#1% #1 full column name {\@ifundefined{#1.max}{}% {\ifdim\csname #1.max\endcsname=\csname #1.width\endcsname\relax \PT@typeout@{col #1 is okay ...}% \else \PT@rerun% a rerun is needed \fi}} \def\PT@verifywidths#1% #1 column width set name {\@ifundefined{PT@widths@#1}% {\PT@typeout@{Nothing to verify yet for set #1.}% \PT@typeout@{Scheduling set #1 for verification at end of document.}% \AtEndDocument{\PT@verifywidths{#1}}}% {\PT@typeout@{Verifying column width set #1.}% \PT@expanded\PT@verify@widths{\csname PT@widths@#1\endcsname}{#1}}} \def\PT@verify@widths#1#2% #1 set id number, #2 set name {\@ifundefined{PT@restore@\romannumeral #1}{}% {\begingroup \let\column\PT@firstrun@column \PT@cols=0\relax% \def\PT@allcols{\Nil}% \PT@loadtablebyname{#2}% \PT@table=#1\relax % nullcolumn is not loaded, therefore: \@namedef{\PT@nullcol .width}{0pt}% % checking trust \PT@prelazylist \All{\PT@trustedmax}{\PT@allcols}% {\PT@typeout@{All maximum widths can be trusted -- writing .max!}% \PT@save@table{.max}}% {\PT@typeout@{Untrustworthy maximums widths -- writing .width!}% \PT@rerun \PT@save@table{.width}}% \PT@postlazylist \endgroup}% \PT@typeout@{Verification for #2 successful.}} \def\PT@save@table#1% {\PT@typeout@{Saving column width information.}% \if@filesw \PT@prelazylist {\immediate\write\@auxout{% \gdef\expandafter\noexpand \csname PT@restore@\romannumeral\PT@table\endcsname {\PT@Execute{\Map{\PT@write@column{#1}}{\Reverse\PT@allcols}}}}}% \PT@postlazylist \fi} \def\PT@write@column #1#2% {\noexpand\maxcolumn^^J% {\PT@StripColumn{#2}}% {\@nameuse{#2#1}}}% \def\pboxed{% \let\PT@begin \empty \let\PT@end \empty \ifx\\\PT@arraycr \let\PT@cr \PT@normalcr \else \let\PT@cr \\% \fi \expandafter\beginpolytable\ignorespaces} \let\endpboxed\endpolytable \def\ptboxed{% \def\PT@begin {\tabular{@{}l@{}}}% \let\PT@end \endtabular \let\PT@cr \@arraycr \expandafter\beginpolytable\ignorespaces} \let\endptboxed\endpolytable \def\pmboxed{% \def\PT@begin {\array{@{}l@{}}}% \let\PT@end \endarray \let\PT@cr \@arraycr \expandafter\beginpolytable\ignorespaces} \let\endpmboxed\endpolytable \let\ptabular \ptboxed \let\endptabular \endptboxed \let\parray \pmboxed \let\endparray \endpmboxed \endinput %% %% End of file `polytable.sty'. lhs2tex-1.19/polytable/polytable.pdf0000644000175000017500000060073312507035615020345 0ustar00andresandres00000000000000%PDF-1.4 % 3 0 obj << /Length 1933 /Filter /FlateDecode >> stream xڥXK6W=21CxkZ$@=thzm,";!eV="?={+ZݯD*UULbu[ﻟao5+S=u.kFi Udv֥C:W3S`0EjlwֹVɺ=a%V9MlxR, \t\y U wTA:iʥbB%avlwA15WϨgqEکQ;:h'ظkqe-~3{K"|jl>&sL]{1Z-$| Њ!{Zgۮ9!N0؀o<5K:Q޻k~o ^~<-?6vv y^\QS6?4 ֹRESw6aRMވ EOHNp_׬VGl'=1w~@;0BD=ZY׺0%ťx6$х.DT -jd_H Q:Ր+u+1X ~5t0%ҹ^3]>ȬoלF -a$d1P0N*!1n) ּƜŴVLWRC `>L?8{!6^U ޢ=-Q"C{,aP^kKEQZ4;ʰWKEh>wݧͧ(bfHJAKSHRͣ>RDS2S7ƈsP"Tҥᓬ05[P6Boe݂PF>F(\TU]*qcʇ=''CİJs@:԰+2tpaA X ]@cjлO!)]>X+;R.k8MB(c60Җ(1Cx$UK(!?Mzd<.]I;SaiYE d~"F8rX>A0d\5Hw B/ r[y+(wbB??^].abiF&b# 79&ddғF$ 2Di嘸47ŽS(?AvwG٦O^8¤ICX=d{;Pmd^c<6)8p`S5gea.sX%#$BS%gRR,3)˚R5)MgUb @;}&6+/`dNMR /<Ǹ*[?s{QڴY<sRwX>$Lc-\6> endobj 1 0 obj << /Font << /F15 4 0 R /F16 5 0 R /F17 6 0 R /F26 7 0 R /F28 8 0 R /F27 9 0 R /F30 10 0 R /F8 11 0 R /F31 12 0 R /F7 13 0 R /F32 14 0 R /F33 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 2376 /Filter /FlateDecode >> stream xڭYݏ8"9@Z@Xl(o{j;7t)JH6E%"Տ7|Z2 R.?u3Gt9˒dQ.柷7ަeZDe,JAd,JzAk3h4OjnRFUkOD35-ɦPZEH`iy*f)?:nW4H<b" e`}z)wKF3ޡ2äx:s iFK Z6L 1պ/6WbƅwZ@)s\w UϸMʙݿۤEZ}:h<Ŝ?dmw1KUϸ-$,M.vWvum|jVE<+yP0,1-tQ7{|>!ǀ/q0dwIB&d˕RI˧|"JW,VJJrLpÅG #,ڢZm}h*ʶlJ)]&~s%[ ^qs"?86ݡ;Z8y˲vNcqC66U> -OŒ$mQo)eX\:rSܾ #dRJ']Dw ./n^Tf>U* #Gđ^"}I<`rå!YvGf!uf'g&4E3GQm P G&aEZ;RG7]2MWs DEwyb$] 82o A#˜ܖ((T"f琶0B9!7ǟX>7G .@RG;KLﺎ!@AOڙlJi- V|pR*<lI5KWǁhlu1PYo;]IM@rD5.%-b6@w KY*NxX!SNuU>ќ/]Lkj_P̆rGb`InzUJnXtKrl5] ˗,:j'ᷣ|>,R=#馾[F#)6~965ފP}G~h#эx*t ~U.L<,xZ4hmSv#C@iX *rW@д:8[f՜2b.B8 )j"Sf}X̷.nó}wJzI&ؙ^|\`O}9#_M؋s2hãwPCW*z+P) =%{7憆C/87p<rd,Of<+c 07UP1Jd.%UaK[iؓ8l0¥y1rf%$㩀paHRoYM endstream endobj 18 0 obj << /Type /Page /Contents 19 0 R /Resources 17 0 R /MediaBox [0 0 595.276 841.89] /Parent 16 0 R >> endobj 17 0 obj << /Font << /F8 11 0 R /F34 20 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 23 0 obj << /Length 2936 /Filter /FlateDecode >> stream xڵnF_PC׾e E`IR["L [WSD;HybwQGWU"$J0V~E~ŋ7n*S^(5l2k^q{{ZFg~yV+VESz->vu_y¾q ay3@S!6BNae?@@_pm C?Cw}w/K'I|ǰ׏su쇉r| +i.`"K *0'Ak>(0~ }SV֮ڹ ttgpXmY{x _d3sj?Z8H]^ #դep[3hB -ʠZݶSܟ#=6x.)Ckodk1:P)k{wJ%Lu2D)* !TF:[sPA;>9ItResge*nhom]ьY+kbǐ]>b#jdLmDk`Jd 'x"a {:t=B>qjfgV+"`15--y @n)z^6 =rmq/҇E&OZ}͟7!,E+? E~jwb @7\9♦p:DͿnDyGi[e~"浴)VV8ɯ5b?-&XD,qv,< Iy䇩T";C D~E EGgb % -h,R HpJL $u߁uF!*zljY}9AX At6\Nia3C_*! sc4fu1w{h]N"@0ʎ:Q*".F |t߽.&H%xJ=>]LӘ3Hg)о3:$giH7BzIɹL bcVB=8iL⽍%lUW2Sh#tgՍlcJQ o sx0=M bb E77OGwtZк5-3WQ0:5-Z'6Cs-QڥaǙԙiU;Hb[TmL4hTQ6g#5,7d/' jzD.B("U1a{?iOMBomC'GE!J(?J )s#au+a3%MLaT 8[04LrƤ# AǾO A2(bo0+I#b1IX>rǾZF-bcӘݮ6 (MY ӯ3$-^ibHKY45gj(E橭$=уM*1WzÁt۴sڗmPP+W&n]ӯ:㖇)u\)`eq_lk*tfr^(ӛ3_d$)ّqrmEQJАhSaq =%3bN롘=0=LYdmntVEP$(AVKJx%Xi:u0a8ؒac8}'Ǎ|%0K'FOSLBԱL┋q\tmP5`9ׁ X/5774m6 -#a-w湚2?tTjGBߟ  GQ$A=P 񇋜j]ٸB(wՇ8S ԠuBq+6W r'Zvj1u =C(-79h{.Cr)1~F@ endstream endobj 22 0 obj << /Type /Page /Contents 23 0 R /Resources 21 0 R /MediaBox [0 0 595.276 841.89] /Parent 16 0 R >> endobj 21 0 obj << /Font << /F8 11 0 R /F31 12 0 R /F30 10 0 R /F7 13 0 R /F32 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 26 0 obj << /Length 1846 /Filter /FlateDecode >> stream xYr6}WOf"L$$MMzQ@ń (QzVėlG0γNH ^%>\GPeUbGG%ء\h0MN)-#|@Zzb IDg JI$q.W5Շ[`l|p.=GXDa ίA!(ugYP" {Dt8Q,8:7s"XxHG=6%)MwkQdt<4$,' ? zU>Tr&_A=luH:BgCLVޏYq?@pumWO|*ʬͪ|!8%T(8=vHUOAa7 G n]3D*@!CҮpjwmQ+¨LsPjl57:;_-*m7vfkoԻĉo;qh(o'VIp'1:u>2ۉ Y9'*4f_ьaM~Or2&bc<<.l6%9ʝ_w^Lwz}p]q}7ʠs$c l_Y\^{bb_%݂S(pMϳvy)79wd<R146ZyCOCj A f o6yXGLaPxWxk׶UlOu%Cf3P1@ ǵFqC[[ykFNŶ8qYtW u8ĆE 1LgieeZ7YN$qwn:t~͗T]NaTL\ve,6t0+[q J2` g$E0s=I;0wS[1a6G;H'Uec)~c'y@o ]o}b22.B½K"vxa`>50VT'9܇ +)L3vG4 ^N(kz.=lO1꺊 8G ?wa~UW[ywei\Fc7&|͵k80Yp@ #\(alrC 3QX:(HU]z- C endstream endobj 25 0 obj << /Type /Page /Contents 26 0 R /Resources 24 0 R /MediaBox [0 0 595.276 841.89] /Parent 16 0 R >> endobj 24 0 obj << /Font << /F35 27 0 R /F8 11 0 R /F32 14 0 R /F33 15 0 R /F14 28 0 R /F11 29 0 R /F30 10 0 R /F42 30 0 R /F31 12 0 R /F34 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 33 0 obj << /Length 3095 /Filter /FlateDecode >> stream xڽZK ﯘU۴HQ⪸9rT3ZjKꝝr @=3cqiQ|@ 7w(2ww2M)]gB1N#4Mkǖ@qtendtƲ8zWG{nF3w@-:ڶ|oOn/(Rf'c̱_p86/$I\#6udO8TFz{ K}DlԚueY|h ?3HHC~Ǎ]$j˿K\hh{zb#M. CU`g8_8bi~1>ڇ3/?Zˆ$Sz;ؘ`De8 _Q(ad!Hom#|uu mqM.&?z\cpt% mxrii=RaԅJ0]nbdԸi<`,2Ep-:Zd(4-ӁW <[Q$!A|u> ւ.) C5x ;05·1Ѝ"^L/á;7GK_X왾S /[ȹt# @Ҏu~9[ƢubhwLPuPPkˠS_?y>mS?Y$+kDua˗R[tg2].R^5yBSU mQ*^DްX Lf[ۊ( VU!L< ;ػ zd—]בG2#g{1'GCb@d0LF^~eh&Ӈ IO%j2xKC yG3 6{qۄ [>'pPq1ʷiM~Z܆IQ Y=(+:{.-xy"߁_|=b>+" TuN9bI =;^梥0 !خ6kImPw}9o72 M3yͣ)+'s n-?}v`%^hx HR.⤘]̗r.| }Ù]e׏TIhzR9)ɎC@uىC&O8!nFd]H7d}{T MRg/ҵM}X$JĘ9#%7?{m^73/_6 2!5JBDgh-n\Erȗ@XRrl&a'Zƀdz|y3ן=?~s2x"I~- ^20V4k| 0ڑ2¬yYy{׻t$0d + SU)(ŗC١|mNPu4VXz ص=۰|p75OAw#N. 7/ņh3c&FE6^Jܫ80#/rQe &8쏖v-eD؏TQu8s԰V9-<ߥi6vN"rINzNO 3X}uj U R{0ѹ= ϣy#t֑vo%փ\9[yCxb5EB>߅'u@xߘa;O.)'7/,fЪiʭT=.x8 AW.z45\#B60% :>U!4,IHga #hՏĐ֠(QE$Olseb$Ĭf4W>-=Dhx}uSX2G7݃kK|5`w}Ż'׺Ru3E7t:EJLG'txT还s<̀,T%16AU0; )}nu endstream endobj 32 0 obj << /Type /Page /Contents 33 0 R /Resources 31 0 R /MediaBox [0 0 595.276 841.89] /Parent 16 0 R >> endobj 31 0 obj << /Font << /F8 11 0 R /F31 12 0 R /F14 28 0 R /F33 15 0 R /F34 20 0 R /F30 10 0 R /F35 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 36 0 obj << /Length 3443 /Filter /FlateDecode >> stream xZY~ׯ< h)&@K zه3r@rZ碑pG!}TUU՛wUnwW*N$W>v{![{}cʺ 2tZNM]H.Ϻ3c˩̊*r ~T=tPL/Z;&|?߼3jdP)b?*c7uy>Vw|F0um1R*`Rca`c-lJnjU.CXwJdBΘ(#w}.TǼ; l<r(6hrb|ޭq#D#%ǨGԽK{lr_Nυq;-ulϋ|u)ek2n 4ʪrOus@C/ feM~7S))d5*:ҡӹ F2yHhG 5vG f{G״De'k2bfx4#JKC+Fe64ݍni.tP@WVv ?>Srq[ِH4D[0.+j\'T_g4[hO@YfMh&M dh##3 LjLi)7ddu,QA%gqB9B Տ.Tg<89٠ ]Hm}BM$~A `,BqP @WzzWX-wa2va^!aa]CFl^CF!ēӐC,/3OvFXe a^G]q̏ǰzFiS̃AڗcC3\d'gڼad26umc$m D<KANGA<׃]荔 Їa3G`1S?ElXJz'hg“Mdu%XThX1?J螈19pt2*6Yz2Lg<)2~LC{6Y8$k+/`"%jиYBMe5!")Bdޑ3;r|BoХCٴ>'W|1ktv2'z9)><Ǹtԩ3Z%Ӷpty;pyIJ_Q%7Qg`ZD*x]Y KϢY\΅1 /#E~=bFzNUdCՋ_hбCemHl0V:$݋w-ӈ<*hMYDF/(GTPSx%$fzTQr <9Cz̭cϧrLC^%jt]F.({?MzS {dو듯B(Pid6`h0|MwRtX+0 cmӇs v$NƹEF !m$=GLUJ. 'PYd f=|yԦTde*4N4!7UD_+34ymvn fj}Z Šm3́3\a}I-~/x' R0'Hr$Ry&/ Z`ؽu4c&sa"`z^BQ"F8fMF8- 4NМ1KPW;0d6\=N8N ?=no,I7C'v7ZHxS-i_]Og5D4he?EJ[>CkKG:V#,y! kLCPԝ \S&D CY\J$ں70#_TqrzaKT>bkN bk{.H vif#?b.n@hL9:L,"v[{wc=XLqPf>_KߘdR6 .̅5#z)|j0dmXg 7'}m&(PyhHRjݴvUcQpz 80+Y~G7TəL) 2ʗ_%a;\|Hb%UhrSp=Y|]byzOØ05r%~޾p endstream endobj 35 0 obj << /Type /Page /Contents 36 0 R /Resources 34 0 R /MediaBox [0 0 595.276 841.89] /Parent 16 0 R >> endobj 34 0 obj << /Font << /F8 11 0 R /F31 12 0 R /F14 28 0 R /F33 15 0 R /F34 20 0 R /F7 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 39 0 obj << /Length 2807 /Filter /FlateDecode >> stream x]ܶݿb_耜,Q(O"nS8nv]Zi;_;9v Np8rg}UPvI,.*1SonwxpWJuZyt{p@4cT_<O0B+[`)#S(+,_a)t\V#^ҙpe$m8^pWM,_8^q=.1=2y5` 6쥘1#O@ndBv' uk q)Fh XԮo1_f:L"y]-ƢRaWYaJ@ri>вaFRn]< A{QAl) p+wwm=.i+ST.%Z@ɰpΟS}7"yɘƍ FF?ൻt »8@h./QsarP'C9Bu +w8 w<#)rqW6OCFBG?bt 0_Yy:gJQL[_@)YE(I+. !0Io.=ҲlAS5͟aZS!Т[nN`2;= iFݡb:R^?3< .lIs0uJ A^2d0 נɗkͳA1Qg)۲kl$hO)SgJ] O֐EJ h@߽GCw_naXξbjE*lyA$Iw׆\#]"!(?)0jtx> VP:ltn@6 / !խ]#縏;7@rZGdRw0 b2N*v &M@|φsgUDX(!=C^+1aٹC0|&#U kÅnG6C݊LqLhωuY|r޺E cs)DIblɋYi&RC{1zhv`bҠx&4Z q kgܯ/zlRL8X`Bme7R8hqv`>mh1^V%M:ۗhȒ̖/0E7>q;rEKBǙ.BKty4$QG#R|gM F) q4oOK|$,JH r_Qٽ[%BQ`*}n)0]^I*!P3$U4et1xJR=P?\ay=;q> endobj 37 0 obj << /Font << /F8 11 0 R /F31 12 0 R /F14 28 0 R /F33 15 0 R /F30 10 0 R /F7 13 0 R /F34 20 0 R /F45 40 0 R /F47 41 0 R /F32 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 45 0 obj << /Length 1656 /Filter /FlateDecode >> stream xY[o6~ϯ$1+^Ef]vhbAD-58~EBΥͺѹ_C_Y x9EB)gg ň*9nH73jHo^.˙BJ1[G4uF3+<^=ID@nˎXC QQwj?2KPT ~iz{]~*=TU^/99"rbY ֑Qo]MXX=n^70'0Bʚȁ{!moYmҵ ׺v=|ObΊc3T_ڶ^ ^{bYV]'Ar+%uPu4Qƅ, ڧn&f(GEAj/OHjJ'4*C6CKڀ?x96t]xI p3|On2 <8fk)nD"Gt!%߲L.F/l"7k D#0w.S3pg,gõ-ʉ=ʪ6KxtmY;bj@3{(z__**s2j]niY_6}`:N* j*NmU "l,44cXc~7"͓n.5e>?ƍuΖ03)WYU Ipo,Ee@>8/]ouHyD4&`vR}Mי Ó{!fI^kOZ7XOL3[U@؂Z%{i6.b^:u.>q=1 #BJ-ڙ<G*> ɫ]3p9l8?VxX[vj<@Bqx, $QLb_a>YY0Ѐf,ǐx`J]L̪pLt0AvdC{?e}cBoE@2${7 _MEt0O}@;bPdm.%#Z<<:s/ -o7蟽ʝ`%$A&qk\îіnLp}E-/Cݑ7CQDڳ2%C#)}X?i뷭y!aa}¨bG!I>~z> endobj 43 0 obj << /Font << /F8 11 0 R /F32 14 0 R /F35 27 0 R /F33 15 0 R /F14 28 0 R /F11 29 0 R >> /ProcSet [ /PDF /Text ] >> endobj 48 0 obj << /Length 1886 /Filter /FlateDecode >> stream xڝYK6W(@)-)zhz-&V)ˏjd΋ofn޼ϲ̓bv4,Q8Tt?%|Veq$,f|e n>ڨF~m*b0  eZl^u/yZi8MD2S^jA1}%׎^i+YF'3'ˆ3' ,&" 8 6OᶞXN'߬g IҒd;+N<8Y  70a(%f+$MvoTи~,WuM+kG5J#A뫶ѪXnQھE`|7њ4\0p /)q;E2d(#CxCL5fAvڝL1?,nw6ȴ +NE0&*)V@SK^ iZZ줨ifX;yD`U-VB3Pè;Q7#upSzC +qƒ{\]jZ^?iNa,`OU-:`8_qJT_..\:B<5PA<QMT#{Vk&'i/4H$}n ;ؓ&f`V3>jk~ 1S>ON6WN=bpDcBTkX(!J0`8?_?U}ie7wni&6*y7Zv0%Toeq&2s("[Jr5xȑ Dv_ 88MM Uec%TMO@ϲs5bŘjlnն{E!| MeD/7>rlE1+NM%2ɲ9B'lKb[O^./10 lxyĪk`&/CVSdaC4Pk̡r ^y5:xݷo`ۙµ C %@ԙVa_uo4A3Z`ϔvKW# -[s8vVҫWX#1%Ck>$3hg$lzAk5>\\vvsp=N5:5W]4D/ty<ڵƒed=Wuc鏗<( E}cී{==gcF툊aWqBTՓ VN:T^`--(P|S%dYlCt'4B X4åQ^nI kL\cCZrE:tHSzo<;D@^Vk)A}ԇM&NRu$Jư(_o>޼~q endstream endobj 47 0 obj << /Type /Page /Contents 48 0 R /Resources 46 0 R /MediaBox [0 0 595.276 841.89] /Parent 42 0 R >> endobj 46 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R /F32 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 51 0 obj << /Length 1227 /Filter /FlateDecode >> stream xڵX[kF~ϯ0g5w>jC"!$i$۱R8铎FG;s՗o|@q4YH1`1d`6kۗoL"3F& AH$4*w\tr\$lN8~r7V01-Q'hD"a`=DoЛZr+7uUlUuK\ߤ!5Om;qT+ѶƍV23X4Q1Zo7ZFJHzie ŀ@juة^ZkQm;Z+1zL2+7HbaƀsYݑ yU&ƨT6Of( S$GQ['+04Y0xTk "Y5UhpnRvV3Q[ M]0lKw1A*98ȫ -ZԲr kc@ʯ7ɣNƢM(yZYCYؖv +O pqCCqaڹVgc"=j|S~ iXWbyαI'3G%mJpԪQ>/e-Q2/C{'u|?nŦ.3O>v6Ԟf͞]\g4n[' 6;'#vꒇM^aUVU>2mr.i;s0L 8Q8BL+Ͷ$FN0r8vWP6G'fI2[:|#J!*!pԀ1:GdzR~.!5̊"(zF`ys}~ɈmUط݊W6$qUi.UO3 ryM^Cso{ڭceR( =O))9p4bVk}CGȬmsؾp8|5z^ҿZWn+sQ ňG#[#q^A!9Qfyґ"'?Js4~:izh0vWᅭFr9S2S6h6!8i> endobj 49 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F32 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 54 0 obj << /Length 1995 /Filter /FlateDecode >> stream xڵXK6ϯ0` V Č=u& $XHMjm -KIOO%[v#*Y#?,}}θ,J,cƅ-8sK53,""dⳐXRO|]~Α<+?I , aBdT>a0D"K;b.j " XfU΍ִbu4TGrljzJ78d8sUCa'mI A0a?|اMZm?ge꭫PWI̱M^CZk[} aȤL| G5pk8H> 笾Šn(&a1U2bbl;' v VL$e- MW mYI5m)ҖfH]W;sϟ\zwڶ\aE)"|˿jTV~$8܀J; $֮A4I ,@? 231>,%#+?ˡ[WҼlBAN3.ӂ(e_P3KK&!@"}UɠJ k '̜oɩ~2Z+ } _Ěv X0RHqɃh&rx yzl2rDC8?@kêlN|3t,]I]"HA.h cR(+V7Unz$躏")"{ԉ-쩷/bΩ0Tjd2ƎbvT",>BPk:TdGC>IUUdIM6"e`T BqCOZ]POiFzJ*ث*TnDrVO<ǚȚ Ei-{0]nbR~!ڵrj K,UC7 {[#Pkk2Z;pAާ; I g7bard/) h"^C%mH#asy&5]V_}3U;HN|U\_ g38JSI42/-o%[\N-=NNJqXmMwM%# λg'4ֶi$[8RT^*xPu,M[VF?A+̗2g/Tӵ̙4WOݍ d^V\km3y][jGHA8# X+e}M0j&\ص$ǡ~bJkht4AQn)M3R_ 3gq "6U`ǹdPL'f:0$D4hrjYV؉ -ۼ}(<0Yn!rt7Df.@s_brIa˷ YpK, 58p fc[`cPxY@ݢGeTx;)`h\㛂BΌwj& endstream endobj 53 0 obj << /Type /Page /Contents 54 0 R /Resources 52 0 R /MediaBox [0 0 595.276 841.89] /Parent 42 0 R >> endobj 52 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R /F30 10 0 R >> /ProcSet [ /PDF /Text ] >> endobj 57 0 obj << /Length 1335 /Filter /FlateDecode >> stream xڵWK6W Ë=ࢇdZ2Ç9 go83~#eN0dzAD~0 u@ W/ڐrt.D]b\Ov.q–4Ii<^.RmU@ϥB«L / 8alt]l4&Uf-[C K4{j"g~^%[' P1=EQzΫfרξXbOk"[-xROT\xAA"qp̺SA =xa!`QG,Z]? 0xB@ԲէRwKr$ X^@qO9EPw'F鳏٩i ^uF^~2,,Ɉ#f {, Z hհu(oUAAy hjʸ`RqC|cjy/>^`'^]铲ٌ`!mUOYG^YWJh n']/^2J |)EO]7^/.hJ;t9.XKm$BDK]ϫ\*dLxpcwo z#nf4Gb/s[,SۯUbfƆ"9DׂL=뙘7D9є%E]j\#8Z ]~ rTi$o*P0~]v[QSMS Sq46^ CZ\sZEía3+bBvxpBf֡~co> endobj 55 0 obj << /Font << /F34 20 0 R /F7 13 0 R /F8 11 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 1828 /Filter /FlateDecode >> stream xڥko6{"<ĬHz (h:`Ec.4+wǣdVbRxOth$ ve"!V1.*_q^c W1KP"'/<7Eu+t(kH|6,QI'DL yfsTzoW>MЯf"]~s?.u܏;Ytok]_[#Y$G5y(kdb͕xͳjKEQMJ~瓚rq)5 _tkʴ0Xe_" 덬\x^dvmB7_qd |8G,]DL7rwM)O{w=ū ,t9 ]:-#̚{9p/SV~񹬛,-qO-ʵ׺q 5]iӴU[T+~09*$ "ǥnvZߘk ֛0 O;[}`QE{+K I#1ʆ`e#eUkPv萙&:–V{Sp+(IʂPQ7PjxK~eϭU;JV%X8Ԙdn $ٌob Gq!)CUlb"[vV{+wv'e8XgiQrS-ֱܥkJY &<uT\S\yQ>X ˀ?7XG+Y1p.%? p'1FC%yVmҔ6-:nq.[sEl]ۄ%< @iIOO@L?PoL`ˁ2r99Rg~vOAy:([/K6! auu%tF&~θcb{'Cͻ܃9s<l(Aq cBAeOa2E1:.Q{S",">(7Ic~}$kE y^Kz 1+$! )kˉ4A&z (x:81.t @1ßmlc6zk{\Kpa̛st- 9 mϢiۤwvYՕ-ᥴBڐovjIuBͳ.0G|hi`]!Wk\5vbFrri bQe? M h"q]̛9?Ce#UP=\j+Ayp֤Ǻ.i Lն}6/E6/Ft[[[Zk- H @ Mj=ō\¤)o?m%lZ}z>nRKpw!ܭ+>AD>{TcM,ષDjs-<-v9<"RL@6 gNYSwN'̟'>Hu ^# ǝCЏžK1n&i\ugm7lئreNUr<K7/$/q95m8iú n:3)#A,|lWϽ_`/熔ݩn`Q 3j؉i=r4:`ԽOq䞋ck5}iV8t<)!qs;Ap4 ؚc5ӯxY |&}7*pۖp_~ endstream endobj 59 0 obj << /Type /Page /Contents 60 0 R /Resources 58 0 R /MediaBox [0 0 595.276 841.89] /Parent 61 0 R >> endobj 58 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F30 10 0 R /F8 11 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 1815 /Filter /FlateDecode >> stream xڥXmo6_a(&*Dm [ 6`Ƣc-r4%Gia^嫷,8gE܏S1Kga4[fyG0/s[uC53)I0zȩ|. `tǸV1 MDG7iL!2 |)b3V;̩ImM׋=eQ[oh,cتFWUTi0>5 WU]Uv׭nSdU9A?c=<0lbHKVBSZ#4{rġɻ"*,my"rvrKڒ0QlxinjZ/V]lˏ`uȀy`C.7v[fgSeL~++ZjΏiڝI"c ^#r};xt|J<;u4 z8l˚R!GcsSφ8An2 WMu?#UF)"MTz;Y; X |&vyr*W&p9І); 8Qzn,6$ dOSa4eMQX6gѤV^^E@{N9ǻ@:I:1u Ƅ;H=Q0[; e;c^`%]c2~ireɋ6K]3=Xo4%xd&og0}I|XyP:(ݛD@rV4Pot˸bR( ?%`^y1<s/=#zQCߍ@MʼnPh9>7l%Ȇ{'Z;e'c:b[ l:/ i˷m4os>6lXX:OY5U_Bn#awi?x endstream endobj 63 0 obj << /Type /Page /Contents 64 0 R /Resources 62 0 R /MediaBox [0 0 595.276 841.89] /Parent 61 0 R >> endobj 62 0 obj << /Font << /F8 11 0 R /F31 12 0 R /F7 13 0 R /F34 20 0 R /F33 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 67 0 obj << /Length 1656 /Filter /FlateDecode >> stream xڭXێ6}W(@uK_ Т@ 4}ZZXY4$yw`3ek]9͓׹P?^~2?e<[mf" 8S$H|!٪}0szwE*Q //>4<>nqVs?^Of%a!rU)YJC5KXL01)Dղ37ִb!?[gS^C]MY (hy]gd 5a0rz<|anmîƞFWtE|JAmvi;} j>H:M)klvBw g!+ k[whY+ 4}Z53BoA'N})W&_g`$֨vx7uՠd*$'48di]z0V򜻲H9sI:?t' ܙ-rZlpLu9&k݆oahn 2;Z+L1}R!;y )t᝸a8~;/"yw6(`)mQL;0В1 ,SZơsUS7n}ks]t}[6{CN'Ekeȼlc]z,<(two4 FUxd8V{p*m9I?DHvaY.э$!5 {l願0e;ȇ&jep&nhQmÜ =vϽ곁w^ڕݭZk]b"u$~QiWNPx@qEpm~P@[ksuUiGWSU TC Kv_݅^BߕE^wEL"dCZs`;F7?h SKbnûծ" S~d6c=ue)[o92LPN{ <0D 2 HyJk}K#?vǦ/@Whaa9%~ߝt?!<&ϭq|zV' MԂh@d$ 2qD&jC1QЛn*>J_ka? 4s<?'i #(92Wye߂m/A=iuA'?8zYi~ߧq@,j\ @fׅM#'QJ$^[~' endstream endobj 66 0 obj << /Type /Page /Contents 67 0 R /Resources 65 0 R /MediaBox [0 0 595.276 841.89] /Parent 61 0 R >> endobj 65 0 obj << /Font << /F8 11 0 R /F7 13 0 R /F34 20 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 70 0 obj << /Length 2051 /Filter /FlateDecode >> stream xڝnF_ `1bm @i 䐞-,b(R K^iQ*t6K}ݏs0iXw SBg:e\.şs[G(WHizo\. Ur\qv=]pַKn'KTۮ6xǕ5IھrUuDJ]%Cu{X9WgFB2YG[o=Zyh6ݜ\u~Z1UsG\*0BϵOaSQ'5nr5C(yƯ-:&,Y>~W|`Hb˰>t%+uǮʭ6XT6j#5Cbj>2tF,u\edO!M4! Ert<1'!D_ +u>QIƁ!L0ځ.L<ʙ 2bKEebj|a},-8?zFM#[W*01v{MiGHEjveY2^>h#L9HTk;X|-!ֳH"H``Q0`/d1@1&2e} x!`Mr9#v_1}WL~!@K=!9܍P>uYט?G`hhtɽ9XeY(LtwU?ը圄T|d!VЫR5o}_5ݒ6#% ]]-u^|];!L`~lMs-cmN[[W3LǶ:Ʋ*~?Ϯ?{+ޘ^Ve:}llNutC[QœwccEn } nωNx4 =:%J`yoh YUhv7P G},29~lbeSmTTO\Bz.ta*%cb"qǂuwL2c*(`p Np#GՌn2x[d)frh$-ʋQzd4ك^ 4k>bǺPDh?vU,A؀t6P0%+Q{8ծ 9vxy:= ֗] K? -^1Lֳ:PIʻjAOa(ӃI&C& Nur{ )s'1Tg&2l W] [}&;,n|@n2lC0 *[4| h۰96D <\T11)!g@7LPkq=&g)K[N~x5M&ϞwM(s۫D-Ypmϴ uv8zL>VTm8m{H]QC(H.φo?A*@IfŨހqtU!8K c#/RcB> endobj 68 0 obj << /Font << /F34 20 0 R /F8 11 0 R /F7 13 0 R /F31 12 0 R /F32 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 73 0 obj << /Length 2220 /Filter /FlateDecode >> stream xڥˎ6>_E0 W6Y r,rɁmmeѫ8T(YR{Dbq& Tdqdo( 7b1qmda$ vn" K/ֵVlٝZXNw0g SmvLt;< >VgО=QowU:;DpP49ґR<76K!"rPR/ٕQ'6[/ "A",cUOB#"ԺП"&+,I(E&JA|.*F:n%&c;1c$4ao,o3X ֩ۉd;Df!l*ק7!U!F Q ;E.cXmWE{>B:8;!]2[㒥n'drGK}e;C)][%lh}F_hO4+ Z7GKvXSC8}-<1 ŗleߜYQ2pK@}Z3`Vt[p'S=дua)&n!=#$q`,PBCW׷@"ޏ;Zuh/E:yAe,rN6ER4vڍa_ ]oiAOuA ȇ2X:X?LSCSu`#fLcbo~я{`IϹ:?"O6oqӪ!I 4Rϝ=ufL{v z:#Rc̖"%όł{Әg 8[Ҍ̓ 0ǚ ,3 9pY45c3Hv&aB[9k:]g >5a $kcN@]JUƻW{*Z&~U>M}E/Ci=3+d}0+&+lm2I۵wj uA}iц,{qep rCK&RaPo:, F ^: g8sf8|ão>;#˱ uTt;w7?!, endstream endobj 72 0 obj << /Type /Page /Contents 73 0 R /Resources 71 0 R /MediaBox [0 0 595.276 841.89] /Parent 61 0 R >> endobj 71 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R /F30 10 0 R >> /ProcSet [ /PDF /Text ] >> endobj 76 0 obj << /Length 881 /Filter /FlateDecode >> stream xWM0`Eڭ/oQꡇ*9`"YE` f`+Gȼϋg)|B,&3u,9է!L]ˮ|_ }RdEM8si =gF g&L%FC^8Ne- DcoZP8V}B^sCA.g42;7Geۢ\rebPcd٘6`GzlI[VnեxRݵE}* ~h_loϜ "+[H(,(t]dYǽBLD'Y3trʢ)\eDA x~g0tPk]ar{Jl^RQ" ڼnȷ1e}RT H{4ICr9]Ak=f/En+jҡ>8 4Jpq}x5Rķ`!~!^" x6 ;07#u/Aڂ#,I3`oC0$=V^ufM*x}aRm{OKY.ʼnԦf-ZtT?LtiSRF}3l,-?8q8ǃu$Ap`2~޷O}HP:E^O! o>.C3B*w:Lt'!M DqՋn e0u\D82 w楱Y;(G 7rƈf%TF6MǍ*Nę%1  i endstream endobj 75 0 obj << /Type /Page /Contents 76 0 R /Resources 74 0 R /MediaBox [0 0 595.276 841.89] /Parent 61 0 R >> endobj 74 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 79 0 obj << /Length 1693 /Filter /FlateDecode >> stream xڽXo60PERz Xwv0Cۃbщ}40%inI?~ԯ7?EJrɲz<'2I2&b._"?1Hܐde.)aىqO**u=쇪-}p*;NR,<vF<, u*D,uBƢ%?DJd J $ ؽF<>qFH"D%FU/4jЕζc.q)^WJ "td̨lMߑ劋<:ϪtkhA^*K]C*\3q q7c̀ #чsp9t7|q.Qa v j94O~*|Va5 (a/k1?(sk 9AP(v2LY ?NgDgitf"^_hJ~f{ 4ӴpI!0R{ SVl萶uODh ۦQeUhU?Zg:ϭ=]>L.*0._ڨa(Ggf1s>XZ>M#+_ 1њl=ֶRu9Wl͝󩁍~WiFM$kƁmC'HFdL_AI7#0L?0)xb la L6z7IH] T.1.!2a|W;+sHN|jyN^ݶf}Z:h68zR ٌ]u-7T ;B{9<#:bP)8I2Mf{ O/ > endobj 77 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 83 0 obj << /Length 1901 /Filter /FlateDecode >> stream xڽXY6~ϯ0*HQW"C0<&ѱGZf$ϒ0] &2?|xX/wBH,,]tGJo겔Usndknاi,rbE.s $QY}vFr]qMn6j< OW{! ;OX lqN8c;T<\)݉DttrgGW7 E_V#vH{իds4yΣs o5$Uw_haި5?6`qD@ZQLa{Z^Iu jU@y##Bꇩ2 ,,yhF].{PaJC]m릔++妩[Zvttk٪ٽ %JV;HJQa&-ϘSg'iYfG!Gpv$4 6)`nV#Ĕn#\pE8-8ȊWI'z(=㋢i#8G{;CUm2I֧Cx;u[7ҎWZn;6tgnl Y6nZHYs!,2F=?[2qH_;*7ጞr -I?rC/ws`4aԫ=*bl%o]*Z9i`t@;؈7sb'&Y1UE*᳼VP߿+I8/'S,A67ْfa~=Yҭ*юR\%+Dx/dĴ,+{tq+4I='A|^ 9͹.//p{NU55Yy╫ۄOcorxV7i՛睇 endstream endobj 82 0 obj << /Type /Page /Contents 83 0 R /Resources 81 0 R /MediaBox [0 0 595.276 841.89] /Parent 80 0 R >> endobj 81 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F30 10 0 R /F8 11 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 86 0 obj << /Length 1924 /Filter /FlateDecode >> stream xڭXK8Wh iF|5L 6 l0^!A-ږ%CVHْۚDŪb=?ݻU̲D튫%B0a\D[ h>KJY IU¢hw.ն$K~DuCEc *~!t /4^eJu*],54[ڿV_"q4yk]i\v޸}є}r:Bz".mljضiŁ,3|;lh]=LF`q6+rl=bb2݋3zsKEL³to5= yCa[n4H xj-ڥhvIQeW{LhM6K[v(١UD}:I Ct |U $H!.scE3lK0񏻏ES}2!Amv4|AL{EY3YْB!-X+Pm$ଂ * ,ѯdun;viA+D;Ԩc?ˠN W fPjub[ AF*OY6SqZ M5D6-YHI \'EuYUcrgֳ560_&{ IMn,ais|f$%YyK0㞰ee\ oǷPf(|X$'}Uʝ7G]<>`wD ^ˋV[2m}(O>/kCoƎXFLl1V&6ray1Bi M"~K5}C u%. n_EWw[J8p4{.q;Ce47 }V'.)7|yem^w/b1-l_3a̶Rue>|s'|"x0oCtw=1Y:ɣe?S$Y~xxr((bpG_qd]FA<`:tVsӹO`o, gh?ʃyeyG]fzrwRmn߻ . R&ҥcWF4-fO {$j]Q --@Bߠ4H52cmtHw\roa -6,5xkCpOނ* ߬JqqP!_V:=+[ 93k%ѱ- C&3̼ӫDЖ5 PX a]:\.ݍJߊ8[qP{@yXs 6xr,yV-NM BX@:2fn};UٛL)'n];?]MBD"[Ӿ}I`БYد!Y11=qW,C75?T M!欧mImQeSouNq#wFUx#۲E?[V mZu!{[5vG6ǗoPƧ9wF,dk`O$vvvK|YD8w(dov KeLlG3`׆EOJ8LT/#c>$e ԐKc[eW~{?t~` endstream endobj 85 0 obj << /Type /Page /Contents 86 0 R /Resources 84 0 R /MediaBox [0 0 595.276 841.89] /Parent 80 0 R >> endobj 84 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R /F14 28 0 R >> /ProcSet [ /PDF /Text ] >> endobj 89 0 obj << /Length 1205 /Filter /FlateDecode >> stream xXn6+d_zH]tU킱hG,zĹ0%EҵILzW(jp8^1IC4 b8̼?}~LiQ5'r!_hwjqQ,5Q$I;r]'^f|݊Z.J]#F @P¥Ԣ[]]hAע/7kc;9_gv4QӝfEM2#Bǁh#;ugBdVz|mMЦ5b0d,va:yoJ-:|]p|<i@u\|J?,1d4~~&-b/;(#|rG٫\8N;ةi"~5ݰs=,R9 GzE*Z4X^F>)uWku ~[ϐ5D~f` `k)ǔxE'J4b)!@c.!yc/7ǯq.M?!cvŐ/]_܏+r?S'5.SbݸX]ZҦmj(,SsxR]LĕԔ $ N6H{35/ES!.,F c,v_3_Qe3,C q8Xm N[V3 %ݡN f- ko/(פR{'rYB|hzFY:y{h :fX~_B$ؙ~Qiק\>D#мtAIug8 JS,>^Z dMW,C W15 GYeBYH>%~,!ҝ}[+iRtjm^<%F┆.뭈."[M}.ܶ E.@6E >>;8왗1ix:l*HGuC\Lx ^dh(s=S͊,> endobj 87 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 92 0 obj << /Length 1443 /Filter /FlateDecode >> stream xڭXn6}Wņ+RHH^6@?AhG, /-xpxȿM>߳Qbt>4F$MуG`8}@GQDRaK.jtVkOw?)X7b'&-u(<|$e*oCzw4XdE'tϳ|yO s|TdpCumۥn~OI0ih0{`gQdb^L6#)E \Oziޙע^{{ yEoqF$zQ"G*' Ӵ"ΜpŢENnI#vT2خbiVIj0捑ըP" ^v]zp< ZtVZE$d)ŔyާmpO6cR/KZ3r\Zrukb,ͪ{0'ӠzMAYA Ȧ1CIp $ʴ_v+Q8h#dʝxJ^:#mzIS-E v.k4n!Oz)YmRdzy l!"} s/U# G+3 ےTˡ!*W5t}ɫ~Ew |LKypZƷQ̕墦W TUշ. v<M d050 kc<"Cxޖ!ØS޼x 5/|܇f J^֢iOR-Of@߁eZi\TM;{"r`#p5(%`h@BэJ0G[Y!S^Vk-S^UaV+Kopj_թ{݇]:-t ],ÇZ9QZ.׏co3@;Poٸ L1Cp&Um,WG7/Cvpy.@. 蹚;͗_gq-S1MW#ZQ_ϮYtCoj!rV]N"/ӳacbl-w/z/JAb;.++FƔ'lK!nY_¶I$LZ~>͠z*@~4hj VOxXK\v gY ͫZ}ry^YLĈ}Zվb]mm.n<ОF34ql$APЉ/ӫ endstream endobj 91 0 obj << /Type /Page /Contents 92 0 R /Resources 90 0 R /MediaBox [0 0 595.276 841.89] /Parent 80 0 R >> endobj 90 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 95 0 obj << /Length 1737 /Filter /FlateDecode >> stream xڝXY6~ϯ0*1#^:P- hh!e[搣pȟW޾RKf͌JNXB?$*DHsY<^R8(z]>̻eE3k,&qҟ-hDxe ,L1H13זjYh 坪J%Y>9;#!c#>ʓu]68ntoS+:f#yӀLɒ2ݴQP|Ubm.aޗy$1,;bGU]uۨ;Gn ]IS2a{LZgMZ'<ҵuu!BEm  qdP"x`>a1CޯO{ZDigOR7_tsf'N!x^?+!a "iCrCKaէ\(2׏HB=)F)| 0at (~o:fBXj֓a8 8@q gCYq2lj1D "xTmNѰ72K3RU8b>&DWp@BB7lo~h4>ʻ_lŽs(A!vIߕTv-r mT&l*${#[ڪs\X>amYR,; ZWת`EPcR^5`cySE :K?8#׺,@Ԑc(wP^u8$@ #ۭ9 )sVó-oo3h Fȓl]LΟZ1x멩#ژ P9{m =KȎv9?N흌鋝\^,o9fdнVN V'1:W(&cP)rz7rD8' 7dz[68(L_0I { ԛ]rs7W n ᆑ<ڋ \>!%] iOM< 4g=պ#S3Ev/cv<7N!5J6rEɞbH8b?\z׸ǦΏ0x2GZN;3v21MgWn TБV﷤ڏV*Z q"_bO7^{HQz %d!,4]6: {5+%'m3"uE#f]1.ָopsGMއKK8wй7C S,4fӀy`\~mvf }$`#FXL0,0pMY f#*t0}() CCOM@S]'=lqe > endobj 93 0 obj << /Font << /F30 10 0 R /F8 11 0 R /F32 14 0 R /F34 20 0 R /F31 12 0 R /F7 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 98 0 obj << /Length 1955 /Filter /FlateDecode >> stream xXKϯ0D C=5XdrY{0HrwbdsA9t"zU_}?n>|TiV*,,jS¥9LmoD/e1sif_wT걱y4 6eѶmz= l8>;'uRа52~%I#]nkg2Yj9+$8X~$,{hd XY+3k_b]Ӄ7V)+2uRH +gj7o4Y'"5«Jb1^Ge8M{_I] <[ӌQ;\/9{'ʲ@E # A$ :]:fmB.({{ȶ?9aNsU״3@w-Gb텤ڶ ̽-&"~zr7ۯ&;<*>X^R kcq!b:Sf@(seЁTa+Yf\XEȿMѕiʺꇷ`8W$\U]K v' B?Y-lJȔi3rGHO7tsxi>-6TpiŌdG5s>IRZ,="!uʰG!% PG,6| :xxp[ EUV7 >3;Z~$8Â[$}&Ʌ0=g}ǒs1{kʘT-.I%"C{h3_f eمIyMl/ѐP9^|KIÑA{>\%LfW )HGnЌW 6Fud@*P> 'T:+tg.z۰ilO~%B0d) E.qla\O8u0'r5?%{#07m`^ysb_ y*,V}cpI?Ǫ#BF/- l]gevN+Qۀ 6Z[AEB?Q}kFt;=~q,X/KbR}#E|Xge᳣w2Y|V.L4;EvȊ/2i\9 endstream endobj 97 0 obj << /Type /Page /Contents 98 0 R /Resources 96 0 R /MediaBox [0 0 595.276 841.89] /Parent 99 0 R >> endobj 96 0 obj << /Font << /F34 20 0 R /F8 11 0 R /F31 12 0 R /F7 13 0 R /F30 10 0 R /F33 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 102 0 obj << /Length 2007 /Filter /FlateDecode >> stream xڭYK6ϯp0@bDA0vs1C٢aHt7[JdM->>VAsh8Rz;zZ+¹4f\ EFx akl8_Z72fKͬEfL.Nx3tcQܞh2ZsqogO%"{j ^L#v B:rR)aεݢ&)kxJ д3LAMMB. >#&%tTM(owH\USv-kWGKN_IƲǩruOʮpˌ$qcf^\U7/4z%;`)`z85ǻ(?AO PѮdeQKj4G4zn'I.ݥ y>X_P7՗AW;Y٘%,S`tx%&:۞ xcz);# aQfM9U[8!y tqln/d@%WfW~D3Km8%#I'Lp(ݿwckjw".S^10L%`s|7ߋ*]L6^BܮLks_:;!swy5 %Tv{MҔnJ~ߠw ܀7X &GiV`HHKzB>@ko?<qTm9E9i}i!_)Yw<+k[|()[nڊ!)i:{45%ϹiegQrO' Eͅx /!F7pXx:?s+0IrC}O56ڎ18PES٥<1(p4YmR=g~3ಙuG:5n#i @JpVAWG4:z@wqj8ԥ72nՋLP= 3ʳy@ܜHvdtMN)=6)#cnmk_N%8?{9R2A0Rޗ7> CFMMlHO zԱK (wy='ĜIbz)^X7b33y-yv -/mJ|mO#]5K(Ku9~puR6sCOHBkF]~ endstream endobj 101 0 obj << /Type /Page /Contents 102 0 R /Resources 100 0 R /MediaBox [0 0 595.276 841.89] /Parent 99 0 R >> endobj 100 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 105 0 obj << /Length 1656 /Filter /FlateDecode >> stream xڵXK6WHA!"Ch $9C%KZnB/Г(|P|B7x;Hȋ\BjqXDVa p;񃯻mz'.2q+]ޒTF!dPCMjb0hjV>]muCw8u ۷-F)~* ٟ1ZC5r6٘ʲ/dƃ ӏ]ⳅ3?%)|0:U XY*D/ٶ(xǼ;k%JDݤ"E x'K޶ n,lb.@%brk{ؿ*1}md+uWtA7B*eǡ<vjK} ^ 1-"[džW;=O7 IbIF_)?7B#7kq -W lPx yn^ym <6SLJo̩ab\oӶ֦$]-Q3q`{h E!!n.s[r1+C tB !n CCBq׷_jYTJ~@x`ŵL|HP箤axW.a#FFhI+6sOܝ iN` *H)ov1N!A" ^8nԦO9 2TV8L΅#}ɴLL}^*/ D<&ORazW|:|Uקg`e,5^+HoɄp^q1aQc/M /f#A%:]E cio/ l @ԼϨ!ptJ ۫:< gI.p%ϢG=UXk`<]n6+ӆg%p ?OJX-f5)g;4ky-&7T֨fT+5/4 D)e 3t@GIPH_{dLkI endstream endobj 104 0 obj << /Type /Page /Contents 105 0 R /Resources 103 0 R /MediaBox [0 0 595.276 841.89] /Parent 99 0 R >> endobj 103 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R /F32 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 108 0 obj << /Length 2079 /Filter /FlateDecode >> stream xڥɎ6_a  mHԝ`L-=RbR*=o!eVe=7꧇w>MF囇ǍElܘBr[%f߇&,ӈ*uIPfK;I\E EŸmMǻ9ʩw+xȌxqR`Bk&lӼlstE[Gv lNjyx  ^}Vf=iC.]{> K`A ,NwtkCtt!=ӭ'K܂>0TUQ2P%:l22`qT}_=ݭ" `[X7iXfR`Jh?(myP7.-]էqnLSNQ ^alW(;)8..!nE2nDRJ؄RJPJDZPW>dD贞}k.e 9Tk raewu+$^r Vksݡ?*LU̾Wŏ?Vܥ",ixdZZoR*ri MzEU#aqQ?uP=T^2Y31zK{rnTw"ySdQ2"i"s&6za~[%R%4)_\~P%5 w[_yr/6 _%{?v{:- 7\@sEɈSWBKSm+>#lVH-n$2*cyh)蜣/{vк_9wcX[ Eq=8{]hi>fX7VH',S݄xҒagHp fc_ Nq7_,"4ۖeX)$ZxV{\iM!_ðPvV˸D=@q8{0@oᘷ)d+>L.D|Ez͕8p~jJ^>B>sAaNYXs`,k8k+۹@p~:pYUa; lNֹ$W)dž WقIT1cdd5Gvx9x$\ |UJo &DV- ~c9@n. OaT2=CH zm L|*<#" _Z+k_`1[C&%olA0@.[):F 4+@*ҫrN%E伭 '3-q71/IqNa(@&poU{^J訥֌atk?rȻF8nYW]E]vx~r|A/W pӛ 'G׀Z+#C0Iz "qi9=Fpխ0 l`:ucUH?2Xj`ֲh%ڜK4@JViۮGB^rzxuc]~)R0h)x1-cQ7q>+7A1#6L՗$M( n\ H2&X1Y bvO8Ð#3 aE*a)4з[30 eFvG4.3y(g>?TqDi?hc;=P?_ "s$gYX@Ss(׀<1bSA$p?K'.i`T<yFYo;cKQ' 5?M@yz\j5§䡧*/ q\N`F|_ ;QlFSVbi ZS"K`'n:RMEVÚ|dv3mztLT< Ep7nt+GϒBy6[-/E0$0cK@$A TC5 NyPʠcŏCI05G6KS\f"V.cͻ>  endstream endobj 107 0 obj << /Type /Page /Contents 108 0 R /Resources 106 0 R /MediaBox [0 0 595.276 841.89] /Parent 99 0 R >> endobj 106 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R /F30 10 0 R >> /ProcSet [ /PDF /Text ] >> endobj 111 0 obj << /Length 2086 /Filter /FlateDecode >> stream xڽX[F~?0 hqGnae7<Ȓe.*ɒe_r_UuwU, Vە "hzLW__"嘻 "KN_]$at'o N:{ͮ+C'+p)i9},s#־Dj[VX"Yxb^r K֤ʂwP*^TLmG5Asbn Eij%m@<3T4&Eyzk\6GbHI~]AS :?/$)+@AhTSdϧ@4p+yULV"%ܞgfIKkMѠ*g){T(ASJT0 JTB6 C; qI~fB>Ӻ(z9T,I!zYQk${ As(PD%y]w~~lˋS-xoa613"`IO5́%*U4@ >v笪Y>•F(xfla8ϐ@kښ&2?S*Ӡ9,ӛÛl wIhz+$-.UP÷C8('HLW L7/B~Kx3P< `ꦬś2oEM^3pjZaK5 OkNX@FIZ7/d^3liWh\6Hڧk~;p)r!G*>~^l 3A[& p>3 2]" sf-(1K4Hǚ4RlaeFhT nܸ%a>(nOΚv/|00L0`cR) j vyќdßTm` ( =X _380Frx X/P<߹˹ai.vZ =Hk->Pŕf{!AO:Μ&gsgE"lf{hoemor@8sTvW$[R{Ц.l Jr@mEJk~`gSO$P(oK?ȫ:v")wlJ.aGqNjpSFB^&Z"bS0zO]\-cyE-x.~0Kj"1̧2'rUgMIP1]W OiNMFu$`hd{ JvQChm5EdM- ˃b@sџ-B?7Bl=W U(WGP> pH Ȓ Hf)vPLrC{:ܩ=XCP@ԣ|潽4'$l|y[綁Gٸ*R,<&gLYTD@y'}tźnxQ, bLobg++\1$8Pz. h_EEѺ V a5 x&?1P2q,VcH ,LvimQ| +@1ݔ]XCnF޺p5ߟF7i% :T [XYN u($\w2>鿂6k endstream endobj 110 0 obj << /Type /Page /Contents 111 0 R /Resources 109 0 R /MediaBox [0 0 595.276 841.89] /Parent 99 0 R >> endobj 109 0 obj << /Font << /F8 11 0 R /F31 12 0 R /F34 20 0 R /F7 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 114 0 obj << /Length 1566 /Filter /FlateDecode >> stream xX݋6"rlٖ ז;hP@A(c>YG(=h,͌fF3qt,dP4 'iƓrr;K`~M8ɒҐI|;Q-Ū Q}'GϣX$3+uqBX_2~[90|G XJ T'A.dJ3!Dhr8d`<{aꐗO2"LP4&qF?o(E.%lT5bygrItp+&.+)"H4NGR,Km1>abbkدz[:+$˷V%.J6% #JCi/UK[Rf= `%Rq!֍xU7{EYAU&GGNJX8snShjF6DTБ@!ϕ3墕坶7<"qN8 _+Z1AeB2,A? E0H{RV&, ns$o/$GJ=m G[VfDž1p-:ֹW):z׫T%$ї;4\֤MFI:'JvJx[uoKy4 }dh1GaHepG*Xi ?uƦ$H}U@Z1,oq. 4/Gı8TbCo)j.ґCFn=Aܗ 1%a0u2F³ 2s0TmM }TXnqHҘpـ8QHC?9md4)+Jà 3¹X"UxTl endstream endobj 113 0 obj << /Type /Page /Contents 114 0 R /Resources 112 0 R /MediaBox [0 0 595.276 841.89] /Parent 99 0 R >> endobj 112 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 117 0 obj << /Length 1231 /Filter /FlateDecode >> stream xڵXKo6W0+R(R졇b5v 90(Y{I%/PAsm7 ix!\D Pؤ { @/6Ɖ˖P4Z]z<|ߡyK5Щҟ4z-KZSz!gn~#0D{WݩYc~.Ĺ}qѪôH{`ۊL- dx|<BT 4NwB@Ѐz>/h.G4yՇp´8vԿr,ę vrB B(ٷ, !&j7Fy5t%϶7mA -+f}ޱm:u#IW0eV3nU:a ld(mU1(KhWb(gnqx8ׂw{!tj1ñZyKNf 3mHiJWƉ 4Җ Xgtg-Z"I.mXԭ_$dI'q=;tYdl?t';0MQ#|rfÏKYU iT_$jk'0s8g}[,y"$e-$Y/x7%}l%> endobj 115 0 obj << /Font << /F8 11 0 R /F31 12 0 R /F7 13 0 R /F34 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 121 0 obj << /Length 1481 /Filter /FlateDecode >> stream xڝXێ6}WX, 1#RDm hm٢Bt.v {ieYHQ˙áZx.(>[nf("d„͖//"W:(C*?%88w٦/SJ]5Fɵ* $|naՒ6,Qn!Ȇ_-'cdFa Y E'*RMִ]ӗwEs14۾~"OQԥ 凋WI%\veR 9jQ3g[eW5N"}'ݽh൳%;"Dpo<7fi1Kޯ+P]!Xߋ73bӷ5߿&nW`4gE_艊Iubk%&0TO ɺ1`Xsl7PÓPɃХ:Vf|=6ǪwG(0فP_8@1%P4 k sIUmwmMQQ8%SLձk5|~"F7CrCb!l.Lmngۯעm7})_*Q@ hb0*N 4>_A=I1pT ]%TyvN'+\ dio BEQ8F%^$&>+NP1FC4l)@-t7s$ܭFs0U#D(T^ . mEhR~|,;Uڬ2gY 9QZtέjBlLM'9-+•i-CO[?s˘6N˙C/obwBM?&Zo.{7 Vtw1{Qw"M6+\s s _x"3\WE!{;eT}FTe,pZ>.8껓4 0YC^/׻A@z (>G.+G5a_6!STPhi?ēVʱhDψCHu"=G.c$G?OD]8R휲]lEQ)R*v9^/rܫFCctNp^7K9aLe^T*#ámzɪϓg/@$; xw$ecD&L&Aʴf҈ic Xؘ5JK{]4`DyR_Cʙ32 eeec2*4"g4B؇%6^]RĎ endstream endobj 120 0 obj << /Type /Page /Contents 121 0 R /Resources 119 0 R /MediaBox [0 0 595.276 841.89] /Parent 118 0 R >> endobj 119 0 obj << /Font << /F7 13 0 R /F34 20 0 R /F8 11 0 R /F31 12 0 R /F30 10 0 R >> /ProcSet [ /PDF /Text ] >> endobj 124 0 obj << /Length 779 /Filter /FlateDecode >> stream xWn0+t #C@|k{m!M^J$m%aF ^.g(NDHXDb$xD4Zbf84e$HE5Cy0mU=D碳aW =HRIqe\|pJA@2_6jmL1XRpVyYhöm*0*4~WwzD ?)B\D)@Rۊ>_*KAI1[ȼmә.ڦl? DWG0][gR}Q΄$3Tyh.ɤ*1KH $1\}^OWi-K_+وg6}&. Xvʠu [A`S5B󁹤1n؟ϋ?t endstream endobj 123 0 obj << /Type /Page /Contents 124 0 R /Resources 122 0 R /MediaBox [0 0 595.276 841.89] /Parent 118 0 R >> endobj 122 0 obj << /Font << /F8 11 0 R /F31 12 0 R /F7 13 0 R /F34 20 0 R /F45 40 0 R /F44 125 0 R /F47 41 0 R >> /ProcSet [ /PDF /Text ] >> endobj 126 0 obj [513.9] endobj 127 0 obj [493.8 530.9 456.8 530.9 456.8 314 513.9 530.9 245.4 273.9 502.3 245.4 816.3 530.9 513.9 530.9] endobj 128 0 obj [513.9 799.4 513.9 799.4 799.4 799.4 799.4 799.4 799.4 799.4 1027.8 513.9 513.9 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 799.4 1027.8 1027.8 799.4 799.4 1027.8 1027.8 513.9 513.9 1027.8 1027.8 1027.8 799.4 1027.8 1027.8 628.1 628.1 1027.8 1027.8 1027.8 799.4 279.3 1027.8 685.2 685.2 913.6 913.6 0 0 571 571 685.2 513.9 742.3 742.3 799.4 799.4 628.1 821.1 673.6 542.6 793.8 542.4 736.3 610.9 871 562.7 696.6 782.2 707.9 1229.2 842.1 816.3 716.8 839.3 873.9 622.4 563.2 642.3 632.1 1017.5 732.4 685 742 685.2 685.2 685.2 685.2 685.2 628.1 628.1 456.8 456.8 456.8 456.8 513.9 513.9 399.7 399.7] endobj 129 0 obj [525 561.1 488.9 561.1 511.1 336.1 550 561.1 255.6 286.1 530.6 255.6 866.7 561.1 550 561.1 561.1 372.2 421.7 404.2 561.1 500 744.4 500 500 476.4] endobj 130 0 obj [277.8 777.8 500 777.8] endobj 131 0 obj [500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8] endobj 132 0 obj [638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9] endobj 133 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] endobj 134 0 obj [511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 135 0 obj [666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.5 666.7 666.7 611.1 288.9 500 288.9 500 277.8 277.8 480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 238.9 794.4 516.7 500 516.7 516.7 341.7 383.3 361.1 516.7 461.1 683.3 461.1 461.1 434.7] endobj 136 0 obj [569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 323.4 323.4 323.4 877 538.7 538.7 877 843.3] endobj 137 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] endobj 138 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000] endobj 139 0 obj [625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] endobj 140 0 obj [571 856.5 856.5 285.5 314 513.9 513.9 513.9 513.9 513.9 770.7 456.8 513.9 742.3 799.4 513.9 927.8 1042 799.4 285.5 285.5 513.9 856.5 513.9 856.5 799.4 285.5 399.7 399.7 513.9 799.4 285.5 342.6 285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4 742.3 542.4 542.4] endobj 141 0 obj [892.9 840.9 854.6 906.6 776.5 743.7 929.9 924.4 446.3 610.8 925.8 710.8 1121.6 924.4 888.9 808 888.9 886.7 657.4 823.1 908.6 892.9 1221.6 892.9 892.9 723.1 328.7 617.6 328.7 591.7 328.7 328.7 575.2 657.4 525.9 657.4 543 361.6 591.7 657.4 328.7 361.6 624.5 328.7 986.1 657.4 591.7 657.4 624.5 488.1 466.8 460.2] endobj 142 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 143 0 obj [489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2 489.6 979.2 489.6 489.6 489.6] endobj 144 0 obj [450.9 483.9 418 483.9 418 287.3 470.2 483.9 222.6 248.8 457.7 222.6 745.1 483.9 470.2 483.9 483.9 320.3 360.5 339.6 483.9 431.6 640.6 431.6 431.6] endobj 145 0 obj [667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9] endobj 146 0 obj << /Length1 1131 /Length2 5519 /Length3 0 /Length 6231 /Filter /FlateDecode >> stream xڭu\ipP$DfhA$aaH IIF@FZwy}q_k_{^{Ͱ0j Jg$א3Ary$!(8P j@B"< G92eH N0(o^,kPEz@mx Av0g_L*ζ6./y@nh( oL  @m|t5('Wr5NݩY;v \QP$PaE:/89ʨpD+sSyAma(= wCmݸ|:Z*\ߋ`3J?ir֠4;HД^ڈ~2b ( ,#`ozzJ9@P/413Dh@PQ1 _ }C|c ?J [;!A@>?~#vgG )C 4HtCO3?RFBP@"=?B h?$z&CǙU)@BACx=DG@JBB"~ qG3E^( |H:$+rb}:Dz:߯ʹPi|UBNyM3t5:ifj#ŧ8E{↚]aL/ &];71L=REDR!A$IoB=IcqG^;r!ɮrn,1.!xnoPf_-V<n^,ɬ)+k]u$YwfƴZ_jUa@+Udd5OjrA>GR ɡ*U-EZW`tՏFU |YmrP-H/HAv[kkv~ǾĿ8+)u]pNR~o8;.s ٣ aL.,Ž 73ӧ3yoB=Flypbz#Bʟl .j$1zJ{.b-VrZ}mqh~tIf>iwo>_-zމk=oFhlm(v#$4M2 Ԋy)̓ $ D3mɳ;V >ޱ+*_BOK^c4>!lŻl9/hy~۷{?&26`rmy,Dd/J6yxmwxπslޟih)Cm|WOlyz dIm Tm/#8)=?]bçSxT`'mZ|p#/O} \_t~Q~]<͡u(%<) 擂:t*OWBZ4xJՃ[.fLIGm WsCFɞ_GjslHF\?6ɽsڊYP}9_IپǖmX՝+K\ovnCv̺!CoX챐GeFuTm$e@M/5cOZ0=Z\\V&,{miθx'tv\gͧھT}o $6=Tnh0D0OTMmWB.W4!ؘi?r;j3⾞x;/_e/}ɇr U{?|87"#񧒲Y/_g炇Ggm{NNJx4%6D$M0\c(lX>W=1y[CiTcww9J%F؊X}b)P86 փD=q#Fe'1s0c%s}.vg 'g7[XʎW-z態#FRXv#]YIi}3h~CBյj`ڳE7Erl }x,1Z\'L YS|F%?>-Uai&s-Y9V͒ye,yz{-_ R׿)(az9_R&}" ZW$W,007D%i.N'H-̂*DGʦ YC zQ/su uר>UH_x#RG UIR%_K"v"_ZA&Z31-﹗wH%F,TH=|݋KTbVVS0(^ Nh; E@FW[! Ou 5x +şdMbײ ٰ)ƒVh>Îh<+鮹eP)x5XlZHNMdDޥXn}+8w;N{ ojw͆ wSQ nFޗ2^Õ+ðj^KD1c޴gWڼuN\3({# h|b{(`DMNYuwCBtA4pfTiseJ{"D%h F?V%31brfBpxނ睬68"F,+^}<# dyfr5+f)݊CA. _l|5+_ )9" 4vJ,]JaoVV=`uɦne:XRTQo iH`tٵ>\.9xWp< 7*!gLmzT'˸̇a֪{G su. Ŧ,U֓ OrV|k*XVY XwZ}yhcGl}[NUChT}|ܖreqԲ[LWlzwS:R=f]cӲZ4r|b*i}Qsge\iy@F4W+#˙5"u^7IFqQ_*d$fS-Gy.'ZP'^?u |/k"|Swﬡ5UBHf]TlǸ"Sg-?'^Jv*_kIBE1)pZBֶS oh1QfZٙ* o/:V1׶ܹ)S#Dn)rJ&7Y^|6&3ܟk1*jZ*y܌haދ^B- ђs|~OL?X};w=C*3G!q|*J=)3ClF8S2kq6ǦӁr Uהtg67i Y)#wnL#%ц %F/!`X{Lr$Z_#4.Cӓ;~/,\B3R^RUfVIntguzeT3;-F/0վ<荓w?c]r|?!4‚KOl(;FaO!Qe(+>i8!;P>Gq%8-V'CTm ]ft'+W^ZSnĢV $uo eܪ2:mX*{{ԋYl"M;j_ ïLFOx5 />,^-ZyX#F͂}Mfo#dWQ j6{TѾ;m)3;(/?^I r^ܩeo>7\ĠNp#%=d1z Xvwrե'K5~ܗ-]}7pGl+)HhCy̥޷~Шt|1uAѬQ m5ijD bL2N?;d=N籗HKuNSKܑP*).e?tCie݇~硱tĦt e|"rɮ~ԭ_*D͟#+}0 Uՠk-0NYZC; GFCt/0diĘõ:,hP$.H\~Vum5Qг[)S=VT`Y%5qגa`H$i"\k^]ZADZd$꣹7{fD8>eb&]Wc@62}cbUe{tr; ;b%^.g樄0#n"bM`8lcT\5smUR 7bU;ԙ3|dm^/xuuW4KQP]psbf+r k~H)>jYY1(Hj,̎m-KVƮxzŎdɤcgL2WN0xN[/pM, ݲRZAM?b:oI4([6v3T46_W[0+|㮹Wqy-:e5B9;ξ_)$BfHeg'Ug+MXL ZFd2#/R]kcL X%ldFr0UKl n*(iJ-O4$-VY 2ڢ3r3j@̇8(;h.O`rrMƝ._CT^D&9q($Q6_k6lo,0 endstream endobj 147 0 obj << /Type /FontDescriptor /FontName /QPOGGI+CMBX10 /Flags 4 /FontBBox [-301 -250 1164 946] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/N/a/c/colon/d/e/eight/exclam/fi/g/h/i/l/n/o/parenleft/parenright/period/r/s/t/v/w/y/zero) /FontFile 146 0 R >> endobj 148 0 obj << /Length1 1375 /Length2 7629 /Length3 0 /Length 8431 /Filter /FlateDecode >> stream xڭu\ݶA[iFai.a IA@:P:{ο3wg12Kk/=GhR1#_@W6V+4:ACi_+Ab@PfcX܄{c&?q7oF/Dl8*T23X؞De|e:ew2L_]AW& h(|TW;޴nm|A=Z0Ce(!rV?Hš2U3g?(*UQ;Ⱦ&U _i;I a] Mp$a)C񶻮L&@ w9ēB>FzZ|c;JQ&CieD,}YW^4. }hT©a-9GA(1ER?,C~c_{ݥ{US̄sвt~q#vm*.ïgٹj{yX!7[yK6m_^O`/"wp y ے|KHy<")ho K/ly^Ѳ4H`f=,{ (G6˿ʜ?v@ٷT[zM¿Q#6 #^CS_kn޺e!4g,{};p|ۋ}^ex=>jnbp&9+|Y켖AWQ˴q 3 EyK͜oȬ]~3qR~낯Q:ܵ.t[i$fČOs]jj4KlsGR&nn 2 NQ)^b]$H7Y¡:fnmywP9葵gr^{{`Bˇ>>3{WmV|91U]QDp"k-d}Fˊ{-)V 0P^+m~ [F~9vg UI}ƞ{tKwSHWm_٬'iuIҤEzl9t6dڝs،QvlXa "Vp&Ñ [e=W~?ff -3SPl/^}?A|2ܕ fNjOqV>KK:1t_9p{}&MW I5oX)yO,w/ƜUo UbVj># TMR& (tP^ٜ1a!U TY/{Qu*egg)2)ҝ{z1 7n6$Fbmyi:U)z.QBCA='Z\s2М3E#XLTàԋV|H^8q_?:wMt4<&[>94 %M![7eu8=+g@U^=7E*x)zt1]ӏ%nT;!JDi K[yr҃[kGЀHfQ{Rl>>Jrw?fw7 ::UXS_;bYa#9ܡ;C\u ߴb%.)ڙn'(ܳ,wY=l0!X|t́ i}]#4A]@GE([NNN.rFhYdhC?Ly׮ikvՌu#0 ,asAe]yeX+d:`;pZNWy;c7 R I=Gmah_o1|q ̋:`dgNWd] V+v7XZ 8:7H ϩo*C/Qntiz \sDo-Ne#<;aV2F{Z.^! y% \ċ wc::e<+u\|({U-7L"'ЈΊ Æwd,iZ5b);)L;HkW?hj1@鷻r֖#0HrL`S:Y\wyR ɻH0kɞk XA(ZvԌJ2Z@Xn3EmWrKcK:ӆ˦`PVxTlU WPVOK;EL$ QrR]H[./fC$E O 93b6,<0GOG 'tKJj*uY4"atfqkD!b2:}X`{`e{hK? 3RSh`;i9V-tiuِAVtu,üob@M&':ߔuZSqlI&HW(oDWl|^zzV_zS6s3E.M ]Nx :vUDtRۥD?^A@َ<$񺎇"X3ڟd!WSF->CYQ C)[= 6wA5`Vq-Ձp!nNmAxԪd͵"a'/ٓMa35Gp9*8#-hI(>WIE3(ez?+sb񸨋&#^oNL1XWH(AGIs+.wkBcq#dѝs7Ppco5KlsIPׁБXE^y|v9ġm;vG=?uEy ,?z :j[AS[zJ3LӋUR21sb_m8+H-\UreiTx57:n琌ȳRk#fͺ6 ^[i{XQ<^ }<CoaQFC-v?ccnOBV<^/ڳ>B#9#(%o+>wv)) iv<0ܠ:"Hv 5I Q+]sCYW%#O$jIavI4- Cx l=mPM碠7F^a6PI!H!b2^H_]#1#Gֶ[RȋzD.uR(:$x鱯tvfǐ*w0]W"{CcoHʭ":3^My1DBS/aGo_$4Ώ VTf};6jg80\7>@-.O ݟjg7lʅvUqFcx+WNZaem[fYk !oy NUP`MSׯۭP 0 Mg 7)@}aDa seVZMx=vI\ eLB]vJhd\Lҹ|n~h'>5/۠ԢAx Ra׶Uߒp|Q49,p^4+ I[j $eK$^Ľ&#%TȌh@=V.*`&J]yL4l=h0,iZ勢ܛ֙#g[o[ -NHx`JT=#씪#`P~nM# *g:y)=6&#f W/A.:5b"|o>G* -覿lC{֎52TX$ %QDժL ԀTYLjxϰ2Q+Qw?S0%z\Lt9<fZx V@'{?6" endstream endobj 149 0 obj << /Type /FontDescriptor /FontName /HIBXFY+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/C/H/I/M/N/O/R/S/T/a/b/c/d/e/eight/f/fi/five/four/g/h/i/k/l/m/n/o/one/p/period/r/s/seven/six/t/three/two/u/v/w/x/y) /FontFile 148 0 R >> endobj 150 0 obj << /Length1 821 /Length2 1985 /Length3 0 /Length 2549 /Filter /FlateDecode >> stream xڭRy8{jl^dcvd2(dc F0%K&ei&KY:DMNFu~w?u? Xߝ5"` T047* 99C2MőT6҂4O@M"am58H0$q^T@I'`8 ^XK6$ K TxzRd?  q*AC&DN%SXEcˢ;ܱ 5 r0 @vwBWMK |hT,0'cğv HM18>Tp#\ Gxh<[Jm9;˳glsg>w1oʆ UUTU,"Y;:8@@.XA`X!*D`%xȠe"DXFo@0!(TY:@'c`@ 5e4!Cd,{s|86,4<@Dy_) =}SIEyCoȡ46|ADf5 N8%.iʸv驸5>2둳kVl=텙n,[)=&ѯzB\ltT|Fݤ_`ZU/:oq(8R Ώ\&)Z+G3~֘v^L| =qAd]CrgmhsF3 3~2bjzgħjy+Q@:`vyY93:"S>"YycwuKgc%iv@$,Cjve6=of"Deew=z\y {(T}rȯoKw7@/n<Վq>稯 7#>ů6* 5}eNDG\)ڕ򼼴J׷TjѷO h8B|*7fq9q/a6~+a֯Z:N0Dqz3(CKUM RE|F^g*,ᤄwƞD)?Q94'R:*7Gj~c)ז"Ook{34ЬgOJ 4l8!;?"jkA_n)Ex1q[}a)ȻuW(\C;Q bmJlԥ̓Ǹ冓2_8dGD}گ7jRjfd_BPw MocW?F0Gf6qݚ7un[Y]Q(> endobj 152 0 obj << /Length1 789 /Length2 1257 /Length3 0 /Length 1806 /Filter /FlateDecode >> stream xڭRiTU[Z@^H" a2, /闄@mKAIPEFj@|"h) >*/`}]}9g}w߃ s{!`8" x2D D 'w$ T hd BQ*KH[O fɒ$BM6Bl$Iw>/`H !)"ǖPF4\!pzskDeT(Nf9Cd /;:K DR !Jj8^𤂕U_ c |`8{'fd''a'./qToY>cwTݟ_\ d`Ih9\c“h@ j!]1 f 9<8BV*JD D9 @2b<J4Wƙt"%S-XK2B!|i/Fx>$/P&:D '8:'2!l)@dy4}ȹ<$(Ur0)pYWaeᄦar R.S'O1^d*[}3[1wq*$3 qH$zs+).1 J/ɿ79hq4EX<[U?Z] :KR+׈JkfӪۃ$}n;zxi(T9F6VD4wV6t۫ٻ5KIl o]5=:D=8Z 7] MW\Ɋ7Nwo5*u_qk!hDk6yzLƽgon0Ж6UQgŠ>?di<}8~m"Q6VH-P>ʨ&Y^oj^jrcp:dq=~t]ON3Tx-mG <.jY|{R-{߻gzY=f686PK{o??q5-v4JXJշ1-7.}RJ7e}Wgkk>.~8OuD|*uG? س[YY\||*33rD^ۦ{%f0pS- !j# w=bP-ڱ|Aky[4yRJ%]rh/A⩏3a{N Ү],dWO&+95JqtጢG9 !X֝2+CaNdN^a endstream endobj 153 0 obj << /Type /FontDescriptor /FontName /ZBVZQH+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/comma/greater/less) /FontFile 152 0 R >> endobj 154 0 obj << /Length1 749 /Length2 1011 /Length3 0 /Length 1533 /Filter /FlateDecode >> stream xڭ{4iKt1r0ΰ둦K1Hy2rnb YbH* i.۲*ZKtVyy~>Ɔ^,F\pLbAm#ĒF#;H$Alɴۥ`ih6 +[d (*&"""a IB! 硈$X!@` N0ʓ`$HY$76, 2:04$c(#|u'N,Bs@0\*ADÈ[(̳݃ N$屰,[(-}TF"*>$#s}qP{^f;7PLW\MZHOhtBH|_V rx8b!a "+KH$@" `*%@ 4t@ ql5 K&d4ab#IE")D_j>J xU&9\R6.?=Q! vۭlU=F6hCKξu/|Fn%/5tL/dy *5659I}UfÝF=jxM}hͽ Lب,)0֎ dCx(l\5jZ+z7 3%]ur94{3'v/[U}grJ6,494=U`$|zb8ɥX Z?PNwg=қ^ܵ*,Lv ٛWš>ּ;z}<ԺJ$:S7?ǡckbRbv_`K {)zP?DuƆ-{'t-3'I6Ws(9j̬\}|e0XADZϮŃk>Ed>1%V<GF/PaVOT8Hڗ$㵔Rv[Uo=xמĴL 5㡟SK#luN˲|9I_yoftwxnAz*^y= nR;J^!k+΢;[ۮˍTfjן [vhQepACbڣ[#*J Zw}G8M3wf2LTQ%[^ A֛N[^1O]zYܨg:r2ScAN`ÏSOg=?Bo,WRka}URYpd ub1^Y|oە>)ء~Gˮp4_G#:.7d%îUFxliq4C5&3h 8K3>f?$m2"ٕshr4Qz|RZ^+s$'eGܓ^/iu ZlhɦA_cwX=0qж>G$S2'B>$Vތx_̝ƭM%DmVy+taUQR endstream endobj 155 0 obj << /Type /FontDescriptor /FontName /ZPXWMS+CMMI9 /Flags 4 /FontBBox [-29 -250 1075 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 74 /XHeight 431 /CharSet (/slash) /FontFile 154 0 R >> endobj 156 0 obj << /Length1 1963 /Length2 14266 /Length3 0 /Length 15334 /Filter /FlateDecode >> stream xڭeTL;%6wwwwww`=Hp n9y~ k_UUwWu^+ li2 F:!8RRa{# ||bebe#غٛ:() bZ 2@EC3@ h 4cd: &fpH6ld.gÇ(ſdR>DX[p6ՀZ9YZ[F?n}+3K urdl7Tom2@#3'pԷ436m2s3sɛ9-Ko|f֎JnOt^ƏjZYXnpX3k#+!c '^c{ ob !vЋ!N@/_^1% ^}TCeGu?Q]?Q]}SCG=?w?Q]}TWCC^} Ї2՟ dPs@+#}ӿl8cqO_>e?,_e>22cSp'}f)_>a~ /_1vqdfXjmfnGbrl#=hg4,c|xl?sj>98 ,+#3'e_ghß],rZd'WY?8|<@G,1~lOY֏;:rtkGcX2j׿#_.?>2]}l\=h>~aq88+clGf? 4[^14Oi.-.2+=>`)ԲxTʎj^">> Cx s?ԅ}gtVt=[cVPD ¨D@6ZpMQݙ IPs5WR6]]fj]Bɥ"(G#@g~Tɦ'Rc^$!b91@z4;㧛L/pDNڂ^pf;OB/rH&kM_9CIg%ODA_ X #Nݩq#,]kS:F$pgXL|Dm\ޮ#ސD0Ѿ M5HN2̥E>[TAm@B/9cUWyN0fA[}$l#2 ʹWkQg'h,g) btEBVlnbG&Iç5Z+FvaEyfxW wxt)܌YZ77y\dSD#<m`I|ɕ;ܜT>7O؅ɤHm|L?(MfsMoN|Sz(4'y䔔7-ClA8^ElqVnV(:ُsu@t ]0kC>K|)ȡ[tʳ~(HÈSQ4 O=/)!$鵻|^fr*w4ݻ<1^m2R7(oA6yWk2 7d`>Ɉ)'C&{ GkKܷ#Taf`#7G%9z!g7~#ʩs_FkRuK 07 z0YL}YRR<0BN9ڸ>Kb"߼ 0EEZE5eR}Ӕ·XۋZOՐD# Vh~f\D R]\}Æ÷Im7#;%b+0!µ\ y[G]x2ߡ}eYm4\.l~|*DcBȜU9y{hП_y]R97)#GdnE)$""K%Xt7,1atB]TDkqY~Sֆr];∛lt ^` *I2^N.#+2!4ƔW"*_CI.{*(MrE 5M V8N|jcFd,W9M+nh]~$Uej$^/\3P z87xQ}]`T5k͆bW #|{lMPHE+~b ~fѣÙd@2ŠGZgu߳xV8xo.'$74ooTdHHpeVEOq}a:,ldwh~ҥB٨せB3,z55xUkæpH$HWHwp5Q9 Q2/ǧڍ<j{{bQUvbϏikG+++#E[k߬n=o=$ 3歐dT 2vK .qNPN'HVY,Dxj.2T=*I |ۀ M_":ȚlDjwh!SAv);oqv}f=wxե57ym %ޟ1֨= 2 JM͊cKsha;'ۅUnS+_( F<we;ѣG"j| me_@΋v _7uᯇr{}{_P"U:L{PQox!nJh2@B`lkP}c#8q>JN%v]:ry!'SHCh߯S _MaQ?/~4(=c22"Xd|4{,[WǒC2+s ,v#m:r^7ÃK86:4H{rz(4-IrX ~۝AIs? dORPRQAnX1TȶUDBYDw᳖FC%gzBb> r`ZzRp_7&|B_c6cWAȺQo.'^HkgF9r_uP~bLC顭#a$^ .l4Ia\-Ɯqo?7SI61﹫!^ڢVvUs%RlPMdC6(FOi9>~ÅZN? Y0zk;7  S>1;}8QVP.1L8s*~xq< $PV.xǶ {ؐܬ=-k}IgĊ̦A&qE4Stֱ:q{)iK$HXP_k҂l70.i&%$p6*mf(^W5ژN-#{50/ž7T Q Qg,&n( rTZ?arr^a,M|0& %=k#~JfS0!/yYY廵Ƞ>/A{ a2UF)!"qnv0"\BDuONz<#YRiiLOn2B.ǔ4zw<{EFz򎇹D/ʃ;50 J54H`LFgq@:܉Ye'=bЯ\Y,z/wy)H qd<@Td%^"]bgqp&Эq"z-+߃;ρ>VGsf఺ZCJx9XgUi')j@~u~Z5!M D <*Pz}ON퉲ĝ~]lAԒ+ # $;WjʥT Pj2 Gε3%82Af\esO''sΠ"hDD-ƺJrJnv߉'̛ WƇ ޘ>\58q  jF DC'QScJ^ϩ'(grL 2,6o>_^΀h>Am@l5 I{y9I6oQ &6󜰖4DIL͈v62^&g9oWLfbnslC%Da'k3@B2HO+] . {K*UB:R5T=:>;_\G2;/ƦÕڟGPТwd:T爾 > bDVlzݎr~wWhө4hfXm>Yc,0 &%*lXI;3FTr,OT hʖo~=禱h0U/ߖOSTcA{ &3t4W.ɡnlMZJ r+-eAD|p . i1X%Pؼt~_ 9«1rEGd|.9/8ydhN5cﶏHW6. T w#(5ڸ)P]l{T#EP3)Gy=LW7 ĝ$m+>rۘlƘ]0D14È3Lv[xqRgkHqqK2K߬;1.,8)6c3G"O\* AՈ;ZYC-pB]K#(I"ʰ3 >yqDJvj|m43{;I&^O8Dq&;E֣xpPUw,& V+Mx!%Y}UNL$R|W3bv1U~r&HLQU!1jk:^(j siV?Z)@v1/V)o? \ 30yX O-:4h8ģqG Fy!~L}\h1Si 7ULhyk5tNbshzU[}i]"λz`֟OC2% FE;3>'ؗڅDz *}_^LM3&+a,МF6dvMOL1ӄx۴YKK%X;pX3 o#83%Bj轡wrc3pz'#lEksMW.b#o8~exnKx68$[Q~Z249FV`oi3iErU z ؼ? egH`=$yȾDzűhU/({  (\P65{3~S:;(O jFiInbg!65ry$6ҰMaj~;TݒI%@dd~heظiư] ga%b~߷´D+#`Ln}Ѵ2öa`VIiP2'>:N~@ P?g1A] K%*h~ɀ>|k3|LD4%Xrӏ{ t:!ge=pY/Xes~.JE;yOF?7mLz1Ή[07rڼ@aS4!%GY)oXs]ѣzQ:i՛лbE{4zWѮc*M0Q*J`4M%型Sߊ|$y§2=y9%J5ds ]-&fof3 nl?$6zy6 kLE?D[{TA n=R4 r :_*mxV{V~qg7IUu ~w8y=後n3{3LZ4*,ٷن٭RPX>oYD[tΡ/II,3Y r%h[_,)͋GscwlAeXJ{qR22eyI#(@,9|P ,ǡ}31sˎ!/7x0L r{xEo J3YrWy=GY&Mî-I\ s#T &,%E?zGӱ^ vd9*)ȏC Xd= v8ܗi_hdm2y]`!%L7M8|2]"LOԄ]a0'O66DD^3 \_BR8o\+=y7 r)!TsLH |IsDۊ/ؠNV}=QM"Eߦ"ya إ{ Wr%*+-ܟ内T8 Vۀxۺ 6u[,VJ}'H^{dl$#C V"fSPHNmضp>Vrc8CY;4S1i=b]S9(#8TVM|ET: :6em)q_jm{_ioQw12mm%nrm'' PltظLBU{g@jeiyAjCb'eT*vGh^(pՠ2"naidZ *.B<"r'&>^Yt"B{B% '`g%Wڨ|Y p$ .͜`]CEPezW=bCjgǩQ.f ΏE U2XWm`e)vjY]Hj"q M7CBYtW ȿ {d]jaH NsxiYk4Z6͗R8;O։ xVi0&n[DQwڟs#_O_ZN o `g?-l Lԕe+LH=# i0t?W&&)IpZ'{!g\MzЉieasإ LB|J.\W?+g2P9ΡP!rk=qwh[ӥ.|]H`wx:taɹޞ׽lOA^dl~ςYnl~. KXB祻 (|v[w7a|JR|,;uG5Ư?I@bPʒjOvdm*T9*K0OnqA/;2 7&hq.xp8?%*Ő"ݭ ~EJS8)}BZEZd?(0u3x'_̊\΂>X(xV@8KD+!ʇw('B WrMwӦ2!( Yx\GUR},}>;>Lx$;~TDC}IhU=~fGܲ!th2ɗEƾ'y|kN,ߓ,/7nf"4=_5pDyE-3G 42Bfg>(|x΄Y1SJ =3υH8dQ Q Ӻ:/]]'q[V~Sv%AC'qe6{\.s Nx1l*w7 */ZldL"+f 4'&hո$]Hbx$T7AAJ,I_n xKDgKR&cPS=2Uw!q]ëH~ "Cٵ\a:/O\"UR GDE &jG9/.S':f\p#URZtP\sbB6 Z$4 #Ge\ƔKwe+#~,Ge>BpEb7wzF5IMtu{#@l=La#cb8+ypjfpUnt+{ҝ0׻7GoXBBwDcl6}*dzn(Y~bna#FћNx%1?Ճed nFVDY\$egK: q W>9u.l]83E ,7uKΡ]D\ak2DAWi3J}X!;U7$%:'נc翋`C"I  +n|•u\@u᧋cY# Oֿvą~_Uˬ*gH ~ua:EZCgdh$YdLC /ik]8͹uw Qrה%B)%T>. S7#gq+uKHE s3~9IF<n!ubCcի[>KlӦsߪXLrKRw~wm=:@m<kٽחVjE s\oep6b}mfƀjli$1݆*r\f ƥ>#Ϙ1ADmD ?LAgE< endstream endobj 157 0 obj << /Type /FontDescriptor /FontName /TWCUGQ+CMR10 /Flags 4 /FontBBox [-251 -250 1009 969] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/U/V/W/X/a/b/c/colon/comma/d/e/eight/emdash/endash/equal/exclam/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/quotedblleft/quotedblright/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 156 0 R >> endobj 158 0 obj << /Length1 960 /Length2 3141 /Length3 0 /Length 3765 /Filter /FlateDecode >> stream xڭy<}dzeo i flɾ3 cYl1*2!1 C1*BYS!%"g}us99v:>سC, QzE搖!' !`SWRUC9=lP8GN^"p(o8t o8zp@l<Q@78Ea8@ `X@g؇O*M'&Ot>X :A 9@Xz/? h%(q|_' t~ K0BE:82_0(oaEe5:W nVpvPz7Boz(b+)P @QUM/Fg@!9 zYdt}Z>l{*^YDvI ,1HNÕ !^YT1, ͘E(UD{Q;-7W_|ȷ>o?:&51L0 [uLI–/3(A9~kҧ8Rd˔q_\iP 4hn+#UKaPI8ufUFבiw%]u2S"󝃬Z,h*kU*]5{M\0TrljKǒ{M znlӐxuo|o‡ 1Vr| JRY83A _JOdSUvoq3U˷W0Wi]&'aXPp-qB(9S<P_lXҤ ]UTۜxc/b=*`ٔ8yfc/ ΪD 6ͳB/e1tsr45ᱵsL,swB->X\>U7Q]vNqPݡ+J9-˲Xes*ؚS tw=Vr]a`ш>rLUj&蔖{$*Gjۓ <%~qJ:cA~q_`0r!/>Vэ &;i!o-936n.:%emFrco4]CD mA\֝7n^U][Se2'iVFUNLs& U^ :![Ԗ&{yԝvWv. k*OOjP;?@Mq8CfI,5 2uub߱iOJjs4PE Ƶ3K)F"}ݵ^l=Z_ϛ*k͈/3}s]ҎBOJͮyBWRrϥ5~5( Su~oG^Ñvf#IC% v#\.ˣB%vN}<8 1O-M;J4#4!Oeb^;` ޑAl@:n{G4:$!iYˡm)|m%8z|Gpυ6m1UB̽RzCl"Fx7c~2uƱ3Jif3׮F߼L=ٟ$2mVY_{{s-$`TGr0ޜ:2N2v0f׆ΦP}nǯMa|7?pq}r:ES1~I oŴHdiKC+zein}DdaHfˆmӚɋ"\6#DYb0Y\lWoG&T,v)-a|JT/Li>P;8sϡ\#pݞt!KJj;l#pL-ZfLF|uٻx wL<5Pxcܖ(|)^{/%sSy:嬬ћ?w^ X\0T~Fs^)oշ-ɉIS!hi}H|Ή\ VϜe6$ocF|%[ q0OWi8Q. s5̲0S `s6h9OS>)5n*ola;3e gn\8ySW2ΦK60``=_q\UŹX_#/d 8opsƑ3-Oc*1TJMsE`%Ŋ-uE(W֝=eP 4r<2)=j|{FWA(-9 U|T6.^o_^ݣڏ{(z/7*O_hܓ}ث]"!"YZKN>^(0\95|O2Q KHd!: |BmɆOb:JArE+9cϪJʀqe]Wh7ljBK9E9z,:vvu)sJ5qE\4]f/>1v =W2#.ә|> endobj 160 0 obj << /Length1 838 /Length2 2342 /Length3 0 /Length 2908 /Filter /FlateDecode >> stream xڭRy8F9e]Z lN,ceYcf%h %OEBȞ%e"ː3|\?<~~ IT*B0v@  5h*L:BGjB[W &:0m0"<MTHdk`T*`D /0@*x }$|ې%ɇ h %m M*lX2@nCfN~7 &lmF db@0d,H!Juz`]K*| 2ÇX;<|Є G$a5I'ѳCIT'zfCnjjj6,Sœ )4¾ 6"< `(0\DL2N&w.@ !!ߠd JA:19hjHMa)Dq>xr@0@zX"L;r+r>dSq [G~+<!Tff%:RV$k2cIׯiVgڇK3Z]#2N@NCA0+(Ap`ob"Vz@ ;7}sG."Z6ݳQ ^No -Pp+7SuakAV`Usrv}+ap2v0H\ ?.ҕ+=g8ޭVxy,P{@>H7_U6VYlmu.YƸԶrpyGܖ%,ÊdS#3lT32Yl-E('͎_O,eP 2@(Hl^"b:gm|WPVjiJ z1.x=ɒ%? mʌG{o-EwG49lT՛AKN ;èK:P -KS=P1s]ow5<ePԋB&03Egt&3*cN$5PmSrO˞F;d:CX tPmu[WCLXRXQ"R:!,捉g prq$ h^KjE'rD2pG.Cm|GcY s;#~SJ/;^Я}_wyI}'˲3O:+„.-ZrqmʺAԳv؝f8,e7hU;3B+즻ȄʄxɌ!Bn-bgzag2~H{KK|}&;w7$RCnv%ؔp05囕ngB$?>IsL1M?Y%‚[>T_2 4mC6)J9[僸֐WXU[ʗCV{S)h$W {KG>:&=I&鵖HCsE#[e~DCk>meQWӤSwq,uF23;9OXKV8JK14VbO/b/7e1 uwXeBEp˱EvhR_HZ$zPuZ-_m.J|z>H|bp^:/6_Bc.Ceu3b'?Mr"ޯ-- hRCF5m.8HfN.`':sO-ړ'E!J 6NW7O!wOnjHznd(yߵ>*b7S4TBe3홎̖7Mݏ{XE%bYG8jz%˖º4WǼUQ{:uIYƺ=Ή,T&! y[Tƛk@ ˟ywda\%+ ] *z% RwT4R%o_SwXAMM ę >ui2cIߪ( y{jھf΅+C6y+,dX'Hq< ҫ/5 7,kAl?M@%R.;wvsصNg> endobj 162 0 obj << /Length1 903 /Length2 2776 /Length3 0 /Length 3388 /Filter /FlateDecode >> stream xڭRgXSifFT"x5!t^R#EBrB)B ұH`AAzUI. H.E Rn;w9k׻޽_1ak[9=4&ry``a @ H % dPC/@T45&1K!a0d@@HÃ$,A,d z 8Ăd<6;$(y&@adD@' IjH)E$( D3)Xg$~77,W(['} @w#3GO o QX28PGCg'QF` d;₩ߵ?0Ά \!T!H" K>eA"!(LwAE@(P`0S*dj @I&/SEPN@T CQ@/BP ` 0u@D  _ =T&S PI?>18T A *+!2D Ϙ0K/H!"R3VUܓpI{U'Y7;=|i'=Q[:ɠ=+/.1^K=x01Li3݂2+5zjˊ2՛'٭ۖYK-пir hd-Wa,~<=5px ⋀cY S\j:k3pEMزA <額~b&sL+ko#!L&nt]EοWl00nd"y|[¥(5!v鏫(G]Qe.\Un9hXOm]W{)n~i1ˊ;lGǟj"{;X*}ll?ً##_MqWkOn|ٸWKlgz+ /P=CJRۻ)-JR BJ~й|SQn;d"D2+'pNx~܋\fឿu}9<5 R0M m)ƝNƈi~n=b\3Jƪk}x1$-^N1܊_Nho& 9n6,_e"u0'.fu2ؑt`5x #/5{G3 \ r=a\_H-`P"YQb>rg #2OП6oJM7>4kgdg $m"g9AUƻMU:EM'};N<ކ| qLJtoOt-Գٺl\OZVV{Qgp/Aɨ t4 qѼJy)!M>&iJg얏9uf׍mMqb`n{ޔu[oD}Btfx^DŽdOr4 ?[8p}?YV)ڢhQ~2稕'v%Ⓐ+( A!ۉG,F:]t/ﶛ\9zq=vg.ʙ/RaRO&BvU{)Ok WUcLοXߗvN3b}xCfC9hl9>ӽo:V<+OKDRtL# Q;p6S\}K|[YG,.Ru<K]x ճٵ\#.1 WW>\aZwi?=_,;(.4N뜕ѽWrU]筃'2֪g򴚿w!~edO⮩6ue;y![Frݦkch "߈~y ̜GMYdu~zZ3gp"'];T`5gZ;羱>5}}}#뮿s ÊMRvaIu+Wم,ۡR_J|5f@pK\}L DnVnlܵ0q|u?}Nݵ҉KUXmIq5hN&,|S¸܂7aL>pEx|<'>lŒWya%lZK%Dec&[NMO索Wʣ)-]b lb!{}xuzC[νcg"7t`psߘ:_op|\u)oJMsxћ8iz_nʣKpijڕ AJ6G8EvOM9^N!KsxqZv7l^ dݨY_. ̪c2,3ݒVe&I[7j Fny Br`$)/5:>2c#YɘgYeMoޒJǥ۞uѕVWځ[cOgCy}k2/(6˕gĹ,k endstream endobj 163 0 obj << /Type /FontDescriptor /FontName /VDRGYX+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/A/eight/five/four/nine/one/seven/six/three/two/zero) /FontFile 162 0 R >> endobj 164 0 obj << /Length1 1178 /Length2 5547 /Length3 0 /Length 6264 /Filter /FlateDecode >> stream xڭgX˶AJf@ztAz$ԐDEޥtޫtJbHs>ߟf͛5V]" e WE!=@ i$( PN( . II@a H\ZTJ,*о'G 2_I@EW8jA=vPs{ _3܁pw8 @@壎G%5 D;ǸcXI VB"|0=@H] 5gqUOBWyW8P08TcԴ0'OF=';Eאa"ÑJ`o!##-C=O. aOѿrf h.,(, &bYcH; m8@}ؾ:!ap +$Dy`[GaPHIR (džIlP?$gru  !("@!?(%ĵ(!㟵XE;‘2cN+r ׫c] +z!Vgmq,au헁vkUq3k⎀;^K kuXW?B>7w))|D"`ῶT(?v 6 p07 qN}QAX)/C]vuD Il,.pRYYmMͻzêbR.7l670|K@7N/ $wgrl\`i7zߞ".a0 }^)ʪOVR,tћ"!q4s(Q=ٓ,('&Ү*/^q~(yUW[t$D?u ?ҍ{QtoP\Ct[d47EI^˝E).-"=SY jF /ď_U%H)BX Q3꿫pfX֖VK:A k\Ye.}wFdDuP3-FY%" k>;}~/UmI]^SuVt*(<_X ͘%ROݥ'aNn3gHO(:$#EOSN}47r cfE i6w4Dz!Z⺡YĞ Po/VuA};,C*RID4~F]N˙ 9iK3ܾ@9g׉`ANR~=a 3Ff=+1|(aRT=ܵAP*R(P7x4-7e|d~S]8Vnj͡CG ׋$DԼ77ڔH*-#y\ Ҷo+΍`d>_ſZ)65k+tez>q >/yE㉣W[/@!¦r%mz%I`H)<#Q8䜜l'Й*I x 1HNB9qۥ^Vٚ7;ruρB7#Q_OL>ʩ?)}?W)՛/5 1 w0=?a_89plĔ@&<{(cLzd Q~)aH<ǣ~Eя7 .S[r)N/A}d}jLU)ҳOS' &!\rqj윭pMK&6͑,Ұc'c L"T:+15V}ί .􍸎 b ""Cٺ6t}1̙,<2Vg4빳<I X@}XSi+ş `s-4-GB7vUa̍&|0/*;G]S  p޲6|!(܄ٕ_`cLg 'm!^_߸{A}_ۤ!@G9߰q8 whbI"i:.-+oMNU-_~l.c9zO&bx2Yte4{_֢5 UKzl4w_-$ecCymK\jg|N*\?.%%"f[9֬%dwoq?Щz1\M#wۈ$Pt}!:{rcE{In3y*?Azč܀یdQfuVhOzOW֢o?~MDgyolx1"wY(&hM 92b=VmNW`[ XBi\N몜wC,اݏ~^CU:H(X t귁J_ާWb3G1qOePeJ( l|YlJMw7]f+üHT2{KexM[fUpوIn8x5ͷ,m3ɴ5u'/Fp~aC#Vb{,lCKOY(u-n{"v$76Z|D ]ă2 9ooTF7KMC#?wVzɥ)2o@s1B7:ب7ٲ0w8PeQ#1p'{,Sp$Nt5to\SI>^z;J ל4{b"DZPGKap\kh*Y.Ng;/=آ4W?$~8IVi 8p=b j2"~Ǿ3ct5[޼a%1gFNMg>@7yp]][+Cɩ@.-|~}t#|ձ/\,NlsRYAe&n29V6=>7m|zZX֯%\EoCF5=i%ĥ՜؋˖1gppFk-HoEZU}#kh N̜yo葟e-OEt'V 9Cec\C HR%_3)uF,IUېU9qXU-7$cAm c:"Esz?y7?`OeSL0Sl{-*b0L&mJͺNCt&oLjrS8f"i]BϬ !Yp?n=#j.e(ͽ8*}љctL7h)YVa>HJ0Nl:/_XGnBViE/פX֢~/ha:HyNzZ9 J&c]nfGc e}]hC8Lѻ,r ŹZvawJPQwɜD#2NIN@D>;wԕ:sjA/1A&W4z{r![,$j\%S{ـz;%m-Ӭf9(/)7R޷Ȅ.ZjKƴ똈υ/vC#>FfghlUdps&Yˠ8Wdjndeiy{D֞F' +Ȋ~~c |q4K$GtY QZnpn{l ގDְ5xLbI#_GaMɼ1`RQKtnt}]Ee' endstream endobj 165 0 obj << /Type /FontDescriptor /FontName /VVMUQT+CMR9 /Flags 4 /FontBBox [-39 -250 1036 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/C/T/a/b/c/comma/d/e/f/fl/g/h/hyphen/i/k/l/m/n/o/p/period/r/s/slash/t/u/v/w/x/y) /FontFile 164 0 R >> endobj 166 0 obj << /Length1 1134 /Length2 4007 /Length3 0 /Length 4691 /Filter /FlateDecode >> stream xڭgTSkA7*n@ !b;T (-  Л {" UPF#k5gֻ HE,utWy GbA=cEF7sZ( ^ԿYC&P!(T $|0p,!8 ,( A qC@aHWJH `GP+,ׅ`D$@! arj$ H C{X!Ib]0 @gyE$؜Aq:$Ae@0g`=" | w g0%$x?Hxm!gv , "Pܤ q);pH JXH+Ni `"([U>ueFi`=X,1:d$&.'au{7|b.8/$W~ORw_Y'8ٝ(fK-~yE\D&e0 C$^p`uQ.mD/.OH{_1sbF= , -իZ[_b *|/[5A$:?uSQ.s]mTo1Vqࠚ%'ERn{O*->.K z$*!ƁAr-p˞EciSG0=v#*ޠWI>I*q~.Ca_*S#uxw {"[ldnS6~bEY{9KԉΛrw^MRmv||X߷AKmmwffF1 40ưǾyVL]MswLyN!&j}~lť>"v_zSY_/,C0oNDMD6,>v:">DT\RgT <Ԯ6HffXKٵ5qTs2 F (~hC4aLlHe>ۨ4x -̬μV*jkSN/N DijX DLD+aT{Oxt1W+:JD":R:T(tRɩ6.r>lPe<[mZbPX8$skiDm<)pўQ(]Fj5H:&PHs,ELf~QBONxtiΥBIYZ<+0rȝ&/8SU9SƁѥ"nư-oK)/ Dzb N*ޑX1,6-^驧gI*'G>Y4Ă_&O9)c$pp8'.mxRNsl&1;'cJ_=:m:œ{4!Oj!#}U[ag\5ȫ^-Jo(IQ}ݘϚ… ̯a!шqD򛳊ȰXe\zGy$n-ٖu3sӘ}Pe4 Aکr+L J[☈3eUzרn޳Ob=y_W,$,I]1Vl"ՈbdpYn$^KoR>|FfˁM %gDj֬3Eȅ& xPJ1,.KH];V4`)>szr__Nye9sDO΅8 }mX RGV)wfO+1Djg38 -l9-$Rl FKݘpo[ZΡa@=$hZW3 ]ydF!bl]A#-P(7q.WqoӢ0 K?E7ME|NO7.8 yqz=tt,'ǶsD2rUZUw{h8k `RLYzWG*{N L [j%2 *hv$U-[|a'Z+ԡkGQϪz>M3C,UJw62 }ϡRVTEr7] ݊q~x7|c/Y}" ](> }VzV(#'VupHgfj.6vs&n{ naUm|҇@^k>*W|65 ѝ6.!t惀ۯ 3qtCJ%=ж>؜*j%i t΀hу(@S߾󲘿zZb(~@͑%'ĢVɧ:ezvIP9,x3䅋r0oKeu6[[wWs.pk8gۇ6J!ҏSZ2?3mwԱ~)Ew%W'cBC{Δ>~`gz'W'.}voeN5ɦaK lyÏ: dq'@,h sz#d1)'9R,)]kTPCSGT 9o$BA%UÐ〆%㍖e5`f:['W"'n+j].r endstream endobj 167 0 obj << /Type /FontDescriptor /FontName /UZFVQY+CMSS10 /Flags 4 /FontBBox [-61 -250 999 759] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle 0 /StemV 78 /XHeight 444 /CharSet (/B/E/G/L/O/Q/T/a/b/c/d/e/g/h/i/l/m/n/o/p/q/r/s/t/u/x/y/z) /FontFile 166 0 R >> endobj 168 0 obj << /Length1 842 /Length2 1828 /Length3 0 /Length 2402 /Filter /FlateDecode >> stream xڭ{<)vHSkG.53>j\fE:DBc͘1q~La5$Rn!ɭUDܩrHKj7mk999G]B> bs :;c Jn\:Ķ$sAccdA6105 ȟϡZ+"9t # KTBfr(dN+/'0T t }lz>6  A_S 'Pd D D@L;2k'L_ 9sDJb}%3<ۗ _B@R\FfqMބhpjҁLgsI|ˮWEy6J[#5bS *-: >@p|6D0My9FW %ABE[AWB_@MQG4ePt.h uDb*{V/ 5:XmH0Flitz@R`O I4؂H+aɟ}+RnusZymC7ܖ 6KoS`bMcs?m^@X{a+n9 =)Mt%iBj@EGpn%.憆\@A^`<`{T$#n}9&H~YOR^!T@玘I\BWȖ9,>-NWO^eNՂ8zrؤl:6-I{=W}wjF!UW*l\-K6/Ek" w:9|+MR3 i--~_Ob v ];z'_pݕ}yxhשW Tu5zh;6=QE>nX3il3_1fyJ^~#rgͧ%K.*IT;f;hW7L A s=c"{ [_e-v%P$[i]ǫ@@:v[2jGJnuFz#7%k ;`Y#R>;djFRD36Xtx$/ݳ4q87ӉrxLsCgW KDtZ٪%w2Y1F.ATE7" D/_Op̉t17$5Kn_^u+gUz t?{ؚm> kJZ* X&0'ؑiVHGN'^#\8Ħ;PzwΡC;hPUm" G]#hm&Ejx?jޱNn(\Tn`Z05Ҋ@,VV=1G^w~x)WsAmdu-OqGxWHԁE3cpak{6 xD L$udG B3j<LxL^#GH/#Ž&#] <9MhrFQv9-P _(MTmKRJkk$W=n6h010)՗^CQ%V.6̶p2aC 9!9g)VBF/dno srKg-M\:=8'jo5j&V\ֱ"̌S?srΆ$ԱawᇮO(/uղEwڷKU[M2_nQc*ȯEQ_y]$#d*1z+nF|\{n+4-LiyRfDbfIT#* (dQN^^!ΓԶ L@p^QCBw/d&_f6H@B\Lc[G_i^f|ӐsvbQ>;{@z^4˟=VZS:}ZA`"HU1ݞ#׺9 %-JNȴK/BBigGyGQUSvK~1iw&d 果1it{[D\dSoEt~e30FVd8۴'"dgub>_8B"{3 endstream endobj 169 0 obj << /Type /FontDescriptor /FontName /CVHMWK+CMSS17 /Flags 4 /FontBBox [-58 -250 939 758] /Ascent 694 /CapHeight 694 /Descent -195 /ItalicAngle 0 /StemV 76 /XHeight 430 /CharSet (/a/b/e/l/o/p/t/y) /FontFile 168 0 R >> endobj 170 0 obj << /Length1 810 /Length2 1729 /Length3 0 /Length 2281 /Filter /FlateDecode >> stream xڭRy<FHHT# f,ccWҘ1,e$LBJRɚ$ I(T *e;t{{?99<(ةaK!ՐH4`heg BTO(d#<DH==$axBkj5C yye}k$OtoЗۃ'vҙDpk4@jHTB""DD 2#{R0+Ri\Q2W>+H![S@ߛc$5wIH}!R+ :?YD{֌'A ً!@ D'xx \d"K[aLTs=gt{ߟ]Ccu%r߯o "sB[Sx2H8 2  `:B\OBO UhmܝkHDHD87 H i%贚&U@(D *$k/ qA AhB8VSj.P5h]^8e/_ey4SblnZ3]/VNevi|'?9!z76,9& l?i:PՔrfEW4pbűZXCO#C}mUBضޔz|N2QPd<6AJoǪG=鍺mP_V'٨#߰(w%A`^?[j/Iͼ9k@Qe;KmD7L1~yԃIK8Dz?B.؞p &a+罞au|zEtCY(hHrs/&[q;|4q8i9Zz԰3Z8ۓ?seZv1i <П}G<*]E70SQw*)-H?H_-ỾGYx')0{竡xs}υe& v:֊wR6px@OnrU˓ dY/-0 {t|M C( ?C 3'ٹ$3Cʶݎy(V.ju˝r%Oww1Fw_r{^|DtYmEssW/Mya٣?82bQZšMQu%!fvDÞAv`Քm7h& ⌄}#צ8~'&a׋q էҤw*n`,B߯ w=0]Fgd_l~ >K"mlB@~Q|r+IRN!Ȟv%zKbtNk eA,'1/;iEb)m@b"'{oOk#_g-R!hb  ڕ7 Ŗ6V$$ȶ:VΡLZ73zw#Ω:1M"ӞJ|o^{N1'f#0Vvf*9JAqGiT7KİOj:p <Ͳl=1 -Bfyը#I=EhGZqˁsDߍ/#> endobj 172 0 obj << /Length1 833 /Length2 1873 /Length3 0 /Length 2434 /Filter /FlateDecode >> stream xڭy<{6ʖ,S7$5f5֫ &3c̘{$tK %YG\21$nH$$(dDn=~saah" 4QY00bM1@L:Qe,Qg|"mQۿ^yhR5 pNjJFw)9 OnV_6 ׀ 7*U;m+S~3nTtWk.sFFsAH#3+r JCns|YəHWڏ: FUs*w~ϟW>!\9gƺ? ET)%Mi7|9a*dURv5'T.IP=jy' NrQ>>5C?tyK2CIFLVƺf-KwUv+NE , }R duoҟy(B1$'%єp,/w[Dn> 727YWL=pxjՕAhnjz{cϾ3A~O - !5On\SVh/:P{YX3A(ƫ/ǣfݝ-bͥf x^sz 'QeEЭ} Y X eJ#i%: sj<)ur\O]b u|NkQϢVkX[G K`ޠGxtݓK**gLxlկhtՙˢ˧agM򀻱q&'+uHmAV[잖|4_Y^BfcfpO{?H V;`Mӗ7G7ꧏM)m] -Ji y7$OVG+1LQtӍf " jnk*{t,KZ3xP8@}[UyOgGrV"_@`L2u)AϮBK0+`xt쵽3G}k J掹|LC)y-O al~+tN%)&{lќ}>J:{UO:bQa gjZ崥듭=}O? ՋTG\Y^DQiїM2 MBfc@*JqYÓŸ yt](IkS1b8<=lxC]z;@qf9M61Wjח.g:,i~فKCRR}ڥsa/}Z-rZg#__5ϔv)tX&Srڦb>Q5Q޹I`ԩ[Bj~{V:_dii\DN6 #YѢ K~;cy5K Ճ%Tjg;EaXc:V1RJxζpMWNlAe‡]N:Q&O{X{zA&8мHt陰e^eX~/r-V%^r~D|S`]}X՗{lmhϯGBGSӍׁ-sʜ5ꙝ-9H[ؼtޞڝs=#H'G+[/fD endstream endobj 173 0 obj << /Type /FontDescriptor /FontName /KKINKT+CMSSBX10 /Flags 4 /FontBBox [-71 -250 1099 780] /Ascent 694 /CapHeight 694 /Descent -194 /ItalicAngle 0 /StemV 136 /XHeight 458 /CharSet (/a/i/l/s/t/y/z) /FontFile 172 0 R >> endobj 174 0 obj << /Length1 970 /Length2 1763 /Length3 0 /Length 2411 /Filter /FlateDecode >> stream xڭy 1a6 3Ȗӌ(S6bR@,28lV(|P*9 B?LY&Ţ/ì @n@ 8OjY0f 3 ̳}Ń}sF0n[~u:0_+Fą;V!Bal:\0l0c>G>D>.jv8!Lo.H YVɾ'4!0Y<=o+TF CC0P` 6J?aql ,'6Ĝ><#G60FHp8#H$D&q?wQ}`d= HQ-IђB 1޵JVm/4)L̮M[&i"DjYŋŢ39ۓӔBEGM뷭 t=k;=~֑5};njYtHWCؚ'.\)cȣLڶ:(lD|dGOpSc/I_W2b[8Xwh9QpEسIҨ[jwkbuaFmuem7wRVzd) ?Lޯj.vOR5[%ܝQf5w`n鸋Rb]1*jdZ*͟Z8-M} !2)MzQz3hqӹ(y*'=KQʹDbW[( ܐYNGLa3܏Y3cԂ y[c#v@]w,>4E:lik@hab^@ṳħZໂ&8| ܘ6&Pw!8MI"o~3~.wU#mͦ-V^\px{eҭ+d5sJ3'I61w{_&),|;pDFzTQ_hly^Oꯡ| Eϳ݉ Kw6䫌P7go JAeuU`Y$xED^9_mm{t>]'g%sr&iT/H"x"g$K$:ޕ ;(+#ie3A^GykLA׫`%w_myy*;1C&]>wQe"g}6.SIna[/!]+8v|O˒>5J4c$THKE"ˣ-=b_\$(7&{~eYVhT}z\ ;;b`[Λn ȵM[5KU1\UoVCԥ ^CO$ Ǖ ;0׫Z{}BvzsԃKq9M_ cmWROh"56ЬY~8Sm_urDv-Wdu Ҟ`ε:W.9- 5Oo s;N){^%^v$zӺ==˦\=-Qe`G:حRZfgzbOLH?;4l*lN2܏@]i3I#uGeă>եk>i;M|V %k?MIvׄIcha_ +|'iNQ9qyGXGȭ])QIp'ĕ/8˘c'^jqIt.ɲ ⏯12qPAU#dh5p9.g"XCjF1Ptl ?vE~rƟYV]M9aT )y1=ٗ;£kz+ [gݰ0y2H_K_ DLP&kgW0В6yj:&.m֗O۪EA_;56gI5U2VY'5=y$A`LZ xi" #E O ɥ҈F3W7+rm*~^ѱ:MSZqa9 endstream endobj 175 0 obj << /Type /FontDescriptor /FontName /YLPRAX+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 85 /XHeight 431 /CharSet (/angbracketleft/angbracketright/arrowdblright/arrowright/bar/bullet/equivalence/greaterequal/lessequal/negationslash) /FontFile 174 0 R >> endobj 176 0 obj << /Length1 809 /Length2 978 /Length3 0 /Length 1533 /Filter /FlateDecode >> stream xڭ{XLi%4i+J9ScTbKD5f*bih)Mt[QHbV65<)"R.Phh]SͿ}sHb&#BSqs|$ANasLF(@+py!ZSR`ʜ=&pSA8APgHQ%R RZ6pS*Pf aR @38=@B\NA_[*EBRCC)4T@#\2(gp| -HP{E(g|OHɨ Sj:$!d[>6("TU!*1PB`8>xaQP&(i(J C\N շ^Mb8UCfo5E\6FzZ-O\J0\x%ITңx|>A`Q40}耜 =KEAJ TַЯ-i1M)Q1\`ğq:$ q?Z1:@H]֬c]Qw=mzfqil6&I '(g[J67n-unJ7u>`Ir޾śsmbrgg;rֶu [l6qGܗ9ua4i-C m~ҸK; "sWYCۇeA:׾ L}*jϫ̪Y;;nނzw54.6̳-V)n70VT0USUf֪x>Ql>>U c<ڵZէ*]_>&٩/7Qaf qdXjB낸`\հ / 5m9ɣ~C֑8C.5Z-HʘXVK8L3[K枂Fώ֩5֤#\V./}6<կds”'vo >sУfJY +S?׋,%_UW1ex[ѹz[ͭz0_'|aݪ 4+sDžywW'OE,IO +-Ts +v;NtְWI~aanֺQ~] 7眶V1䋵6aU\[J\Ee- ;"T"64$W[ M4Us孚 IA9M( 3sI Mc7q~fv#,ּThb /yl%;j{IU6 K"/NJMLx,#,wO{9<˾s_^߸q-Ken&'f&RwtA/:,I endstream endobj 177 0 obj << /Type /FontDescriptor /FontName /OJURKW+CMSY9 /Flags 4 /FontBBox [-30 -958 1146 777] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 87 /XHeight 431 /CharSet (/angbracketleft/angbracketright/asteriskmath) /FontFile 176 0 R >> endobj 178 0 obj << /Length1 1018 /Length2 5071 /Length3 0 /Length 5723 /Filter /FlateDecode >> stream xڭgXS۶t H( !DM@[ CH/ґDz/R*JRvswY|s~sgpj "V(%,/CzPa ,,,ǡ,h,FB%%EJ(+%&.N8-'H(¡%xEQx0P gsE!(D#@+ IcJF8;9_ ^Db1@$^.J.-StD;xGX$ gc4PH?xK4Bc AG;+QH-4a tpF0:oy--m=ym烙%pBS&@c.C/ /L!A`h PDLhYz.%@4r/C,r 3@k,׾^n $ @!?P!!ॐ9x)/K!x)!?\K]ȥx{C^BPqQ_.āá0߷\їG rG!cX."3ŌCܣ Cl=AZͳT>m҅|m%n#6L;Rښ߅Np,;U lO:sm Hg ~|3q[_c)ѨGksݧ DVI!ݯ !ixɰ x5aB/h1a,rQTJ tӊI)󤅆nȎN禸?Mp5noG֩3]%%M[6}sV)Mu$gy4o nעMGޥ#*]{YɣNOd,yE=Lԩ 5ƧS ʮӯU xO ت{b&{ 6R>:fƦ)$ O1qz4DKd/(1 bA"zz+T#nA,uC E^˜cF┏,> mŒ{eGY &y/mҘ@ +\rUn)q#g3pe5)N ?pCtvBR~X.ҞXnDf[aa֟^2M qVS`j#vcyj}> ƮBtЋ".z2T I~뿮NNP{z.ۜYN.-pqtso6ᚙ6W8~d( 9z' ,w\|1ਭ0c =)_ N :WI'ΰ?YeH5d^23-SNAC .0Z[E6KH<=!$QF/ų[ ^??cn>55'xRm:ɼKe yB(C!~,I #sSI`k[VocDZZb(F8e+orlnǞC!B(I>o*Z`pfepQ>SZ65Zz:k 8728-~h2d wmRqiYGt 'JQ17NwmtNB#ɤ-ȗ!D\l+;c_՟TXE޸9D#Nk-'ܐ~Z,縈kf"Zi7ᎄإ1G2RG J`rWr~5Kc)0nr\Y2&] RJY53+"w ŁtVHIлG1 E[>m5J vU+: Od}0g }MluHGܞ],(w: `MhTLÔZ߯ƿXL{X >8D) uEWH=HUVrYFDQi<"cMxMwʲv=xfYeg_'SYfGW4H[(:/X;ͪDJ73Kv%h3?P槹 ~J[֊/ɏ!Gw15jMOitth:բtt ҭ& ?{?W+#^"U8o|(fOڪ&Q,QTRZoiq::i Z*z:AZI_}EhdE&J޲CZ`j G0z1) &? s%!GY+ǃvNڬAIȋeCӔ8ܧ%7o}K+8(Y [(~e´oj`pa^q󻇋"CC{_އ2DMzY0MӪon5fd=bHe Jb]c4vw)QW0c%)!oanm:Pg >7"^4sMs!R-luD&'grnTKɐN3 cqy-{(>=qDc3i:~Ss~*Ö}dX: P J a^ͳPin~AB'?;L0C9 <./WqXruOه:MTb!<pҴݲdD[Xr̊Ba[mYFEgN6%* Z؃qiO3.Buɕ[N&g5FWcchE׿zD. +ȄM8y=Js|G4̦M -Gzkm$*|t[N\;3(ȭOy.?{eypF T4NS;ƕol0rDy%B W(td^ ד%mЩaœ'YI΄B?^ѻC:CA]SGt]9pHdsX\ 9͂ LNVҌ) ]cubF[_DZU:5lLsjJ+2OM]G IDc\kF\$ C#:CT0fM$>PK}5jn3}'L6*!k).Iw:64 M t8SY񑑘p,v,~NM°S $U`}~H &KM,z9 Zo,r=^OI'ڲ}ggꅎt9:(<Η=E(, d=ACo S'V[\aT,9<=*e[_lҜ>DO:F<pٷ?9t֋U$9OQLgKh U԰fK6|c-]P }=R#)duNR yTT]h3g lgℋ6O.vkÜ Oq[=_2.ڬj|t/ƕ1boo]yGaȐ\qR5}Dm4`jƲ9VDᄋA1! \wL($Vu&%LH4Z7k"lխu[]]KDB>|Ż*"!Όy W۽SY\1R|27|kʨ0TՔˤ0sM mIg\[ ,EDb]ץd?AәY'}C J??_`4se~\C$Y5O)}c@Jbk2A8@]I6(/ftlXIxjKM[nV +!T+{؁ۜmlql ;X>!ǖ'B\c90WOx :04Ӡ*PC~DnAln]c7zS*LAg 2M"j . Z a"5'7'=&K#ZD{i{b{D}g mtur1쾫[쏧7iz3\x֒坕_LF endstream endobj 179 0 obj << /Type /FontDescriptor /FontName /CPPQTC+CMTI10 /Flags 4 /FontBBox [-163 -250 1146 969] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/a/c/d/e/f/h/i/l/m/n/o/p/r/s/t/u/w/x/y) /FontFile 178 0 R >> endobj 180 0 obj << /Length1 1644 /Length2 9601 /Length3 0 /Length 10538 /Filter /FlateDecode >> stream xڭweXk5)n .E Zw;-ſ33y~W#k˺^Ν+tTjV эS d@t!Rn A@ 悽'oQ">liP6w98,K0͛ norx89V`K7&yGk_a+w<@.0Qƿe2`" +5 v%qW1woOl  8o._AV`wʻۃ-mA2`/; r_ 0V.dwR_cf `V{&h ;xx..h!'h`!n?5'`+/ `쒿l.UAvVqص~#X? ,g[5snYF\0dn('L%dG-?$ W4Mrv-?cha@Xo XkؿK`11l4f? ̴xazAa쎿¨,lMr( ?0N0J's9 [J! &iy0W0&19ay`ٺ~k恉tv0z? ̎'1{HH@|X\0/YlsG`y,!B!veH6Mq*u]3 #jn3^` PzޓB?9 tK{0xBwD}|8{u:m4Ia*nC^>= {@* 4pUOՉ`0fsgwGSK .셦 ; VbU#)(c\]q';EfewzelbRfkM7A%e05*q޸"| {Q0I4SlPPR\q<=ad80*UŪtTBM/2xU΃x'܉T|#KƼC-; .1?)%aZ2h&!L1Sӽі&ɲaUzڠv`M+p,:,"wA™^ݝPs1Y ILĽ(!ݫzsO=CaQJ-l`|x?~3`}PK/H=zpzD k]W2]d*W[]϶7/^w,1l,AY~@<~_~iL]qUXZzoэ;0Pw{]Es?7C[b {AgD_i0(!Qfthc Ҋ(#qYE.aNJ&f/MBϲos<_x?dVSQ۝ʑh;|zL12 RZ]NRwXA .2 X6vZ+OW:mE[ȵS]<ЇVc;.5Ҍh\L#yLWT63襑47D{ gK/=֤BlX *OBT5>%\_R"̨M~6:ZIR\Ul A3V)=jTN6yy<ӯ$awjo2y Qv2\nJ,M+smwqg};wnhޣmjJ/ ի;. lt"G,A<5[{.&W(9LNꡇ^ ϴ2jTwFMhg.&IbD84C~aNzbNkOPXt7um5nS~""3~f)V=F$9Ο4r5jm;`raAfV1Sm"]n~p= ְ4O9{l s}C>zN#ֽ/@' 1>cUŶw1+~yzgu;M,2W{Akjr6 @=|Mvr4;-%eE(Uu.@௽MD L8Y%!bmbFjH˝ODN1OtWϒxZ[zɤ5qٍɽ楹SMRv+9{*{THC1u2ŏ+W#2ػۅ2ymR~G,pVI? F[bf-QEƝ C 3Kk0ewTY:C1veZZ22e!RXr7ȉXlFߝVHXı]LYD,~9% n edHL˜[#Ց#Zyk*KRMn8E#K :tu@0bM_V.a*Ta/rtڈiToo%mBrռRO m$3ep<ǻ/|X0]JwV' "j}e:F߮eV68 ^aSJǨOؓюVU:=  HNzzf8+g/Z#p-I4jRՖ\E%Lk",>y8zV lh$ҙ#NByZ]^gyZLDܵ,H x:[JQ 6 7Ċ$*ȍlyV.һqZV2#y*,ޘN@Îvpr=l;M ._>kvmXCmw%*Nћrf︎)\bx\g$XdEeΊdHh,}Ay9'q!^kq=#_-Wr3),ylX¹^YA^Z8xBb-33hpmm|S +׫R>LNJ*8#1\[ 8D=8AWB^6 {in}KM@x:X.xAZkU<7qx -~Ma_Zgp0% A|"ө%7 +ŇmAaH~.k`o9:4,r"l>B#:Kyգ[܉P&taʩ8JtW?ÂJXX5>L״B~qqZ d CW_|AnkiM`^/}hl?zIy[}zɍ%+8p~Mi=gQ`altM=q/(|"v-RaBZTevS-wpl`㣏4D+`A%C"7j)~Hdܴv~AlFWD$Tdkb;ō/|(=&s$ɑ95y5`#٫A}s{{O @ow$C~qQY%}:* Î]Xl_yjN> :j*w*ǜ $x!m"I3lȯ~(3vNKt"jQ[jbjW!5,}phch[ѰIY4ݸ>G`ހ ShAEv#RZ w3|s;c_sQUFN7V! p\(~q?3UQȲVpu417)]YoaXڕ[>&~V[6푩7Ǭ ͻnu/ml(|/T9$hC/oM_[}!&CAvFBα@xQUU*zLhEPݐn<y꿴"4π.x\V`Hz;R֟ge̮F۷pu㰙 ! SB$!gCB)Wf ۀL->. ~M Ǝ: ФcJ :|Z)S! f1Ц|/-m8o\`shdu8Lx!{g|ͷ_I)a~a {LhSKYɨʔ,%g b!#PN . XG]eH ^;c9^w[aD7,F0{2}J'D_?x6֤ a8P4yEӢTx2JE*6.B_O./, X}Gpr_]kϪeQ# !fG8wLi{ОxuW9yc{dcϲL$pQ0&ۆ&qm,)#唘5׹j>hX-OXEd<;?Y{~Cf&hx\,fZ8tq1F H`lc+I Egc ubԑަ's7pIz:ja#,^=fQ3nNY26,rP"0 eMuO'j睊43w)ДmBg66 eI"=8p!:kRѠYE9}ʢ-V:{ܗ?+FkJ '"8 mA:0 hӂe7_,|}%{:5 ܓ_۔&*Fpo>F0~)מּxۜ6H v8}@Nq)j:mPX% HG imIor:QBHq[%.]X#v& 8Cn/nAǎV3׾1}2AD ~ TǐZzIl|/?'7e (A`qdi^"M+spgϮnshR$?Eaa$!UxMI{r9 o5/S>7ܞ'C@ũ`3E8a脗Hq ]^1ѳTe8^Xng)F\xgPqPo eOl׳1ǺGJiI%AKn0.;yh@cp_kI#.9zxZ?oghnϤB'ցLSx?Wb eg |.Rc>Ҙ74BCstqI6#HߒOc}BEu z?l/dDD/F倛/ h5t2} #؟ݡ'ᢁt1,UII@j!j>zw}4]̃!oO6KIfq-}u3gWZRzKD|Õ_,9Zism,HX}Č 䐲:Yw$ݰ+b T/z0*֊Ev}8bdȗhJT+cj[?7f%nnl.tsQ9pLm'YEaXFJR㯤邎v @3ZiRpٝsfץNtrbr.GphviVde1x(g S$WMF18.w%=BHfۇʏ{2k B>D>’/)zQJdDd*mH5[JoA넉E4ZEmv0RO@xxnl!A(ajНcE)Y sJ3Νl]=_# n5;j [ea\}b'#e˃{wdvw@ٓw+ϕު:}t%ծH.fc7IjO}l32?q#s6&W9\3wŘ S&⅔B7G?'\]Ei$Ro\KAypE4nQn!X8%$ڡ76RJx+Ml,==7#/E9]"k7~v T]+9gک*4o[ e0=yg0&Ӕu-Bbu)Cחl3l{vF`ap _FacƄԓFrx+rF15Z>FX֣j,*(BvHe: jIdX$] ѫQ\]s My dq?CDYf/ou\6# d"+K[Ϯ\5eVX y_ . v?/!24 zQ}jrqUha3 ^Ķw1EpY3CI:o WbW5O[tЍ`nlqrox.zF:hAijMS$Tۿb6ެA\D6zDxbb.xJ ecS`nwco:JHU:L;aS!*9+n0,ifΝ˽wtՐ(*9X%6 P:?wW endstream endobj 181 0 obj << /Type /FontDescriptor /FontName /EKPTLZ+CMTT10 /Flags 4 /FontBBox [-4 -235 731 800] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/E/I/N/P/S/T/X/a/ampersand/at/b/backslash/braceleft/braceright/bracketleft/bracketright/c/d/e/equal/exclam/f/g/greater/h/i/k/l/less/m/n/numbersign/o/one/p/parenleft/parenright/period/q/quoteright/r/s/t/three/two/u/v/w/x/y/z/zero) /FontFile 180 0 R >> endobj 182 0 obj << /Length1 968 /Length2 3136 /Length3 0 /Length 3763 /Filter /FlateDecode >> stream xڭy8 mٷlD2Y0!b1.a c.}b)k%[T,9ٗ,"$:9_￿g>z$jH.HE@(17G(URM<(4]98PD) Q GƻRԏ %@$㝰DNX`Frƒ?(I ?2S $8(+NtYa?I_f.E@"OT8@gV *{q]o)'7MCa@w>K;i] ˄8<f]un? -F2]O OySGOF- #_5!:px""LROJH 8}aP"BM3 Id.aI T*B " Rs]A$<\A/rA-z|0/(<-H%~鏠6$Ԏ^ 5V+--o,Wr 29y -ovS}A'woINnQ:KIjg6F2df1,6>@ =37NQ;{bwz9k>V.2nrQ?y?%yXۋ]H4>v>oL{w g~*2ފW{܁]r/{b';YQVb֞\ ػedU|3YX;pAEC@u9w%2$1p&CvEh,~nnOgkM &&XNnp}f'iZ@-<Df)oDՔQ;r9''6gL7+8ߎdaq E"f&(nfRDH mRv[᭿1ۮIFt _0Zǻ|7]Pּg3o} ܢ5Zf#ܟzr-mxCAbkWIc>6aovDn()ГJn7 %ӯzN]JHw&9KLjb[C@r`'*Fn䙄4sK5dkj{l^#!GQЕHJvZ//À`Id#8ңKFV+ài=#F(k3R`UΫx7 dT2eW{&b0Ə >Y`gBS[Pݏb?ތ`g}0]alL Շ5ۊV_d /%)ؑ\jl|h]㥦#x"[)FpWmJS ,j\ g@:…nELB&[/U´CBySbWqIIӗi&tP!I&ǧwn=39 G Qɝ^G)L-~CI w_l'h Tp^H##]ẕ ͡72i(.4|JUC󨣔EhYel-3MQ2t6, ~#Pɓ復|;"/UChx ݃ՆqV|7tHcIN+wK|_~;ClaЬTPk'jf-}eo%,s0|E;[-w.G}]}ϯ]=TQq46J&iA`/n 潻BQPTTJ]r֚.qOMA1YsozcU9\ABq ;8GMkm2QuzLe_xNlK顶j "pĤ@˒W.obeEn%i%H5'nđu|1 tE'jq6&B`R[?vhi8 Υ,% W>iJ8*YRbj,+A_Mb` pQK>5Ws ^`Jj;J^*g"Kk_j,ɝWyp?ڨɩ̨[ cVemrz;RkGE+y[/|2ͭk&:)V8o|54^X~wy@ڊcN4SܑAnh3ɽd=5sy1w=c~Rl۷QV-?"X$xuy6'P&Ӌ)b-FH:3$pI@nߣZ-[LhơY_໩:o endstream endobj 183 0 obj << /Type /FontDescriptor /FontName /DLVCNL+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/a/at/b/d/e/h/hyphen/l/n/o/p/period/r/s/t/y) /FontFile 182 0 R >> endobj 184 0 obj << /Length1 2091 /Length2 12458 /Length3 0 /Length 13595 /Filter /FlateDecode >> stream xڭwcx߶u46۶F44۶lfc6zwϹߞsOd9cֳ)IEMRvΌL|$ $L,#gK;[ #g +//+9  +<%3 8 nQ-Hfgb p`"ITp"Q8]L$&$sK[x߂dmHm6u_+ $$$Ab 0gVq@JR.@F6@ wq8(ؙm;T om SK:-MDḿ,,ʖ&$Ύ.Զ)`ѕQVդ8S6uV'a?GKw=&VP /.I[;SK[>pr9:y8IOA >?ħ@]k@lr9XZX:c`mmFvs062v9Yceemv9e?l px^u\'H5So͟&`du[3hA"AZN_Y@2afWn;iA!H@~7&P9j/om_ԯ?Ep89uXA8Al-mTu1}% t3 i)VVP {#G̟9}v{ P,Lu΀"\s%y5VP: :ϥpk,$N 専Tlk_@qv(_4K׿ H__/?@>M11;wOF.F6sn.^3qq_/-Q_lf zw UrSpdT4yWNXp`:_inN_T&̿~OJ}gOvp4ws 4>VS0y1xL#~J Mϵ[z TP#$T5š4#d 5!jm2*~ҮW>\N!أ L?XR`H#-wC}AO$:q-cs.-WD=~ d^:3oޟ3~|r6FyITtG#-I.bӖVwx;s@lDђ.R'sOrAu#Mź8/KCvh#ƖTG?W+vXaC&rC3+3lsD,B贽xz5]H1ҎB 7ǐ~qglG4ڍ(",v1)va%/x6 OVdz%&>1˸\ϹSycj @ ѥJtm8/CwEu79'Ӯi%J~l}Hpܠl2\ʫ&a,joQa~Ij$@84Db@ VDP@ 0 9?]ڹխeCɯctT.X;V6b!Ĵt3)(mK>q+x~Rԝi:N'/U!܃stҹh%X1 /nwΤc8ǻ*$6|o' ycËoj2QoTueNb<l%W7ZD@': /!߀e2N&( cU5 0Ydv2JaPf|]&$j[fa{ZN M-[a27 4ORߒ)u#Ԃ2P 9j3͹GJ0lˆ{o{rӴ_aW3qZvrmKxcxƁ4 M]jw(zv/BGsy>;Ԑ.(9!1fl7vQH3ok% MW4[e1@` 23xp]iy(vT;M-@u|^IJovP+~]2 GN2h*BlVrD$YU`1tKS C2sEiwh$ '*\ge=׺RN6mIU# E~=ϴ&' CX~"hbYoS yuyEтVb@tKG 32T1|r 'q[ Fb{)i/C  4T6 ܥ駟hx yLHgnR?㫈Y۲NsA{|4+WxXpp J:/W#Y 7ja+__)k9i|G[(8 SnѣTA(oJb}I.N.sX' wn}9kJC+J[)A2)x, nX*`5w[h\=%/x"X/MshD|t 6Y0*M!yޑu Km)|uhgC mַ,C eaY '0]C~ O5w}W?7ߡH|wEDZE|(.xoA%4 #%p?XWIc:ÄWJ(e" u":ee\Õ|RۙVk^IĜ5:-оqmGW"!uQZۂvse<̄aʅ[ӓ}fWUX3džÂ@[>/psnf?%=f:O dhR MNv&5Ky2SDNW,5^c&2EJ1 lV Ģ1 LDjS"lTswum}VC_=@ngd/__>V#vdK۟=d/$D;U5<{r Cr*h^)' "e3%|a:K1XXݬMK{^9Ǹ07:*m*|-  7bRRiTȜO'κJ8;hzlPqd h־JQǙN^[2Ue+my&`>f, !u76>;~_/B}O܁Dw+[!ě;43GC(;?ofU@=JXVd,Ua됌[-A(,jC@(yE[G-$[24_,vZ@ ʾIWpҞiaňO D(ZiY~*ji)IǙ=Ni_(;拾wEjEHkQRFhl-H09m--ԄQWCrے' +1ʡ!WvA9%y~떱ǒ&xv뒹S[ [dJY$nޡ駐-B92\J36XXadR8x}5-uv1ܓH&'tikB)n(Ǟ}un CB8+vOMX%')1˺`O|o(E@&FN|4}β}j@KdP(-%cZVŸ3G#S82XTOAuELl?PPlrWX\ 73B[uLb[O׾I#9U!¸VH*G !,bƎ+F*Xjnl_ 5*?\l:s|/cQ0""=7@'~[2PQkoMtX4U){ݖ5VDѸdܵǏء~ܤ-(|R<ݡ2Şs}b_ ubnxFhw>9x4xcs:?(eᾷ9ogrr30x໼D O7hHߜ&txJ="B$ >9w\!{WWOѸ2s.ƑgBՀP4jӋ[nRNc{E/#k}T\6۳oq%d:hsgItpBT\ Br*m4ANb7p>زT*3U6ilETFzs|̓>xd. @;Ŷ k%!^sи(EJ뙘7TCZs,I0hDz,wQӓ@E7, z 4ik/ 1,On* >5W^J:-ǵߩX pu1L+BWs[q+& jFʔ'+/1w.ͣ>4&FWv8:2kM[#S6*IyO Y ~(J>J3x0t#4<JXJ*Z7'Xs zM^|ޗ!<ZO*HL[IxT?:TI5y&șnP"IB6# <_S(/C;ſ 1Kԍpcbg6.srD&G3 g&Pw.\d4^f4ݓץG^v_|F1ո>*0RpPħC@JXh %Yǝ̦/''~ 3;==W/&o`gԤT 8^o-P!\Gd{&s)x-+<&'V'^ϤhaiEg4ee-Z,a2Jz!rhЧ{El+[7cG q顲t-gR2M*<^WP rik8!pPф;NxmEQC9%%Տ\擡N >+agGqvG^j* /i`b`!.暿e:(b'm=  |i{^~?Z4ZѾ-]eK7EyΉptzЁ(Sf>DƄ#믹<4rG2=l#Uۜ/KJ x\{L{.jēi5*{JIZM6>ΧP~f vl\hͲWUΎ_$I= rjS %COʈV-iIԻ8p{uE/8ort_h9>Z1eF{hR}-;5><Ε>,5N7nёԍCZB7:{Scro"Ek2Iѷ<󾑷'C"YݭxE9AyR{mtD N Sl޵֫+89]}]pH1TkcRx6O-3_0)*\!5WA.rJc; }m3A-kY)VXԥBSjz]ڵ;GKG,o#.wff= W4 RCXݢ=QȓhہE.(?C;}4}&krxY?ʤ\G䴅/Ows) ?jο椁stf'c™~qh'B`LhqX\~Sqߙ/R Ky&H~8#zQPl'[my!r饪zFDiL f>|/\,!Y毱ODf1I" >Hɇ@:*+A2>:>#-pkLLDF*Lgt]F\j*8!9F.vk*@~ 2؂1Jm(kV>KepPV6A8Mj^/PcgicLv s ы3*wi?|eX%fЧвm dȷnw[ R^g>7-mfEf0\)g&`o{; 5Jא73iu6VU4(|>i(pI{Bk+RM4*E8UӃ警(g*/H|UyH2Q<*7tZO7L٘I#p rvDHc ٘T1y35*Re5Ea{`Ïtb;gm{g2pM!~7_g;Z9 J4<&yK^AUF"R$x=l`B#yg8_ ;.KH/ w4Gá(О U~rNv|._9v6|3WTK(VƢJ]q8 siYB<1$D6inyAۼwQo)QTe;dp Uئ/d87O2^JWo >|Z\n ) 7 rAg":?Hyi%vL!F//G8z˝,ŧw1}tM{[F'xH7 Ogdef8IO%ql咢r γ1aS;4Ƥ+(iVJ"tFel2Aф/7ٺqxbX ELWx$|UlM4 S29˳rwpM;Ax^Şf6dތ#*{Ы6ĩW9R*9X`<}\c9<U6,#6}6Ô-u~;.| L|O.3(3~ EiEsOSbNlvY=m(\7A=!IH:gl`7HX٬J$/3;ޝ >s%+oUmm@~̻qFf}a |7& 4uC)m؜m;36\sY9 ը-{( }X: R}|DH2kB&M;kdL} st9yJL=/B]HA Ģv;*Fh #\|[-Max~3_z_>a4Qk_K,¼Gz>b@/fkqFF/_W>`4`..(P Ȫ9v(ÂcXd#p6sL"XSb QnhWG{ / 8DWw(dm!IQ;1Hc07SA?$ Ow\ 湈h-5نjar;Ui?:V8wkyw6RQj}3=>/OĶ\׀Х'/v$f(nz1L`iکQnњ\W^&]k Vm7I&Zoh_?h,/{B52Z򕰦j]m͙B86cCOCke =IOK`glFSXEWN6~8gFv~uV [Eg8-G~JZSz~Wtp_~A[2am'ͻFiAІS2#bh (R& yZmpWRWr'agU3\LHY3z o[+%zZ;}i5B|U0;t'T%GiƸ]YY<3Kno]EHUͺN0BfK )w'Z4[+_ !h {q[.!esH_d LUXNƊgZ0sOlm?(Rs(6BDjۀ!kCؘm 1 ?Z3* bgULQGz܏;  ÂM(SK ^ L A–SߐIIyМN<Ҽ@ֽNjLmPW]fVt QzC ے$ U %iPG'x-#'ki37LOL}PMReqzѼէe Xj|\fZ}A`CJI4>C]P^|\yv^ivIWJ _lǚ1 NR7{#&j@$l8Ѽn!0;kЩCuZ]7#?'ts^ibq3\tr]/h{nB| ϟ[m܁\+=( N钜]S]@ #l)L;i[ A3-`TJ6e biC=ε7xdwOfy68Y:\yOG 42t$:b8`;M<[U-w_M0.rEVx=[,ٶ#:}ݝD:մ"O: =!}(Pd)Z)YČvinBhWϰ3Y%¾7--"4׺f''%x礊c̴cGT#]-mFn YRh<=+^404C}eYOqp48n"p~>\(}4"qFV#Ebx4g yrg{Aks**yn*f%r|R6* -෺=GVNU뻒uh6J,эo״k(2i}Aвcav0c%>?/(asha4 4NNגʼns-YţApǬ~#}>TeJEcWGxG'sQPTΧ0/`aNQ%DX+C= _dU Q: ?\ISDWcY.;^15B#qҫI %ɟy޴1^ʄ5@CXϚ 퓆ND b| Q6#@"h*>$^H)6 !7Dn..MH:-%\wUa0nNϘs^j31No2[fWS](2T4.+#*RA:Ě(|ڻD&-T&YΟgl#U.o%oG2/=L&p^4Rz T/YG6+}mRJLaU~CCܢ2B+#q0Ky/剟!xT˶fB A^1OR4sll>3VoRx7c7HpqT٩I˘]Fwz&I&+%1X~~&ʩQ2~T߉Ad_WFt{vQcr/Wo, dm#*;pGk~D 6o=bć>_rm#斲Dq}&Ls$tjYy endstream endobj 185 0 obj << /Type /FontDescriptor /FontName /YZHPRV+CMTT9 /Flags 4 /FontBBox [-6 -233 542 698] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 74 /XHeight 431 /CharSet (/A/C/D/E/F/H/I/J/L/M/N/O/P/R/S/T/U/V/W/X/a/asciicircum/asterisk/at/b/backslash/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/q/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 184 0 R >> endobj 27 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QPOGGI+CMBX10 /FontDescriptor 147 0 R /FirstChar 12 /LastChar 121 /Widths 132 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HIBXFY+CMBX12 /FontDescriptor 149 0 R /FirstChar 12 /LastChar 121 /Widths 139 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EUWOLL+CMBX9 /FontDescriptor 151 0 R /FirstChar 65 /LastChar 116 /Widths 141 0 R >> endobj 29 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZBVZQH+CMMI10 /FontDescriptor 153 0 R /FirstChar 59 /LastChar 62 /Widths 130 0 R >> endobj 125 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZPXWMS+CMMI9 /FontDescriptor 155 0 R /FirstChar 61 /LastChar 61 /Widths 126 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TWCUGQ+CMR10 /FontDescriptor 157 0 R /FirstChar 11 /LastChar 124 /Widths 138 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /POYNZD+CMR12 /FontDescriptor 159 0 R /FirstChar 47 /LastChar 127 /Widths 143 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XEWKYT+CMR17 /FontDescriptor 161 0 R /FirstChar 84 /LastChar 112 /Widths 145 0 R >> endobj 13 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VDRGYX+CMR7 /FontDescriptor 163 0 R /FirstChar 48 /LastChar 65 /Widths 136 0 R >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VVMUQT+CMR9 /FontDescriptor 165 0 R /FirstChar 13 /LastChar 121 /Widths 140 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UZFVQY+CMSS10 /FontDescriptor 167 0 R /FirstChar 66 /LastChar 122 /Widths 135 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CVHMWK+CMSS17 /FontDescriptor 169 0 R /FirstChar 97 /LastChar 121 /Widths 144 0 R >> endobj 41 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NZBIAG+CMSS9 /FontDescriptor 171 0 R /FirstChar 97 /LastChar 112 /Widths 127 0 R >> endobj 30 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KKINKT+CMSSBX10 /FontDescriptor 173 0 R /FirstChar 97 /LastChar 122 /Widths 129 0 R >> endobj 28 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YLPRAX+CMSY10 /FontDescriptor 175 0 R /FirstChar 15 /LastChar 106 /Widths 131 0 R >> endobj 40 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OJURKW+CMSY9 /FontDescriptor 177 0 R /FirstChar 3 /LastChar 105 /Widths 128 0 R >> endobj 15 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CPPQTC+CMTI10 /FontDescriptor 179 0 R /FirstChar 97 /LastChar 121 /Widths 134 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EKPTLZ+CMTT10 /FontDescriptor 181 0 R /FirstChar 33 /LastChar 125 /Widths 137 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DLVCNL+CMTT12 /FontDescriptor 183 0 R /FirstChar 45 /LastChar 121 /Widths 142 0 R >> endobj 20 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YZHPRV+CMTT9 /FontDescriptor 185 0 R /FirstChar 33 /LastChar 125 /Widths 133 0 R >> endobj 16 0 obj << /Type /Pages /Count 6 /Parent 186 0 R /Kids [2 0 R 18 0 R 22 0 R 25 0 R 32 0 R 35 0 R] >> endobj 42 0 obj << /Type /Pages /Count 6 /Parent 186 0 R /Kids [38 0 R 44 0 R 47 0 R 50 0 R 53 0 R 56 0 R] >> endobj 61 0 obj << /Type /Pages /Count 6 /Parent 186 0 R /Kids [59 0 R 63 0 R 66 0 R 69 0 R 72 0 R 75 0 R] >> endobj 80 0 obj << /Type /Pages /Count 6 /Parent 186 0 R /Kids [78 0 R 82 0 R 85 0 R 88 0 R 91 0 R 94 0 R] >> endobj 99 0 obj << /Type /Pages /Count 6 /Parent 186 0 R /Kids [97 0 R 101 0 R 104 0 R 107 0 R 110 0 R 113 0 R] >> endobj 118 0 obj << /Type /Pages /Count 3 /Parent 186 0 R /Kids [116 0 R 120 0 R 123 0 R] >> endobj 186 0 obj << /Type /Pages /Count 33 /Kids [16 0 R 42 0 R 61 0 R 80 0 R 99 0 R 118 0 R] >> endobj 187 0 obj << /Type /Catalog /Pages 186 0 R >> endobj 188 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20091101204554+01'00') /ModDate (D:20091101204554+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 189 0000000000 65535 f 0000002139 00000 n 0000002027 00000 n 0000000015 00000 n 0000190242 00000 n 0000190806 00000 n 0000190101 00000 n 0000191805 00000 n 0000189534 00000 n 0000190523 00000 n 0000189391 00000 n 0000189959 00000 n 0000191662 00000 n 0000190383 00000 n 0000190663 00000 n 0000191519 00000 n 0000192089 00000 n 0000004903 00000 n 0000004788 00000 n 0000002332 00000 n 0000191947 00000 n 0000008127 00000 n 0000008012 00000 n 0000004996 00000 n 0000010284 00000 n 0000010169 00000 n 0000008243 00000 n 0000189248 00000 n 0000191235 00000 n 0000189675 00000 n 0000191090 00000 n 0000013751 00000 n 0000013636 00000 n 0000010461 00000 n 0000017530 00000 n 0000017415 00000 n 0000013892 00000 n 0000020660 00000 n 0000020545 00000 n 0000017658 00000 n 0000191378 00000 n 0000190948 00000 n 0000192198 00000 n 0000022687 00000 n 0000022572 00000 n 0000020836 00000 n 0000024897 00000 n 0000024782 00000 n 0000022816 00000 n 0000026435 00000 n 0000026320 00000 n 0000025013 00000 n 0000028729 00000 n 0000028614 00000 n 0000026539 00000 n 0000030375 00000 n 0000030260 00000 n 0000028845 00000 n 0000032502 00000 n 0000032387 00000 n 0000030479 00000 n 0000192308 00000 n 0000034628 00000 n 0000034513 00000 n 0000032618 00000 n 0000036595 00000 n 0000036480 00000 n 0000034744 00000 n 0000038945 00000 n 0000038830 00000 n 0000036699 00000 n 0000041476 00000 n 0000041361 00000 n 0000039061 00000 n 0000042668 00000 n 0000042553 00000 n 0000041592 00000 n 0000044648 00000 n 0000044533 00000 n 0000042760 00000 n 0000192418 00000 n 0000046848 00000 n 0000046733 00000 n 0000044752 00000 n 0000049083 00000 n 0000048968 00000 n 0000046964 00000 n 0000050599 00000 n 0000050484 00000 n 0000049199 00000 n 0000052341 00000 n 0000052226 00000 n 0000050703 00000 n 0000054377 00000 n 0000054262 00000 n 0000052445 00000 n 0000056655 00000 n 0000056540 00000 n 0000054505 00000 n 0000192528 00000 n 0000058989 00000 n 0000058871 00000 n 0000056783 00000 n 0000060949 00000 n 0000060831 00000 n 0000059094 00000 n 0000063344 00000 n 0000063226 00000 n 0000061066 00000 n 0000065746 00000 n 0000065628 00000 n 0000063461 00000 n 0000067616 00000 n 0000067498 00000 n 0000065851 00000 n 0000069152 00000 n 0000069033 00000 n 0000067721 00000 n 0000192643 00000 n 0000070938 00000 n 0000070819 00000 n 0000069257 00000 n 0000072034 00000 n 0000071915 00000 n 0000071055 00000 n 0000189817 00000 n 0000072176 00000 n 0000072201 00000 n 0000072314 00000 n 0000072949 00000 n 0000073112 00000 n 0000073153 00000 n 0000073688 00000 n 0000074315 00000 n 0000074706 00000 n 0000074861 00000 n 0000075212 00000 n 0000075335 00000 n 0000075726 00000 n 0000076358 00000 n 0000076995 00000 n 0000077638 00000 n 0000077967 00000 n 0000078448 00000 n 0000078900 00000 n 0000079065 00000 n 0000079258 00000 n 0000085609 00000 n 0000085918 00000 n 0000094469 00000 n 0000094804 00000 n 0000097472 00000 n 0000097704 00000 n 0000099629 00000 n 0000099868 00000 n 0000101520 00000 n 0000101745 00000 n 0000117200 00000 n 0000117705 00000 n 0000121589 00000 n 0000121856 00000 n 0000124883 00000 n 0000125115 00000 n 0000128622 00000 n 0000128890 00000 n 0000135274 00000 n 0000135569 00000 n 0000140380 00000 n 0000140653 00000 n 0000143174 00000 n 0000143407 00000 n 0000145807 00000 n 0000146036 00000 n 0000148589 00000 n 0000148824 00000 n 0000151354 00000 n 0000151690 00000 n 0000153341 00000 n 0000153604 00000 n 0000159447 00000 n 0000159706 00000 n 0000170364 00000 n 0000170814 00000 n 0000174696 00000 n 0000174955 00000 n 0000188671 00000 n 0000192736 00000 n 0000192833 00000 n 0000192886 00000 n trailer << /Size 189 /Root 187 0 R /Info 188 0 R /ID [<6761417C7E9EEA56D1F4A32CC8B5E1E8> <6761417C7E9EEA56D1F4A32CC8B5E1E8>] >> startxref 193141 %%EOF lhs2tex-1.19/CHANGELOG0000644000175000017500000000026612507035615015071 0ustar00andresandres00000000000000Changes (w.r.t. lhs2TeX 1.16) ----------------------------- * Cabal-1.10 support * Fix for file permissions problem of installed files * Several improvements to the documentation lhs2tex-1.19/INSTALL0000644000175000017500000000651212507035615014710 0ustar00andresandres00000000000000There are two possibilities to install lhs2TeX: (A) Using Cabal. (B) Classic configure/make. ===================================================================== (A) Using Cabal to install lhs2TeX (preferred): This requires Cabal 1.6 or later. The process is then as usual: cabal install if you have cabal-install (included in the Haskell Platform) or runghc Setup configure runghc Setup build runghc Setup install The third step requires write access to the installation location and the LaTeX filename database. ===================================================================== (B) configure/make (might be removed in the future): The following instructions apply to Unix-like environments. However, lhs2TeX does run on Windows systems, too. (If you would like to add installation instructions or facilitate the installation procedure for Windows systems, please contact the authors.) Unpack the archive. Assume that it has been unpacked into directory "/somewhere". Then say cd /somewhere/lhs2TeX-1.19 ./configure make make install You might need administrator permissions to perform the "make install" step. Alternatively, you can select your own installation location by passing the "--prefix" argument to @configure@: ./configure --prefix=/my/local/programs With lhs2TeX come a couple of library files (containing basic lhs2TeX formatting directives) that need to be found by the lhs2TeX binary. The default search path is as follows: . {HOME}/lhs2tex-1.19// {HOME}/lhs2tex// {HOME}/lhs2TeX// {HOME}/.lhs2tex-1.19// {HOME}/.lhs2tex// {HOME}/.lhs2TeX// {LHS2TEX}// /usr/local/share/lhs2tex-1.19// /usr/local/share/lhs2tex-1.19// /usr/local/lib/lhs2tex-1.19// /usr/share/lhs2tex-1.19// /usr/lib/lhs2tex-1.19// /usr/local/share/lhs2tex// /usr/local/lib/lhs2tex// /usr/share/lhs2tex// /usr/lib/lhs2tex// /usr/local/share/lhs2TeX// /usr/local/lib/lhs2TeX// /usr/share/lhs2TeX// /usr/lib/lhs2TeX// Here, {HOME} and {LHS2TEX} denote the current values of these two environment variables HOME and LHS2TEX. The double slash at the end of each dir means that subdirectories are also scanned. If lhs2TeX is installed to a non-standard path, you might want to set the environment variable "LHS2TEX" to point to the directory where "lhs2TeX.fmt" and the other library files have been installed to. IMPORTANT: To be able to use ``poly'' style, the two LaTeX packages "polytable.sty" and "lazylist.sty" are required! Both are included in the lhs2TeX distribution (they are not part of standard LaTeX distributions, although they are available from CTAN), and are usually installed during the normal procedure. The configure script will determine whether a suitably recent version of polytable is installed on your system, and if necessary, install both "polytable.sty" and "lazylist.sty" to your TeX system. If this is not desired or fails (because the script cannot detect your TeX installation properly), the installation of these files can be disabled by passing the option "--disable-polytable" to "configure". In this case, the two files must be manually installed to a location where your TeX distribution will find them. Assuming that you have a local TeX tree at "/usr/local/share/texmf", this can usually be avhieved by placing the files in the directory "/usr/local/share/texmf/tex/latex/polytable" and subsequently running mktexlsr to update the TeX filename database. lhs2tex-1.19/Makefile0000644000175000017500000001562012507035615015317 0ustar00andresandres00000000000000 include config.mk main := src/Main.lhs psources := $(main) src/TeXCommands.lhs src/TeXParser.lhs \ src/Typewriter.lhs src/Math.lhs src/MathPoly.lhs \ src/MathCommon.lhs src/NewCode.lhs \ src/Directives.lhs src/HsLexer.lhs src/FileNameUtils.lhs \ src/Parser.lhs src/FiniteMap.lhs src/Auxiliaries.lhs \ src/StateT.lhs src/Document.lhs src/Verbatim.lhs src/Value.lhs \ src/License.lhs src/State.lhs sources := $(psources) src/Version.lhs snipssrc := sorts.snip id.snip cata.snip spec.snip snips := sorts.tt sorts.math id.math cata.math spec.math objects := $(sources:.lhs=.o) sections := $(sources:.lhs=.tex) MKINSTDIR := ./mkinstalldirs ### ### lhs dependencies (from %include lines) ### ifdef SORT ifdef UNIQ MKLHSDEPEND = $(GREP) "^%include " $< \ | $(SED) -e 's,^%include ,$*.tex : ,' \ | $(SORT) | $(UNIQ) > $*.ld MKFMTDEPEND = $(GREP) "^%include " $< \ | $(SED) -e 's,^%include ,$*.fmt : ,' \ | $(SORT) | $(UNIQ) > $*.ld endif endif ### ### dependency postprocessing ### DEPPOSTPROC = $(SED) -e 's/\#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ -e '/^$$/ d' -e 's/$$/ :/' ### ### default targets ### .PHONY : default xdvi gv print install backup clean all depend bin doc srcdist all : default default : bin doc bin : lhs2TeX lhs2TeX.fmt lhs2TeX.sty -include $(sources:%.lhs=%.d) # I don't understand this ... (ks) # # %.hi : %.o # @if [ ! -f $@ ] ; then \ # echo $(RM) $< ; \ # $(RM) $< ; \ # set +e ; \ # echo $(MAKE) $(notdir $<) ; \ # $(MAKE) $(notdir $<) ; \ # if [ $$? -ne 0 ] ; then \ # exit 1; \ # fi ; \ # fi ifdef MKLHSDEPEND %.ld : %.lhs $(MKLHSDEPEND); \ $(CP) $*.ld $*.ldd; \ $(DEPPOSTPROC) < $*.ldd >> $*.ld; \ $(RM) -f $*.ldd %.ld : %.fmt $(MKFMTDEPEND); \ $(CP) $*.ld $*.ldd; \ $(DEPPOSTPROC) < $*.ldd >> $*.ld; \ $(RM) -f $*.ldd -include $(sources:%.lhs=%.ld) endif %.tex : %.lhs lhs2TeX Lhs2TeX.fmt lhs2TeX.fmt # lhs2TeX -verb -iLhs2TeX.fmt $< > $@ ./lhs2TeX --math --align 33 -iLhs2TeX.fmt $< > $@ %.tt : %.snip lhs2TeX lhs2TeX.fmt ./lhs2TeX --tt -lmeta=True -ilhs2TeX.fmt $< > $@ %.math : %.snip lhs2TeX lhs2TeX.fmt ./lhs2TeX --math --align 33 -lmeta=True -ilhs2TeX.fmt $< > $@ %.tex : %.lit lhs2TeX ./lhs2TeX --verb -ilhs2TeX.fmt $< > $@ lhs2TeX.sty: lhs2TeX.sty.lit lhs2TeX ./lhs2TeX --code lhs2TeX.sty.lit > lhs2TeX.sty lhs2TeX.fmt: lhs2TeX.fmt.lit lhs2TeX ./lhs2TeX --code lhs2TeX.fmt.lit > lhs2TeX.fmt lhs2TeX : $(sources) $(GHC) $(GHCFLAGS) -isrc --make -o lhs2TeX $(main) doc : bin cd doc; $(MAKE) # cd Guide; $(MAKE) Guide.pdf INSTALL : lhs2TeX INSTALL0 INSTALL1 cp INSTALL0 $@ ./lhs2TeX --searchpath >> $@ cat INSTALL1 >> $@ depend: $(GHC) -M -optdep-f -optdeplhs2TeX.d $(GHCFLAGS) $(sources) $(RM) -f lhs2TeX.d.bak lhs2TeX-includes : lhs2TeX.sty $(sections) $(snips) lhs2TeX.sty.tex lhs2TeX.fmt.tex Makefile.tex Lhs2TeX.dvi : lhs2TeX-includes Lhs2TeX.pdf : lhs2TeX-includes xdvi : Lhs2TeX.dvi $(XDVI) -s 3 Lhs2TeX.dvi & gv : Lhs2TeX.ps $(GV) Lhs2TeX.ps & print : Lhs2TeX.dvi $(DVIPS) -D600 -f Lhs2TeX.dvi | lpr -Pa -Zl install : bin doc $(MKINSTDIR) $(DESTDIR)$(bindir) $(INSTALL) -m 755 lhs2TeX $(DESTDIR)$(bindir) $(MKINSTDIR) $(DESTDIR)$(stydir) $(INSTALL) -m 644 lhs2TeX.sty lhs2TeX.fmt $(DESTDIR)$(stydir) $(INSTALL) -m 644 Library/*.fmt $(DESTDIR)$(stydir) $(MKINSTDIR) $(DESTDIR)$(docdir) $(INSTALL) -m 644 doc/Guide2.pdf $(DESTDIR)$(docdir) $(MKINSTDIR) $(DESTDIR)$(mandir)/man1 $(INSTALL) -m 644 lhs2TeX.1 $(DESTDIR)$(mandir)/man1 ifeq ($(INSTALL_POLYTABLE),yes) # install polytable package $(MKINSTDIR) $(DESTDIR)$(polydir) $(INSTALL) -m 644 polytable/*.sty $(DESTDIR)$(polydir) endif # $(MKINSTDIR) $(DESTDIR)$(texdir) # $(INSTALL) -m 644 Library/*.sty $(DESTDIR)$(texdir) ifndef DESTDIR $(MKTEXLSR) else echo "Please update the TeX filename database." endif srcdist : INSTALL doc if test -d $(DISTDIR); then $(RM) -rf $(DISTDIR); fi $(MKINSTDIR) $(DISTDIR) $(MKINSTDIR) $(DISTDIR)/src $(MKINSTDIR) $(DISTDIR)/doc $(MKINSTDIR) $(DISTDIR)/polytable $(MKINSTDIR) $(DISTDIR)/Testsuite $(MKINSTDIR) $(DISTDIR)/Examples $(MKINSTDIR) $(DISTDIR)/Library $(INSTALL) -m 644 $(psources) src/Version.lhs.in $(DISTDIR)/src $(INSTALL) -m 644 $(snipssrc) $(DISTDIR) $(INSTALL) -m 644 Setup.hs lhs2tex.cabal $(DISTDIR) $(INSTALL) -m 644 lhs2TeX.fmt.lit lhs2TeX.sty.lit $(DISTDIR) $(INSTALL) -m 644 Makefile common.mk config.mk.in $(DISTDIR) $(INSTALL) -m 644 lhs2TeX.1.in $(DISTDIR) $(INSTALL) -m 755 configure mkinstalldirs install-sh $(DISTDIR) $(INSTALL) -m 644 TODO AUTHORS LICENSE CHANGELOG $(DISTDIR) cat INSTALL | sed -e "s/@ProgramVersion@/$(PACKAGE_VERSION)/" \ > $(DISTDIR)/INSTALL chmod 644 $(DISTDIR)/INSTALL cd doc; $(MAKE) srcdist $(INSTALL) -m 644 polytable/*.{sty,pdf} $(DISTDIR)/polytable $(INSTALL) -m 644 Testsuite/*.{lhs,snip} Testsuite/Makefile $(DISTDIR)/Testsuite $(INSTALL) -m 644 Examples/*.lhs $(DISTDIR)/Examples $(INSTALL) -m 755 Examples/lhs2TeXpre $(DISTDIR)/Examples $(INSTALL) -m 644 Library/*.fmt $(DISTDIR)/Library tar --format=ustar -cvzf $(DISTDIR).tar.gz $(DISTDIR) chmod 644 $(DISTDIR).tar.gz ifdef DISTTYPE bindist: lhs2TeX lhs2TeX.fmt lhs2TeX.sty doc if test -d $(DISTDIR); then $(RM) -rf $(DISTDIR); fi $(MKINSTDIR) $(DISTDIR) $(MKINSTDIR) $(DISTDIR)/doc $(MKINSTDIR) $(DISTDIR)/polytable $(MKINSTDIR) $(DISTDIR)/Testsuite $(MKINSTDIR) $(DISTDIR)/Examples $(MKINSTDIR) $(DISTDIR)/Library $(INSTALL) -m 755 lhs2TeX $(DISTDIR) $(INSTALL) -m 644 lhs2TeX.fmt lhs2TeX.sty $(DISTDIR) $(INSTALL) -m 644 $(psources) Version.lhs.in $(snipssrc) $(DISTDIR) $(INSTALL) -m 644 lhs2TeX.fmt.lit lhs2TeX.sty.lit $(DISTDIR) $(INSTALL) -m 644 Makefile common.mk config.mk.in $(DISTDIR) $(INSTALL) -m 644 lhs2TeX.1.in $(DISTDIR) $(INSTALL) -m 755 configure mkinstalldirs install-sh $(DISTDIR) $(INSTALL) -m 644 TODO AUTHORS LICENSE CHANGELOG $(DISTDIR) cat INSTALL | sed -e "s/@ProgramVersion@/$(PACKAGE_VERSION)/" \ > $(DISTDIR)/INSTALL chmod 644 $(DISTDIR)/INSTALL cd doc; $(MAKE) srcdist $(INSTALL) -m 644 polytable/*.{sty,pdf} $(DISTDIR)/polytable $(INSTALL) -m 644 Testsuite/*.{lhs,snip} Testsuite/Makefile $(DISTDIR)/Testsuite $(INSTALL) -m 644 Examples/*.lhs $(DISTDIR)/Examples $(INSTALL) -m 755 Examples/lhs2TeXpre $(DISTDIR)/Examples $(INSTALL) -m 644 Library/*.fmt $(DISTDIR)/Library tar cvjf $(DISTDIR)-$(DISTTYPE).tar.bz2 $(DISTDIR) chmod 644 $(DISTDIR)-$(DISTTYPE).tar.bz2 else bindist: @echo "You must define DISTTYPE." endif backup: cd ..; \ $(RM) -f Literate.tar Literate.tar.gz; \ tar -cf Literate.tar Literate; \ gzip Literate.tar; \ chmod a+r Literate.tar.gz clean : # clean $(RM) -f lhs2TeX $(sections) $(snips) $(objects) *.hi *.dvi *.ps -$(RM) -f *.d *.dd *.ld *.ldd $(RM) -f lhs2TeX.sty lhs2TeX.fmt $(RM) -f Lhs2TeX.tex lhs2TeX.sty.tex lhs2TeX.fmt.tex Makefile.tex cd doc; $(MAKE) clean # all: # $(MAKE) install # $(MAKE) Lhs2TeX.dvi include common.mk lhs2tex-1.19/id.snip0000644000175000017500000000033112507035615015137 0ustar00andresandres00000000000000%format (MkId a) = a > newtype Id a = MkId a > instance Monad Id where > return a = MkId a > MkId a >>= f = f a {-""-} > MkId a >>= f = f a