Added Macintosh source tree for mac development
authorKeith Vetter <keithv@fusion.com>
Fri, 8 Sep 1995 03:16:18 +0000 (03:16 +0000)
committerKeith Vetter <keithv@fusion.com>
Fri, 8 Sep 1995 03:16:18 +0000 (03:16 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@6740 dc483132-0cff-0310-8789-dd5450dbe970

30 files changed:
src/mac/build/krb5-Worksheet [new file with mode: 0644]
src/mac/kconfig/ChangeLog [new file with mode: 0644]
src/mac/kconfig/KerberosHeaders.pch [new file with mode: 0644]
src/mac/kconfig/MakeFile [new file with mode: 0644]
src/mac/kconfig/ReleaseNotes [new file with mode: 0644]
src/mac/kconfig/WindowUtil.c [new file with mode: 0644]
src/mac/kconfig/WindowUtil.h [new file with mode: 0644]
src/mac/kconfig/WindowUtil.proto.h [new file with mode: 0644]
src/mac/kconfig/des_cornell.c [new file with mode: 0644]
src/mac/kconfig/desproto.h [new file with mode: 0644]
src/mac/kconfig/dnr.c [new file with mode: 0644]
src/mac/kconfig/encrypt.h [new file with mode: 0644]
src/mac/kconfig/getpasswd.c [new file with mode: 0644]
src/mac/kconfig/glue.h [new file with mode: 0644]
src/mac/kconfig/k.bw [new file with mode: 0644]
src/mac/kconfig/k.color [new file with mode: 0644]
src/mac/kconfig/kadm.c [new file with mode: 0644]
src/mac/kconfig/kadm.h [new file with mode: 0644]
src/mac/kconfig/kadm.proto.h [new file with mode: 0644]
src/mac/kconfig/kconfig.c [new file with mode: 0644]
src/mac/kconfig/kconfig.h [new file with mode: 0644]
src/mac/kconfig/kconfig.proto.h [new file with mode: 0644]
src/mac/kconfig/kconfig.r [new file with mode: 0644]
src/mac/kconfig/kconfig.sit.hqx [new file with mode: 0644]
src/mac/kconfig/kconfig.vers [new file with mode: 0644]
src/mac/kconfig/kpasswd.c [new file with mode: 0644]
src/mac/kconfig/ldef.c [new file with mode: 0644]
src/mac/krb5-Worksheet [deleted file]
src/mac/libraries/KerberosHeaders.pch [new file with mode: 0644]
src/mac/libraries/libraries.sit.hqx [new file with mode: 0644]

diff --git a/src/mac/build/krb5-Worksheet b/src/mac/build/krb5-Worksheet
new file mode 100644 (file)
index 0000000..d07d12b
--- /dev/null
@@ -0,0 +1,671 @@
+#
+# Extracted from old kerberos worksheet
+# Just the facts...
+# ¥ Makefiles for MPW tools are broken, MPW version 3.4 changed the libraries to link against
+# the error table compiler will not be built (.et), the files will be built on the unix side before bringover
+# 
+
+
+alias c MWC68K -w off
+alias C C
+
+directory gnu:k5mac:src:lib:
+
+# Clean a directory hierarchy of .o files
+directory gnu:k5mac:
+echo set exit 0
+for i in `files -d -r` ; ¶
+       echo delete {i}"Å.o" ; ¶
+end
+echo set exit 1
+
+#
+# copy krb5.hin to krb5.h
+#
+duplicate gnu:k5mac:src:include:krb5.hin gnu:k5mac:src:include:krb5.h
+#krb5-pro.h
+
+directory gnu:k5mac:src:include:
+catenate  krb5.hin :krb5:krb5_err.h :krb5:kdb5_err.h :krb5:kv5m_err.h :krb5:asn1_err.h > krb5.h
+
+
+#
+# Setup some standard defines
+#
+set krb5macdefines "-model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND"
+
+
+
+#
+# util:et
+#
+directory gnu:k5mac:src:util:et:
+for i in `files Å.c` ; ¶
+       echo c {i} {krb5macdefines} -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c com_err.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o com_err.c.o
+c compile_et.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o compile_et.c.o
+c error_message.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o error_message.c.o
+c et_name.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o et_name.c.o
+c init_et.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_et.c.o
+#jfm not relevant
+#c test_et.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o test_et.c.o
+c vfprintf.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o vfprintf.c.o
+
+
+#
+# ::::util:et:libcom_err.a
+#
+cd gnu:k5mac:src:util:et:
+lib -o libcom_err.a com_err.c.o init_et.c.o error_message.c.o et_name.c.o
+
+
+#
+# Notes on hacks to get things to work
+# ¥ Our precious mpw C compiler isn't really ansi as far as the libraries are concerned,
+#   we're missing <malloc.c>, so I'll create a dump which really includes <stdlib.h> where malloc is
+#   defined.  Lame.  Metrowerks doesn't have it either.
+#
+
+
+directory gnu:k5mac:src:lib:krb5
+open MakeFile
+
+buildprogram all
+
+# asn.1
+directory gnu:k5mac:src:lib:krb5:asn.1
+for i in `files Å.c` ; ¶
+       echo c {i} {krb5macdefines} -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c asn1_decode.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_decode.c.o
+c asn1_encode.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_encode.c.o
+c asn1_get.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_get.c.o
+c asn1_k_decode.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_k_decode.c.o
+c asn1_k_encode.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_k_encode.c.o
+c asn1_make.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_make.c.o
+c asn1_misc.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_misc.c.o
+c asn1buf.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1buf.c.o
+#c glue2.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o glue2.c.o
+c krb5_decode.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krb5_decode.c.o
+c krb5_encode.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krb5_encode.c.o
+
+# ccache
+directory gnu:k5mac:src:lib:krb5:ccache
+for i in `files Å.c` ; ¶
+       echo c {i} {krb5macdefines} -i :stdio: -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c ccbase.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i :stdio: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ccbase.c.o
+c ccdefault.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i :stdio: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ccdefault.c.o
+c ccdefops.c -model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND -i :stdio: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ccdefops.c.o
+
+
+# ccache:stdio
+# none of this works
+directory gnu:k5mac:src:lib:krb5:ccache:stdio
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i : -i :::::include -i :::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c scc_close.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_close.c.o
+c scc_defops.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_defops.c.o
+c scc_destry.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_destry.c.o
+c scc_errs.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_errs.c.o
+c scc_eseq.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_eseq.c.o
+c scc_gennew.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_gennew.c.o
+c scc_getnam.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_getnam.c.o
+c scc_gprin.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_gprin.c.o
+c scc_init.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_init.c.o
+c scc_maybe.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_maybe.c.o
+c scc_nseq.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_nseq.c.o
+c scc_ops.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_ops.c.o
+c scc_read.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_read.c.o
+c scc_reslv.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_reslv.c.o
+c scc_retrv.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_retrv.c.o
+c scc_sflags.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_sflags.c.o
+c scc_skip.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_skip.c.o
+c scc_sseq.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_sseq.c.o
+c scc_store.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_store.c.o
+#c scc_test.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_test.c.o
+c scc_write.c {krb5macdefines} -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_write.c.o
+
+
+# ccache:file
+# none of this works
+directory gnu:k5mac:src:lib:krb5:ccache:file
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i :::::include -i :::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c fcc_close.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_close.c.o
+c fcc_defops.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_defops.c.o
+c fcc_destry.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_destry.c.o
+c fcc_errs.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_errs.c.o
+c fcc_eseq.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_eseq.c.o
+c fcc_gennew.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_gennew.c.o
+c fcc_getnam.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_getnam.c.o
+c fcc_gprin.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_gprin.c.o
+c fcc_init.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_init.c.o
+c fcc_maybe.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_maybe.c.o
+c fcc_nseq.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_nseq.c.o
+c fcc_ops.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_ops.c.o
+c fcc_read.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_read.c.o
+c fcc_reslv.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_reslv.c.o
+c fcc_retrv.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_retrv.c.o
+c fcc_sflags.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_sflags.c.o
+c fcc_skip.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_skip.c.o
+c fcc_sseq.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_sseq.c.o
+c fcc_store.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_store.c.o
+#c fcc_test.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_test.c.o
+c fcc_write.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_write.c.o
+
+
+
+# keytab
+# buildprogram all -e
+directory gnu:k5mac:src:lib:krb5:keytab
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c ktadd.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktadd.c.o
+c ktbase.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktbase.c.o
+c ktdefault.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktdefault.c.o
+c ktfr_entry.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktfr_entry.c.o
+c ktremove.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktremove.c.o
+c read_servi.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o read_servi.c.o
+
+# keytab:file
+# buildprogram all -e
+directory gnu:k5mac:src:lib:krb5:keytab:file
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i :::::include -i :::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c ktf_add.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_add.c.o
+c ktf_close.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_close.c.o
+c ktf_defops.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_defops.c.o
+c ktf_endget.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_endget.c.o
+c ktf_g_ent.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_g_ent.c.o
+c ktf_g_name.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_g_name.c.o
+c ktf_next.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_next.c.o
+c ktf_ops.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_ops.c.o
+c ktf_remove.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_remove.c.o
+c ktf_resolv.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_resolv.c.o
+c ktf_ssget.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_ssget.c.o
+c ktf_util.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_util.c.o
+c ktf_wops.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_wops.c.o
+c ktf_wreslv.c {krb5macdefines} -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktf_wreslv.c.o
+
+
+# krb
+#buildprogram all -e
+directory gnu:k5mac:src:lib:krb5:krb
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c addr_comp.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o addr_comp.c.o
+c addr_order.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o addr_order.c.o
+c addr_srch.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o addr_srch.c.o
+c auth_con.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o auth_con.c.o
+c bld_pr_ext.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o bld_pr_ext.c.o
+c bld_princ.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o bld_princ.c.o
+c chk_trans.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o chk_trans.c.o
+c compat_recv.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o compat_recv.c.o
+c conv_princ.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o conv_princ.c.o
+c copy_addrs.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_addrs.c.o
+c copy_athctr.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_athctr.c.o
+c copy_auth.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_auth.c.o
+c copy_cksum.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_cksum.c.o
+c copy_creds.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_creds.c.o
+c copy_data.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_data.c.o
+c copy_key.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_key.c.o
+c copy_princ.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_princ.c.o
+c copy_tick.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_tick.c.o
+c cp_key_cnt.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o cp_key_cnt.c.o
+c decode_kdc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o decode_kdc.c.o
+c decrypt_tk.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o decrypt_tk.c.o
+c encode_kdc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o encode_kdc.c.o
+c encrypt_tk.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o encrypt_tk.c.o
+c free_rtree.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o free_rtree.c.o
+c gc_frm_kdc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gc_frm_kdc.c.o
+c gc_via_tkt.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gc_via_tkt.c.o
+c gen_seqnum.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gen_seqnum.c.o
+c gen_subkey.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gen_subkey.c.o
+c get_creds.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o get_creds.c.o
+c get_in_tkt.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o get_in_tkt.c.o
+c in_tkt_ktb.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o in_tkt_ktb.c.o
+c in_tkt_pwd.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o in_tkt_pwd.c.o
+c in_tkt_sky.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o in_tkt_sky.c.o
+c init_ctx.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_ctx.c.o
+c kdc_rep_dc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o kdc_rep_dc.c.o
+c krbconfig.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krbconfig.c.o
+c mk_cred.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_cred.c.o
+c mk_error.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_error.c.o
+c mk_priv.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_priv.c.o
+c mk_rep.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_rep.c.o
+c mk_req.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_req.c.o
+c mk_req_ext.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_req_ext.c.o
+c mk_safe.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_safe.c.o
+c parse.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o parse.c.o
+c pr_to_salt.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o pr_to_salt.c.o
+c preauth.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o preauth.c.o
+c princ_comp.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o princ_comp.c.o
+c rd_cred.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_cred.c.o
+c rd_error.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_error.c.o
+c rd_priv.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_priv.c.o
+c rd_rep.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_rep.c.o
+c rd_req.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_req.c.o
+c rd_req_dec.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_req_dec.c.o
+c rd_safe.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_safe.c.o
+c recvauth.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o recvauth.c.o
+c send_tgs.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o send_tgs.c.o
+c sendauth.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o sendauth.c.o
+c srv_rcache.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o srv_rcache.c.o
+#c t_kerb.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_kerb.c.o
+#c t_walk_rtree.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_walk_rtree.c.o
+c tgtname.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o tgtname.c.o
+c unparse.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o unparse.c.o
+c walk_rtree.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o walk_rtree.c.o
+beep
+
+
+
+#buildprogram all -e
+#JFM using a posix open function, need a posix library (Hacked system header for that)
+directory gnu:k5mac:src:lib:krb5:rcache
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c rc_base.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rc_base.c.o
+c rc_conv.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rc_conv.c.o
+c rc_dfl.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rc_dfl.c.o
+c rc_io.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rc_io.c.o
+c rcdef.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rcdef.c.o
+
+#buildprogram all -e
+directory gnu:k5mac:src:lib:krb5:free
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c f_addr.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_addr.c.o
+c f_address.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_address.c.o
+c f_ap_rep.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_ap_rep.c.o
+c f_ap_req.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_ap_req.c.o
+c f_arep_enc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_arep_enc.c.o
+c f_auth_cnt.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_auth_cnt.c.o
+c f_authdata.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_authdata.c.o
+c f_authent.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_authent.c.o
+c f_chksum.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_chksum.c.o
+c f_cred.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cred.c.o
+c f_cred_cnt.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cred_cnt.c.o
+c f_cred_enc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cred_enc.c.o
+c f_creds.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_creds.c.o
+c f_enc_kdc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_enc_kdc.c.o
+c f_enc_tkt.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_enc_tkt.c.o
+c f_error.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_error.c.o
+c f_kdc_rp.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_kdc_rp.c.o
+c f_kdc_rq.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_kdc_rq.c.o
+c f_keyblock.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_keyblock.c.o
+c f_last_req.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_last_req.c.o
+c f_padata.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_padata.c.o
+c f_princ.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_princ.c.o
+c f_priv.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_priv.c.o
+c f_priv_enc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_priv_enc.c.o
+c f_pwd_data.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_pwd_data.c.o
+c f_pwd_seq.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_pwd_seq.c.o
+c f_safe.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_safe.c.o
+c f_tckt.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tckt.c.o
+c f_tckts.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tckts.c.o
+c f_tgt_cred.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tgt_cred.c.o
+c f_tkt_auth.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tkt_auth.c.o
+
+
+#JFM using a posix open function, need a posix library to continue
+#buildprogram all -e
+directory gnu:k5mac:src:lib:krb5:os
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c an_to_ln.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o an_to_ln.c.o
+c ccdefname.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ccdefname.c.o
+c def_realm.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o def_realm.c.o
+c DNR.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o DNR.c.o
+c free_hstrl.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o free_hstrl.c.o
+c free_krbhs.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o free_krbhs.c.o
+c full_ipadr.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o full_ipadr.c.o
+c gen_port.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gen_port.c.o
+c gen_rname.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gen_rname.c.o
+c genaddrs.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o genaddrs.c.o
+c get_krbhst.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o get_krbhst.c.o
+c gmt_mktime.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gmt_mktime.c.o
+c hst_realm.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o hst_realm.c.o
+c init_os_ctx.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_os_ctx.c.o
+c krbfileio.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krbfileio.c.o
+c ktdefname.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktdefname.c.o
+c kuserok.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o kuserok.c.o
+c localaddr.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o localaddr.c.o
+c locate_kdc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o locate_kdc.c.o
+c lock_file.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o lock_file.c.o
+c macsock.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o macsock.c.o
+c mk_faddr.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_faddr.c.o
+c net_read.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o net_read.c.o
+c net_write.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o net_write.c.o
+c osconfig.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o osconfig.c.o
+c port2ip.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o port2ip.c.o
+c read_msg.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o read_msg.c.o
+c read_pwd.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o read_pwd.c.o
+c realm_dom.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o realm_dom.c.o
+c sendto_kdc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o sendto_kdc.c.o
+c sn2princ.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o sn2princ.c.o
+#c t_an_to_ln.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_an_to_ln.c.o
+#c t_std_conf.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_std_conf.c.o
+c timeofday.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o timeofday.c.o
+c unlck_file.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o unlck_file.c.o
+c ustime.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ustime.c.o
+c write_msg.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o write_msg.c.o
+
+
+#
+# Posix compatibility library
+#
+directory gnu:k5mac:src:lib:krb5:posix
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+#c daemon.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o daemon.c.o
+c getuid.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o getuid.c.o
+c memmove.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o memmove.c.o
+c strcasecmp.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o strcasecmp.c.o
+c strdup.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o strdup.c.o
+c strerror.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o strerror.c.o
+c syslog.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o syslog.c.o
+#c vfprintf.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o vfprintf.c.o
+#c vsprintf.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o vsprintf.c.o
+
+
+#
+# error tables
+#
+directory gnu:k5mac:src:lib:krb5:error_tables
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c adm_err.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o adm_err.c.o
+c asn1_err.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_err.c.o
+c init_ets.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_ets.c.o
+c kdb5_err.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o kdb5_err.c.o
+c krb5_err.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krb5_err.c.o
+c kv5m_err.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o kv5m_err.c.o
+
+#
+# profile
+#
+directory gnu:k5mac:src:util:profile
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i : -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c prof_err.c {krb5macdefines} -i : -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_err.c.o
+c prof_file.c {krb5macdefines} -i : -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_file.c.o
+c prof_init.c {krb5macdefines} -i : -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_init.c.o
+c prof_parse.c {krb5macdefines} -i : -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_parse.c.o
+c prof_section.c {krb5macdefines} -i : -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_section.c.o
+c prof_tree.c {krb5macdefines} -i : -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_tree.c.o
+#c test_parse.c {krb5macdefines} -i : -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o test_parse.c.o
+#c test_profile.c {krb5macdefines} -i : -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o test_profile.c.o
+
+#
+# Build the libkrb5.a
+#
+cd gnu:k5mac:src:lib:
+delete libkrb5.a
+lib -o libkrb5.a ¶
+       ::util:profile:prof_err.c.o ¶
+       ::util:profile:prof_file.c.o ¶
+       ::util:profile:prof_init.c.o ¶
+       ::util:profile:prof_parse.c.o ¶
+       ::util:profile:prof_section.c.o ¶
+       ::util:profile:prof_tree.c.o ¶
+       `files :krb5:ccache:stdio:Å.o` ¶
+       `files :krb5:os:Å.o` ¶
+       `files :krb5:rcache:Å.o` ¶
+       `files :krb5:free:Å.o` ¶
+       `files :krb5:error_tables:Å.o` ¶
+       `files :krb5:asn.1:Å.o` ¶
+       `files :krb5:ccache:Å.o` ¶
+       `files :krb5:ccache:file:Å.o` ¶
+       `files :krb5:keytab:Å.o` ¶
+       `files :krb5:keytab:file:Å.o` ¶
+       :krb5:krb:addr_comp.c.o ¶
+       :krb5:krb:addr_order.c.o ¶
+       :krb5:krb:addr_srch.c.o ¶
+       :krb5:krb:auth_con.c.o ¶
+       :krb5:krb:bld_pr_ext.c.o ¶
+       :krb5:krb:bld_princ.c.o ¶
+       :krb5:krb:chk_trans.c.o ¶
+       :krb5:krb:compat_recv.c.o ¶
+       :krb5:krb:conv_princ.c.o ¶
+       :krb5:krb:copy_addrs.c.o ¶
+       :krb5:krb:copy_athctr.c.o ¶
+       :krb5:krb:copy_auth.c.o ¶
+       :krb5:krb:copy_cksum.c.o ¶
+       :krb5:krb:copy_creds.c.o ¶
+       :krb5:krb:copy_data.c.o ¶
+       :krb5:krb:copy_key.c.o ¶
+       :krb5:krb:copy_princ.c.o ¶
+       :krb5:krb:copy_tick.c.o ¶
+       :krb5:krb:cp_key_cnt.c.o ¶
+       :krb5:krb:decode_kdc.c.o ¶
+       :krb5:krb:decrypt_tk.c.o ¶
+       :krb5:krb:encode_kdc.c.o ¶
+       :krb5:krb:encrypt_tk.c.o ¶
+       :krb5:krb:free_rtree.c.o ¶
+       :krb5:krb:gc_frm_kdc.c.o ¶
+       :krb5:krb:gc_via_tkt.c.o ¶
+       :krb5:krb:gen_seqnum.c.o ¶
+       :krb5:krb:gen_subkey.c.o ¶
+       :krb5:krb:get_creds.c.o ¶
+       :krb5:krb:get_in_tkt.c.o ¶
+       :krb5:krb:in_tkt_ktb.c.o ¶
+       :krb5:krb:in_tkt_pwd.c.o ¶
+       :krb5:krb:in_tkt_sky.c.o ¶
+       :krb5:krb:init_ctx.c.o ¶
+       :krb5:krb:kdc_rep_dc.c.o ¶
+       :krb5:krb:krbconfig.c.o ¶
+       :krb5:krb:mk_cred.c.o ¶
+       :krb5:krb:mk_error.c.o ¶
+       :krb5:krb:mk_priv.c.o ¶
+       :krb5:krb:mk_rep.c.o ¶
+       :krb5:krb:mk_req.c.o ¶
+       :krb5:krb:mk_req_ext.c.o ¶
+       :krb5:krb:mk_safe.c.o ¶
+       :krb5:krb:parse.c.o ¶
+       :krb5:krb:pr_to_salt.c.o ¶
+       :krb5:krb:preauth.c.o ¶
+       :krb5:krb:princ_comp.c.o ¶
+       :krb5:krb:rd_cred.c.o ¶
+       :krb5:krb:rd_error.c.o ¶
+       :krb5:krb:rd_priv.c.o ¶
+       :krb5:krb:rd_rep.c.o ¶
+       :krb5:krb:rd_req.c.o ¶
+       :krb5:krb:rd_req_dec.c.o ¶
+       :krb5:krb:rd_safe.c.o ¶
+       :krb5:krb:recvauth.c.o ¶
+       :krb5:krb:send_tgs.c.o ¶
+       :krb5:krb:sendauth.c.o ¶
+       :krb5:krb:srv_rcache.c.o ¶
+       :krb5:krb:tgtname.c.o ¶
+       :krb5:krb:unparse.c.o ¶
+       :krb5:krb:walk_rtree.c.o ¶
+       :krb5:posix:getuid.c.o ¶
+       :krb5:posix:strcasecmp.c.o ¶
+       :krb5:posix:strdup.c.o ¶
+       :krb5:posix:syslog.c.o
+
+
+#
+# crypto
+#
+directory gnu:k5mac:src:lib:crypto
+delete Å.c.o
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c cryptoconf.c {krb5macdefines} -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o cryptoconf.c.o
+c des_crc.c {krb5macdefines} -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o des_crc.c.o
+c des_md5.c {krb5macdefines} -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o des_md5.c.o
+c raw_des.c {krb5macdefines} -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o raw_des.c.o
+
+#
+# crc32
+#
+directory gnu:k5mac:src:lib:crypto:crc32:
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c crc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o crc.c.o
+c crctest.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o crctest.c.o
+
+#
+# des
+#
+directory gnu:k5mac:src:lib:crypto:des:
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c cbc_cksum.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o cbc_cksum.c.o
+c cs_entry.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o cs_entry.c.o
+c destest.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o destest.c.o
+c f_cbc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cbc.c.o
+c f_cksum.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cksum.c.o
+c f_ecb.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_ecb.c.o
+c f_parity.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_parity.c.o
+c f_pcbc.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_pcbc.c.o
+c f_sched.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_sched.c.o
+c f_tables.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tables.c.o
+c fin_rndkey.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fin_rndkey.c.o
+c finish_key.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o finish_key.c.o
+c init_rkey.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_rkey.c.o
+c key_sched.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o key_sched.c.o
+c new_rn_key.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o new_rn_key.c.o
+c process_ky.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o process_ky.c.o
+c random_key.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o random_key.c.o
+c string2key.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o string2key.c.o
+c verify.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o verify.c.o
+c weak_key.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o weak_key.c.o
+
+
+#
+# md4
+#
+directory gnu:k5mac:src:lib:crypto:md4:
+delete Å.o
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::des -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c md4.c {krb5macdefines} -i ::des -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md4.c.o
+c md4crypto.c {krb5macdefines} -i ::des -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md4crypto.c.o
+c md4driver.c {krb5macdefines} -i ::des -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md4driver.c.o
+c md4glue.c {krb5macdefines} -i ::des -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md4glue.c.o
+
+#
+# md5 stuff
+#
+directory gnu:k5mac:src:lib:crypto:md5:
+delete Å.o
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::des: -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c md5.c {krb5macdefines} -i ::des: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md5.c.o
+c md5crypto.c {krb5macdefines} -i ::des: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md5crypto.c.o
+c md5glue.c {krb5macdefines} -i ::des: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md5glue.c.o
+c t_mddriver.c {krb5macdefines} -i ::des: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_mddriver.c.o
+
+#
+# os, done
+#
+directory gnu:k5mac:src:lib:crypto:os:
+delete Å.o
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c rnd_confoun.c {krb5macdefines} -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rnd_confoun.c.o
+
+#
+# libcrypto
+#
+cd gnu:k5mac:src:lib:
+lib -o libcrypto.a ¶
+       `files :crypto:Å.o` ¶
+       :crypto:crc32:crc.c.o ¶
+       :crypto:des:cbc_cksum.c.o ¶
+       :crypto:des:weak_key.c.o ¶
+       :crypto:des:cs_entry.c.o ¶
+       :crypto:des:f_cbc.c.o ¶
+       :crypto:des:f_cksum.c.o ¶
+       :crypto:des:f_ecb.c.o ¶
+       :crypto:des:f_pcbc.c.o ¶
+       :crypto:des:f_sched.c.o ¶
+       :crypto:des:f_tables.c.o ¶
+       :crypto:des:f_parity.c.o ¶
+       :crypto:des:fin_rndkey.c.o ¶
+       :crypto:des:finish_key.c.o ¶
+       :crypto:des:init_rkey.c.o ¶
+       :crypto:des:key_sched.c.o ¶
+       :crypto:des:process_ky.c.o ¶
+       :crypto:des:random_key.c.o ¶
+       :crypto:des:new_rn_key.c.o ¶
+       :crypto:des:string2key.c.o ¶
+       :crypto:md4:md4.c.o ¶
+       :crypto:md4:md4crypto.c.o ¶
+       :crypto:md4:md4glue.c.o ¶
+       :crypto:md5:md5.c.o ¶
+       :crypto:md5:md5crypto.c.o ¶
+       :crypto:md5:md5glue.c.o ¶
+       `files :crypto:os:Å.o`
+
+==========================================
+# Error code compiler
+# for the ".et" files
+# punt on building the error compiler
+#cd gnu:k5mac:src:util:et:
+#files
+
+
+==========================================
+# kinit compilation
+#
+set krb5macdefines "-model far -d _MACINTOSH -d SIZEOF_INT=4 -d SIZEOF_SHORT=2 -d HAVE_SRAND"
+cd gnu:k5mac:src:clients:kinit:
+delete Å.o
+for i in `files Å.c` ; ¶
+       echo c {i} '{krb5macdefines}' -i :::include -i :::include:krb5 -i {CIncludes} -o {i}.o ;¶
+end
+
+c getopt.c {krb5macdefines} -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o getopt.c.o
+c kinit.c {krb5macdefines} -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o kinit.c.o
+Link     -model far -t MPST -c "MPS " -sym on ¶
+       :::lib:libkrb5.a :::lib:libcrypto.a :::util:et:libcom_err.a ¶
+       {CLibraries}"StdClib."o ¶
+       {Libraries}"Runtime."o¶
+       {Libraries}"Interface."o¶
+       -o kinit  kinit.c.o getopt.c.o
+
+kinit mattly
+
diff --git a/src/mac/kconfig/ChangeLog b/src/mac/kconfig/ChangeLog
new file mode 100644 (file)
index 0000000..9e85ebe
--- /dev/null
@@ -0,0 +1,50 @@
+Mon Feb  6 16:47:17 1995  John Gilmore  (gnu at toad.com)
+
+       * kconfig.c (kerror):  Call krb_get_err_text instead of having a
+       private copy of the error message texts.
+       (main):  When can't talk to Kerb driver, can't interpret an error
+       code either; just complain directly.
+       * krb_err_txt.c:  Removed.
+
+       * kconfig.c (main):  Call krb_start_session (from mac_stubs) to find
+       driver.  This enables us to make ordinary Kerberos subroutine 
+       calls rather than being stuck with driver calls.
+       * MakeFile (OBJS):  Add mac_stubs.c.o.
+       (mac_stubs.c):  Add rule to copy this file from src/lib/krb.
+
+Sun Feb  5 12:43:43 1995  John Gilmore  (gnu at toad.com)
+
+       * kconfig.c (openprefres):  Change Preferences file name to 'CNS
+       Config Preferences'
+       (doupdate):  Move more useless code inside #ifdef notdef.
+       * MakeFile: Output map file is now 'CNS Config.MAP'.
+       * %kconfig.rsrc (About DITL):  Add text about CNS Config and Cygnus.
+       (About DLOG):  Increase size of the about box to hold the above.
+
+Sun Feb  5 10:49:03 1995  John Gilmore  (gnu at toad.com)
+
+       * %kconfig.rsrc (Apple menu):  "About KConfig" -> "About CNS Config".
+       (File menu):  Add "Close Window (apple-W) item.
+       (main DITL):  Window title "Kerberos Configuration" -> "CNS Kerberos
+       Configuration".
+       * MakeFile:  Remove obj subdir and all references to it.  Remove
+       references to include files that were moved to src/include.
+       (all):  Build 'CNS Config' by default.
+       (KRBFOLDER):  Remove all references.
+       (INCFOLDER):  Add, pointing to src/include.
+       (KConfig):  Rename to 'CNS Config'.
+       * obj:  Remove subdir for building object files; they're now
+       built in the main directory.
+       * kadm.c, kconfig.c: Fix include file names to have correct
+       upper/lower case.  (This doesn't matter in Mac native file
+       systems, but matters over NFS.)
+       * kconfig.c, kconfig.h:  Add case for "Close Window" in the File
+       menu, to make apple-W work.
+       * kconfig.r:  Remove "obj" reference.  Change Kconfig to CNS Config.
+
+Sat Feb  4 19:44:35 1995  John Gilmore  (gnu at toad.com)
+
+       * AddressXlation.h, mactcpcommontypes.h, Krb_driver.h, udppb.h,
+       tcppb.h, getmyipaddr.h:  Remove; use the versions in src/include.
+       * des_cornell.c, desproto.h:  Moved these here from ../Krb.
+
diff --git a/src/mac/kconfig/KerberosHeaders.pch b/src/mac/kconfig/KerberosHeaders.pch
new file mode 100644 (file)
index 0000000..b41f952
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ *     KerberosHeaders.pch
+ *
+ *     Script to generate the 'MacHeaders<xxx>' precompiled header for Metrowerks C/C++.
+ *  Copyright © 1993 metrowerks inc.  All rights reserved.
+ * Modified for Kerberos5 Mac port to include compile options
+ */
+
+/*
+ * Add the compile flag switches for kerberos compile
+ */
+#define _MWERKS
+#define _MACINTOSH
+#define SIZEOF_INT 4
+#define SIZEOF_SHORT 2
+#define HAVE_SRAND
+#define NO_PASSWORD
+#define HAS_LABS
+#define ENOMEM -1
+#define ANSI_STDIO
+typedef unsigned int size_t;
+#define _SIZET
+#include <unix.h>
+#include <ctype.h>
+#define KRB5 1
+
+#define PROVIDE_RSA_MD4
+#define PROVIDE_RSA_MD5
+#define PROVIDE_SNEFRU
+#define PROVIDE_DES_CBC_CKSUM
+#define PROVIDE_DES_CBC_CRC
+#define PROVIDE_DES_CBC_MD5
+#define PROVIDE_RAW_DES_CBC
+
+typedef int datum;
+
+//jfm need to reimplement
+#define mktemp(a)
+
+enum {
+ENOENT = -43,
+EPERM,
+EACCES,
+EISDIR,
+ENOTDIR,
+ELOOP,
+ETXTBSY,
+EBUSY,
+EROFS,
+EINVAL,
+EEXIST,
+EFAULT,
+EBADF,
+ENAMETOOLONG,
+EWOULDBLOCK,
+EDQUOT,
+ENOSPC,
+EIO,
+ENFILE,
+EMFILE,
+ENXIO
+};
+#define HAVE_STRFTIME 1
+#define MAXPATHLEN 255
+#define HAVE_SYSLOG_H 1
+
+/*
+ *     Support for automatically naming the precompiled header file ...
+ */
+
+#ifdef __cplusplus
+ #ifdef powerc
+  #pragma precompile_target "MacKrbPPC++"
+ #else
+  #pragma precompile_target "MacKrb68K++"
+ #endif
+#else
+ #ifdef powerc
+  #pragma precompile_target "MacKrbPPC"
+ #else
+  #pragma precompile_target "MacKrb68K"
+ #endif
+#endif
+
+/*
+ *     Now just include the "MacHeaders.c" source file ...
+ */
+
+#include "MacHeaders.c"
+
diff --git a/src/mac/kconfig/MakeFile b/src/mac/kconfig/MakeFile
new file mode 100644 (file)
index 0000000..b9c3690
--- /dev/null
@@ -0,0 +1,250 @@
+#
+# Copyright 1991-1994 by The University of Texas at Austin
+# All rights reserved.
+#
+# For infomation contact:
+# Rick Watson
+# University of Texas
+# Computation Center, COM 1
+# Austin, TX 78712
+# r.watson@utexas.edu
+# 512-471-3241
+#
+#
+# MPW-style lines for the MakeFile.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+#
+# This first part is long enough that NFS/Share doesn't notice the non-ASCII
+# characters in the rest of the file, so it claims that the file is type
+# TEXT, which is what we want.  The non-ASCII chars are necessary for MPW 
+# Make.
+
+all Ä 'CNS Config'
+
+#define dangerouspattersn
+INCFOLDER= :::include:
+
+OBJS = ¶
+       kconfig.c.o ¶
+       WindowUtil.c.o ¶
+       kadm.c.o ¶
+       mac_stubs.c.o ¶
+       des_cornell.c.o ¶
+       dnr.c.o
+
+COptions = -sym full -w -mbg ch8 -b -r -i "{INCFOLDER}"
+
+#
+# our ldef
+#
+ldef.rsrc Ä ldef.c.o
+       Link -w -rt LDEF=128 ldef.c.o -o ldef.rsrc
+       
+#
+# kconfig
+#
+'CNS Config' Ä kconfig.r kconfig.rsrc kconfig.vers ldef.rsrc {OBJS}
+       Delete -i 'CNS Config'
+       Link -sym Full -map -mf -ra =resProtected -msg nodup -o 'CNS Config' ¶
+               -t APPL -c 'RWkc' -l ¶
+               {OBJS} ¶
+               "{Libraries}"Interface.o ¶
+               "{CLibraries}"StdCLib.o ¶
+               "{Libraries}"Runtime.o ¶
+               > 'CNS Config.map'
+       Rez -append -o 'CNS Config' kconfig.r
+       setfile -a B 'CNS Config'
+       
+SRCS= ¶
+       glue.h ¶
+       ldef.c ¶
+       Makefile ¶
+       kconfig.c ¶
+       kconfig.h ¶
+       kconfig.r ¶
+       kconfig.rsrc ¶
+       kconfig.vers ¶
+       WindowUtil.c ¶
+       WindowUtil.h ¶
+       ReleaseNotes ¶
+       kadm.c ¶
+       kadm.h ¶
+       dnr.c ¶
+       encrypt.h
+
+mac_stubs.c Ä :::lib:krb:mac_stubs.c
+       duplicate -y :::lib:krb:mac_stubs.c mac_stubs.c
+
+# version 8.0 is K8 10/08/93
+# version 9.0 is K9 10/14/93
+# version 10.0 is version released to Cygnus, 9/8/94
+       
+newversion Ä
+       set newversion 10.0
+       project kconfigProject
+       for i in {SRCS}
+         checkin -m -y -t "b{newversion}" "{i},{newversion}"
+       end
+
+orphans Ä
+       for i in {SRCS}
+               Echo "Delete 'ckid';" | Rez -a -m -o "{i}"
+       end
+
+#
+# Xport disk
+#
+xportdisk Ä
+       for i in {SRCS}
+               duplicate -y {i} xport:kconfig:{i}
+       end
+
+clean Ä
+       delete -y Ŷ~
+       delete -y Ŷ#
+
+#
+# Prototypes.
+#
+# Prototypes are not automatically built -- use target "proto" or "depend".
+#
+# Builds {file}.proto.h.new and then duplicates that file as
+# {file}.proto.h only if the files are different. This prevents
+# recompiles due to proto.h files that didn't actually change.
+# 
+# Building {file}.proto.h.new instead of {file}.proto.h also prevents 
+# spurious invocations of mkptypes whenever a file that {file}.proto.h 
+# depends on changes.
+#
+
+PTYPES = ¶
+       :proto:kconfig.proto.h.new ¶
+       :proto:WindowUtil.proto.h.new ¶
+       :proto:kadm.proto.h.new 
+
+# default rule for relating prototype.h.new files to source files
+":proto:" Ä ":"
+
+proto Ä {PTYPES}
+
+.proto.h.new Ä .c
+       mkptypes -A -e -W "{Default}.c" > "{TargDir}{Default}.proto.h.new"
+       equal -d -q "{Default}.proto.h" "{TargDir}{Default}.proto.h.new" || ¶
+               duplicate -y "{TargDir}{Default}.proto.h.new" "{Default}.proto.h"
+
+#
+# Dependancies
+#
+CPP = ¶
+       :cpp:kconfig.cpp ¶
+       :cpp:WindowUtil.cpp ¶
+       :cpp:kadm.cpp ¶
+       :cpp:des_cornell.cpp
+
+# default rule for relating object files to source files
+":cpp:" Ä ¶
+       ":"
+
+# Rule to build .cpp preprocessor output files. Syntax check only and write cpp output.
+.cpp Ä .c
+       C "{DepDir}{Default}.c" -e2 -c {COptions} > "{TargDir}{Default}.cpp"
+       
+depend Ä {CPP} proto
+       perl "{mpw}local:depend.perl" Makefile ":cpp:" ":obj:" {CPP}
+       Rename -y Makefile Makefile.bak
+       Rename -y Makefile.new Makefile
+       Echo "Include ¶"Makefile.bak¶" 'ckid';" | Rez -m -a -o "Makefile" #Transfer the ckid
+
+
+# DO NOT DELETE THIS LINE -- mkdep uses it.
+# DO NOT PUT ANYTHING AFTER THIS LINE. IT WILL GO AWAY.
+
+kconfig.c.o Ä "kconfig.proto.h"
+kconfig.c.o Ä "kconfig.c"
+kconfig.c.o Ä "kconfig.vers"
+kconfig.c.o Ä "glue.h"
+kconfig.c.o Ä "kconfig.h"
+
+WindowUtil.c.o Ä "glue.h"
+WindowUtil.c.o Ä "WindowUtil.c"
+WindowUtil.c.o Ä "WindowUtil.h"
+
+kadm.c.o Ä "kconfig.proto.h"
+kadm.c.o Ä "kadm.c"
+kadm.c.o Ä "desproto.h"
+kadm.c.o Ä "kadm.h"
+kadm.c.o Ä "glue.h"
+kadm.c.o Ä "kadm.proto.h"
+kadm.c.o Ä "kconfig.h"
+
+des_cornell.c.o Ä "glue.h"
+des_cornell.c.o Ä "des_cornell.c"
+des_cornell.c.o Ä "desproto.h"
+des_cornell.c.o Ä "encrypt.h"
+
+# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
+
diff --git a/src/mac/kconfig/ReleaseNotes b/src/mac/kconfig/ReleaseNotes
new file mode 100644 (file)
index 0000000..b7b8f24
--- /dev/null
@@ -0,0 +1,172 @@
+Relase notes for Kerberized NCSA/Telnet, Brown/TN3270, Kdriver, and KConfig.
+
+Please direct comments and questions to:
+
+  Rick Watson
+  The University of Texas at Austin
+  Computation Center / Networking Services
+  Austin  TX  78712
+  R.Watson@utexas.edu.
+
+---------------------------------------------------------------------------\ 2   
+Release K11 11/2/93
+
+¥ Telnet: Fix a problem with recovering the screen pointer in netwrite.
+¥ Telnet/tn3270/krb: Dynamically allocate encryption data when needed.
+¥ Telnet: Fix memory leaks and pointer bugs.
+
+---------------------------------------------------------------------------\ 2   
+Release K10 
+
+¥ Fixed some MPW-version specific bugs including garbled strings.
+
+---------------------------------------------------------------------------\ 2   
+Release K9 10/14/93
+
+¥ Telnet: fixed crashes when using Finger.
+
+¥ KConfig: added password changing code.
+¥ KConfig: updated icons.
+¥ KConfig: remember window position.
+¥ KConfig: make sure that DeviceLoop is available before using it.
+
+¥ kDriver: added more functions to cKrbGetDesPointers. fixed a bug in cKrbSetPassword.
+
+WARNING: Do not mix different versions of the K8 and K9 clients and kDriver. There are incompatible changes. If you mix them, you will probably crash.
+
+---------------------------------------------------------------------------\ 2   
+Release K8 10/08/93
+
+The changes to support Kerberos authentication and DES encryption for Telnet and TN3270 were both made to beta versions of those programs. I hope that the authors of each will take back these changes for the release versions of these applications. For NCSA/Telnet, I have rewritten the Kerberos changes that you may have seen in releases K1-K7 of NCSA/Telnet.
+
+Both applications now use Cornell's Kdriver package for Kerberos and encryption support routines. I have written KConfig, an application to configure settings for Kdriver.
+I have made some additions to Kdriver and fixed some bugs, so you should probably use the version that I have included in this test package.  If you use an unmodified Cornell driver, encryption will not be supported, some settings changes made by KConfig won't be saved in the preferences file, and the ticket display may show garbage for the user realm.
+
+Kdriver supports Kerberos V4. Kdriver requires that each Kerberos server host also be running a UDP daytime server.
+
+NCSA/Telnet and TN3270 support the Telnet Authentication and Encryption options described in RFC1411/1416 and IETF drafts dated July 1991. Future versions may support the IETF draft AUTH_ENCRYPT option described in the draft dated April 1993.
+
+Kerberos support for TN3270 has not been tested for 3270 sessions yet since we don't currently have a Kerberized tn3270 server running. I don't expect any problems related to 3270 sessions.
+
+¥ INSTALLATION / KConfig
+
+Kdriver must be installed in your System Folder to work. Drag the file "Kerberos Client" file to your closed System Folder. On System 7 machines, you will be asked to verify that the file will be placed into your Extensions folder.
+
+Reboot your Macintosh and use KConfig to configure settings for your Kerberos envrionment.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Domain/Hostname to Realm maps are useful if you are supporting more than one Kerberos realm. The map will attempt to match up a Kerberos realm with IP domain names.
+
+Enter Kerberos server IP addresses or hostnames for each Kerberos realm that you are using. After you have entered your Kerberos servers, you can pick your local realm using the popup menu at the top of the configuration dialog.
+
+The "Login" button will allow you to authenticate to a Kerberos server and obtain an initial ticket granting ticket for other services. You don't have to login using KConfig -- the individual client applications will prompt you when a password is needed.
+
+The "Logout" button destroys all tickets.
+
+Use the "File/Show Credentials" menu item to display all your Kerberos tickets.
+
+The "Change Password" button allows you to change your Kerberos password.
+
+You may (or may not) have to reboot after making initial settings. 
+
+¥ NCSA/Telnet
+
+Options to Authenticate and/or Encrypt a session occur in two places in Telnet.
+
+This is the session configuration dialog.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Select the appropriate options for each session that you configure, including the Default session. Options for the default session will be presented in the Open Connection dialog box. 
+
+
+
+
+
+
+
+
+
+
+
+
+
+You may select the Authenticate and Encrypt options when opening a session. The Authenticate options is required for Encryption. Ftp sessions cannot currently be authenticated or encrypted.
+
+¥ TN3270
+
+The authenticate and encrypt options are for TN3270 are in the "Special" dialog box, entered from the Open Connection dialog.
+
+
+
+
+
+
+
+
+
+
+
+Authenticate is required to Encrypt.
+
+¥ Encryption Active Indicators.
+
+Padlock indicators serve as a visual indicator that a session is encrypted. For Telnet, this is  displayed next to the zoom box in the window's titlebar.
+
+
+
+
+
+
+For TN3270, the indicator is displayed in the bottom status line, adjacent to the date and time. 
+
+
+
+
+
+
+If anything other than the padlock is displayed, the session is not two-way encrypted. An arrow indicates that the session is encryted in one direction only. This is probably evidence of a bug in the Telnet/TN3270 code or your Telnet server. The absence of any indicator means that no encryption is taking place.
+
diff --git a/src/mac/kconfig/WindowUtil.c b/src/mac/kconfig/WindowUtil.c
new file mode 100644 (file)
index 0000000..1896138
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+#ifndef _MWERKS
+#include <Memory.h>
+#include <OSUtils.h>
+#include <QuickDraw.h>
+#include <Resources.h>
+#include <SysEqu.h>
+#include <Traps.h>
+#include <Types.h>
+#include <Windows.h>
+#endif
+#include "WindowUtil.h"
+
+#if 0
+#include "glue.h"
+#endif
+
+#define topLeft(r)     (((Point *) &(r))[0])
+#define botRight(r)    (((Point *) &(r))[1])
+#undef GrayRgn
+#define getGrayRgn() (* (RgnHandle*) 0x09EE)
+
+void FindBestScreen(Rect *WindowRect, Rect *ScreenRect);
+void FitRects(Rect *BaseRect, Rect *VictimRect);
+
+Point PositionTemplate (Rect *BaseRect, ResType Type, register int ID, 
+                                          int PercentH, int    PercentV)
+{
+       Point TopLeft;
+       Handle TemplateHand;
+       
+       TopLeft.v = LMGetMBarHeight() << 1;
+       TopLeft.h = TopLeft.v;
+       
+       TemplateHand = GetResource(Type, ID);
+       if (TemplateHand != NULL) {
+               
+               LoadResource(TemplateHand);
+               if (ResError() == noErr) {
+                       int     TemplateState;
+                       
+                       TemplateState = HGetState(TemplateHand);
+                       HLock(TemplateHand);
+                       
+                       TopLeft = PositionRect(BaseRect, (Rect *) *TemplateHand, 
+                                                                  PercentH, PercentV);
+
+                       HSetState(TemplateHand, TemplateState);
+               }       
+       }
+       
+       return (TopLeft);
+}
+
+
+Point PositionRect (Rect *BaseRect, Rect *VictimRect, int PercentH, 
+                                       int PercentV)
+{
+       char *dummy;
+       Point TopLeft;
+       BitMap *ScreenBits;
+       Rect ScreenRect;
+       Rect WindowRect;
+       
+       ScreenBits = &qd.screenBits;
+       
+       ScreenRect = ScreenBits->bounds;
+       ScreenRect.top += LMGetMBarHeight();
+       
+       if (BaseRect == NULL) {
+               
+               WindowRect = ScreenRect;
+               
+       } else if (BaseRect == (Rect *) -1) {
+               WindowPtr                               Front;
+               
+               Front = FrontWindow();
+               if (Front != NULL) {
+                       GrafPtr                                 OrigPort;
+                       
+                       GetPort(&OrigPort);
+                       SetPort(Front);
+                       
+                       WindowRect = Front->portRect;
+                       
+                       LocalToGlobal(&topLeft(WindowRect));
+                       LocalToGlobal(&botRight(WindowRect));
+                       
+                       SetPort(OrigPort);
+                       
+               } else
+                       WindowRect = ScreenRect;
+               
+       } else if (BaseRect == (Rect *) -2) {
+               GrafPtr                                 OrigPort;
+               
+               GetPort(&OrigPort);
+               if (OrigPort != NULL) {
+                       
+                       WindowRect = OrigPort->portRect;
+                       
+                       LocalToGlobal(&topLeft(WindowRect));
+                       LocalToGlobal(&botRight(WindowRect));
+                       
+               } else
+                       WindowRect = ScreenRect;
+               
+       } else {
+               
+               WindowRect = *BaseRect;
+               
+               LocalToGlobal(&topLeft(WindowRect));
+               LocalToGlobal(&botRight(WindowRect));
+       }
+       
+       /*      Make the first attempt to position the window. */
+       
+       AlignRect(&WindowRect, VictimRect, PercentH, PercentV);
+       
+       /*      Make certain that the window wonÕt be positioned off-screen.
+               If it would have been, find the closest on-screen position for it. */
+       
+       PositionRectOnScreen(VictimRect, true);
+       
+       /*      Finish-up the positioning process. */
+       
+       TopLeft = topLeft(*VictimRect);
+       
+       return (TopLeft);
+}
+
+
+void AlignRect (register Rect *BaseRect, register Rect *VictimRect, 
+                               int     PercentH, int PercentV)
+{
+       Rect FixedRect;
+       int     BaseLenH;
+       int     BaseLenV;
+       int     VictLenH;
+       int     VictLenV;
+       int DivH;
+       int DivV;
+       
+       DivH = 100 / PercentH;
+       DivV = 100 / PercentV;
+       
+       BaseLenH = (BaseRect->right - BaseRect->left) / DivH;
+       BaseLenV = (BaseRect->bottom - BaseRect->top) / DivV;
+       
+       VictLenH = VictimRect->right - VictimRect->left;
+       VictLenV = VictimRect->bottom - VictimRect->top;
+       
+       FixedRect.left = (BaseRect->left + BaseLenH) - (VictLenH >> 1);
+       FixedRect.right = FixedRect.left + VictLenH;
+       FixedRect.top = (BaseRect->top + BaseLenV) - (VictLenV >> 1);
+       FixedRect.bottom = FixedRect.top + VictLenV;
+       
+       *VictimRect = FixedRect;
+}
+
+
+Point PositionRectOnScreen (Rect *VictimRect, int TotallyOnScreen)
+{
+       RgnHandle WindowRgn;
+       RgnHandle ResultRgn;
+       RgnHandle GrayRgn = getGrayRgn();
+       
+       WindowRgn = NewRgn();
+       ResultRgn = NewRgn();
+       if (WindowRgn != NULL && ResultRgn != NULL) {
+               int                                             Reposition;
+               
+               Reposition = false;
+               
+               RectRgn(WindowRgn, VictimRect);
+               
+               if (TotallyOnScreen) {
+                       
+               /*      GrayRgn tends to be set to 0xFFFFFFFF (-1) during startup. */
+                       
+                       if ((long) GrayRgn != -1) {
+                               
+                               UnionRgn(GrayRgn, WindowRgn, ResultRgn);
+                               Reposition = EqualRgn(GrayRgn, ResultRgn) == 0;
+                       }
+                       
+               } else {
+                       
+                       if ((long) GrayRgn != -1) {
+                               
+                               SectRgn(GrayRgn, WindowRgn, ResultRgn);
+                               Reposition = EmptyRgn(ResultRgn);
+                       }
+               }
+               
+               if (Reposition) {
+                       Rect                                    ScreenRect;
+                       
+                       FindBestScreen(VictimRect, &ScreenRect);
+                       FitRects(&ScreenRect, VictimRect);
+               }
+       }
+       
+       if (WindowRgn != NULL)
+               DisposeRgn(WindowRgn);
+       if (ResultRgn != NULL)
+               DisposeRgn(ResultRgn);
+       
+       return (topLeft(VictimRect));
+}
+
+
+void FitRects (register Rect *BaseRect, register Rect *VictimRect)
+{
+       int                                             VOff;
+       int                                             HOff;
+       
+       if (VictimRect->top < BaseRect->top)
+               VOff = (BaseRect->top - VictimRect->top) + 8;
+       else if (VictimRect->bottom > BaseRect->bottom)
+               VOff = (BaseRect->bottom - VictimRect->bottom) - 8;
+       else
+               VOff = 0;
+       
+       if (VictimRect->left < BaseRect->left)
+               HOff = (BaseRect->left - VictimRect->left) + 8;
+       else if (VictimRect->right > BaseRect->right)
+               HOff = (BaseRect->right - VictimRect->right) - 8;
+       else
+               HOff = 0;
+       
+       OffsetRect(VictimRect, HOff, VOff);
+}
+
+
+void FindBestScreen (WindowRect, ScreenRect)
+Rect                                   *WindowRect;
+Rect                                   *ScreenRect;
+{
+       SysEnvRec                               Environment;
+       
+       SysEnvirons(1, &Environment);
+       if (Environment.hasColorQD) {
+               GDHandle                                GDHand;
+               GDHandle                                BestGD;
+               unsigned long                   BestBitCount;
+               
+               GDHand = GetDeviceList();
+               BestGD = NULL;
+               BestBitCount = 0;
+               
+               while (GDHand != NULL) {
+                       Rect                                    WindSect;
+                       unsigned long                   BitCount;
+                       
+                       WindSect = (*GDHand)->gdRect;
+                       if (GDHand == GetMainDevice())
+                               WindSect.top += LMGetMBarHeight();
+                       
+                       SectRect(WindowRect, &WindSect, &WindSect);
+                       if (EmptyRect(&WindSect) == false)
+                               BitCount = (unsigned long) (WindSect.right - WindSect.left) * (unsigned long) (WindSect.bottom - WindSect.top);
+                       else
+                               BitCount = 0;
+                       
+                       if (BitCount > BestBitCount) {
+                               
+                               BestBitCount = BitCount;
+                               BestGD = GDHand;
+                       }
+                       
+                       GDHand = GetNextDevice(GDHand);
+               }
+               
+               if (BestGD == NULL)
+                       BestGD = GetMainDevice();
+               
+               *ScreenRect = (*BestGD)->gdRect;
+       
+       } else {
+               BitMap *ScreenBits;
+               char *dummy;
+               
+               ScreenBits = &qd.screenBits;
+
+               *ScreenRect = ScreenBits->bounds;
+               ScreenRect->top += LMGetMBarHeight();
+       }
+}
+
+
+/*
+ * Junk so Emacs will set local variables to be compatible with Mac/MPW.
+ * Should be at end of file.
+ * 
+ * Local Variables:
+ * tab-width: 4
+ * End:
+ */
+
diff --git a/src/mac/kconfig/WindowUtil.h b/src/mac/kconfig/WindowUtil.h
new file mode 100644 (file)
index 0000000..29703c7
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+#ifndef _WindowUtil_
+#define _WindowUtil_
+
+#ifndef NULL
+#define NULL                   0L
+#endif
+
+Point PositionTemplate(Rect *BaseRect, ResType, int ResID, int, int);
+Point PositionRect(Rect *BaseRect, Rect *VictimRect, int PercentH, int PercentV);
+Point PositionRectOnScreen(Rect *VictimRect, int TotallyOnScreen);
+void AlignRect(Rect *BaseRect, Rect *VictimRect, int PercentH, int PercentV);
+
+#endif
diff --git a/src/mac/kconfig/WindowUtil.proto.h b/src/mac/kconfig/WindowUtil.proto.h
new file mode 100644 (file)
index 0000000..3159e58
--- /dev/null
@@ -0,0 +1,9 @@
+/*
+ * WindowUtil.c
+ */
+extern Point PositionTemplate(Rect *BaseRect, ResType Type, register int ID, int PercentH, int PercentV);
+extern Point PositionRect(Rect *BaseRect, Rect *VictimRect, int PercentH, int PercentV);
+extern void AlignRect(register Rect *BaseRect, register Rect *VictimRect, int PercentH, int PercentV);
+extern Point PositionRectOnScreen(Rect *VictimRect, int TotallyOnScreen);
+extern void FitRects(register Rect *BaseRect, register Rect *VictimRect);
+extern void FindBestScreen(Rect *WindowRect, Rect *ScreenRect);
diff --git a/src/mac/kconfig/des_cornell.c b/src/mac/kconfig/des_cornell.c
new file mode 100644 (file)
index 0000000..af46d86
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+
+/*
+ * Des stub routines to use DES routines from Cornell's Kdriver.
+ */
+
+#ifdef TN3270
+#pragma segment 3270tcp
+#define bzero xbzero
+#endif
+
+#ifdef NCSA
+#pragma segment 22
+#define bzero xbzero
+#endif
+#include <Devices.h>
+#include <Files.h>
+#include <Traps.h>
+#include <SysEqu.h>
+
+#include "krb_driver.h"
+#include "glue.h"
+#include "encrypt.h"
+#include "desproto.h"
+
+void bzero(void *, long);
+
+static short kdriver = 0;              /* .Kerberos driver ref */
+long driverA4;                                 /* a4 in driver environment */
+
+long (*c_des_new_random_key)(des_cblock key) = 0;
+long (*c_des_ecb_encrypt)(unsigned long *clear, unsigned long *cipher, des_key_schedule schedule, long encrypt) = 0;
+long (*c_des_set_random_generator_seed)(des_cblock *key) = 0;
+long (*c_des_key_sched)(des_cblock k, des_key_schedule schedule) = 0;
+void (*c_des_init_random_number_generator)(des_cblock key) = 0;
+long (*c_des_pcbc_encrypt)(unsigned char *in, unsigned char * out, register long length,
+                                               des_key_schedule key, unsigned char *iv, long encrypt) = 0;
+long (*c_des_string_to_key)(char *str, unsigned char *key) = 0;
+unsigned long (*c_des_quad_cksum) (unsigned char *in, unsigned long *out, long length,
+                                                          long out_count, unsigned char *c_seed) = 0;
+long (*c_gettimeofdaynet) (struct timeval *tp, struct timezone *tz) = 0;
+
+/*
+ * init_cornell_des
+ * Returns -2 if no kdriver
+ * Returns other error if this kdriver does not have the DES hooks.
+ */
+long init_cornell_des ()
+{
+       short s;
+       ParamBlockRec pb;
+       long addrs[10];
+       
+       /*
+        * Open the .Kerberos driver if not already open
+        */
+       if (!kdriver) {
+               if (s = OpenDriver("\p.Kerberos", &kdriver)) {
+                       return -2;
+               }
+       }
+
+       bzero(&pb, sizeof(ParamBlockRec));
+       ((long *)pb.cntrlParam.csParam)[0] = (long)&addrs[0];
+       ((long *)pb.cntrlParam.csParam)[1] = sizeof(addrs)/sizeof(long);
+       pb.cntrlParam.ioCompletion = nil;
+       pb.cntrlParam.ioCRefNum = kdriver;
+
+       pb.cntrlParam.csCode = cKrbGetDesPointers;
+       if (s = PBControl(&pb, false))
+               return s;
+       if (s = pb.cntrlParam.ioResult)
+               return s;
+
+       driverA4 = addrs[0];
+       c_des_new_random_key = (long(*)()) addrs[1];
+       c_des_ecb_encrypt = (long(*)()) addrs[2];
+       c_des_set_random_generator_seed = (long(*)()) addrs[3];
+       c_des_key_sched = (long(*)()) addrs[4];
+       c_des_init_random_number_generator = (void(*)()) addrs[5];
+       c_des_pcbc_encrypt = (long(*)()) addrs[6];
+       c_des_string_to_key = (long(*)()) addrs[7];
+       c_des_quad_cksum = (unsigned long(*)()) addrs[8];
+       c_gettimeofdaynet = (long(*)()) addrs[9];
+
+       return 0;
+}
+
+
+long des_new_random_key(des_cblock key)
+{
+       long oldA4;
+       long s = 0;
+       
+       if (c_des_new_random_key) {
+               oldA4 = swapA4(driverA4);
+               s = (*c_des_new_random_key)(key);
+               swapA4(oldA4);
+       }
+       return s;
+}
+
+
+long des_ecb_encrypt(unsigned long *clear, unsigned long *cipher, des_key_schedule schedule, long encrypt)
+{
+       long oldA4;
+       long s = 0;
+       
+       if (c_des_ecb_encrypt) {
+               oldA4 = swapA4(driverA4);
+               s = (*c_des_ecb_encrypt)(clear, cipher, schedule, encrypt);
+               swapA4(oldA4);
+       }
+       return s;
+}
+
+
+long des_set_random_generator_seed(des_cblock *key)
+{
+       long oldA4;
+       long s = 0;
+
+       if (c_des_set_random_generator_seed) {
+               oldA4 = swapA4(driverA4);
+               s = (*c_des_set_random_generator_seed)(key);
+               swapA4(oldA4);
+       }
+       return s;
+}
+
+
+long des_key_sched(des_cblock k, des_key_schedule schedule)
+{
+       long oldA4;
+       long s = 0;
+       
+       if (c_des_key_sched) {
+               oldA4 = swapA4(driverA4);
+               s = (*c_des_key_sched)(k, schedule);
+               swapA4(oldA4);
+       }
+       return s;
+}
+
+
+void des_init_random_number_generator(des_cblock key)
+{
+       long oldA4;
+       
+       if (c_des_init_random_number_generator) {
+               oldA4 = swapA4(driverA4);
+               (*c_des_init_random_number_generator)(key);
+               swapA4(oldA4);
+       }
+}
+
+
+long des_pcbc_encrypt (unsigned char *in, unsigned char * out, register long length,
+                                               des_key_schedule key, unsigned char *iv, long encrypt)
+{
+       long oldA4, s = 0;
+       
+       if (c_des_pcbc_encrypt) {
+               oldA4 = swapA4(driverA4);
+               s = (*c_des_pcbc_encrypt)(in, out, length, key, iv, encrypt);
+               swapA4(oldA4);
+       }
+       return s;
+}
+
+
+long des_string_to_key (char *str, unsigned char *key)
+{
+       long oldA4, s = 0;
+       
+       if (c_des_string_to_key) {
+               oldA4 = swapA4(driverA4);
+               s = (*c_des_string_to_key)(str, key);
+               swapA4(oldA4);
+       }
+       return s;
+}
+
+unsigned long des_quad_cksum (unsigned char *in, unsigned long *out, long length,
+                                                          long out_count, unsigned char *c_seed)
+{
+       long oldA4;
+       unsigned long s = 0;
+       
+       if (c_des_quad_cksum) {
+               oldA4 = swapA4(driverA4);
+               s = (*c_des_quad_cksum)(in, out, length, out_count, c_seed);
+               swapA4(oldA4);
+       }
+       return s;
+}
+
+
+long gettimeofdaynet (struct timeval *tp, struct timezone *tz)
+{
+       long oldA4, s = 0;
+       
+       if (c_gettimeofdaynet) {
+               oldA4 = swapA4(driverA4);
+               s = (*c_gettimeofdaynet)(tp, tz);
+               swapA4(oldA4);
+       }
+       return s;
+}
diff --git a/src/mac/kconfig/desproto.h b/src/mac/kconfig/desproto.h
new file mode 100644 (file)
index 0000000..8d7298b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+struct timeval {
+       long tv_sec;
+       long tv_usec;
+};
+
+struct timezone {
+       long dummy;
+};
+
+extern long init_cornell_des(void);
+extern long des_new_random_key(des_cblock key);
+extern long des_ecb_encrypt(unsigned long *clear, unsigned long *cipher, des_key_schedule schedule, long encrypt);
+extern long des_set_random_generator_seed(des_cblock *key);
+extern long des_key_sched(des_cblock k, des_key_schedule schedule);
+extern void des_init_random_number_generator(des_cblock key);
+extern long des_pcbc_encrypt(unsigned char *in, unsigned char * out, register long length,
+                                               des_key_schedule key, unsigned char *iv, long encrypt);
+extern long des_string_to_key(char *str, unsigned char *key);
+extern unsigned long des_quad_cksum (unsigned char *in, unsigned long *out, long length,
+                                                          long out_count, unsigned char *c_seed);
+long gettimeofdaynet(struct timeval *tp, struct timezone *tz);
diff --git a/src/mac/kconfig/dnr.c b/src/mac/kconfig/dnr.c
new file mode 100644 (file)
index 0000000..2ddb5e1
--- /dev/null
@@ -0,0 +1,293 @@
+/*     DNR.c - DNR library for MPW
+
+       (c) Copyright 1988 by Apple Computer.  All rights reserved
+       
+       Modifications by Jim Matthews, Dartmouth College, 5/91
+       
+*/
+
+#include <OSUtils.h>
+#include <Errors.h>
+#include <Files.h>
+#include <Resources.h>
+#include <Memory.h>
+#include <Traps.h>
+#include <GestaltEqu.h>
+#include <Folders.h>
+#include <ToolUtils.h>
+
+#define OPENRESOLVER   1L
+#define CLOSERESOLVER  2L
+#define STRTOADDR              3L
+#define        ADDRTOSTR               4L
+#define        ENUMCACHE               5L
+#define ADDRTONAME             6L
+#define        HINFO                   7L
+#define MXINFO                 8L
+
+Handle codeHndl = nil;
+
+typedef OSErr (*OSErrProcPtr)(long,...);
+OSErrProcPtr dnr = nil;
+
+
+TrapType GetTrapType(theTrap)
+unsigned long theTrap;
+{
+       if (BitAnd(theTrap, 0x0800) > 0)
+               return(ToolTrap);
+       else
+               return(OSTrap);
+       }
+       
+Boolean TrapAvailable(trap)
+unsigned long trap;
+{
+TrapType trapType = ToolTrap;
+unsigned long numToolBoxTraps;
+
+       if (NGetTrapAddress(_InitGraf, ToolTrap) == NGetTrapAddress(0xAA6E, ToolTrap))
+               numToolBoxTraps = 0x200;
+       else
+               numToolBoxTraps = 0x400;
+
+       trapType = GetTrapType(trap);
+       if (trapType == ToolTrap) {
+               trap = BitAnd(trap, 0x07FF);
+               if (trap >= numToolBoxTraps)
+                       trap = _Unimplemented;
+               }
+       return(NGetTrapAddress(trap, trapType) != NGetTrapAddress(_Unimplemented, ToolTrap));
+
+}
+
+void GetSystemFolder(short *vRefNumP, long *dirIDP)
+{
+       SysEnvRec info;
+       long wdProcID;
+       
+       SysEnvirons(1, &info);
+       if (GetWDInfo(info.sysVRefNum, vRefNumP, dirIDP, &wdProcID) != noErr) {
+               *vRefNumP = 0;
+               *dirIDP = 0;
+               }
+       }
+
+void GetCPanelFolder(short *vRefNumP, long *dirIDP)
+{
+       Boolean hasFolderMgr = false;
+       long feature;
+       
+//     if (TrapAvailable(_Gestalt)) if (Gestalt(gestaltFindFolderAttr, &feature) == noErr) hasFolderMgr = true;
+    if (Gestalt(gestaltFindFolderAttr, &feature) == noErr) hasFolderMgr = true;
+       if (!hasFolderMgr) {
+               GetSystemFolder(vRefNumP, dirIDP);
+               return;
+               }
+       else {
+               if (FindFolder(kOnSystemDisk, kControlPanelFolderType, kDontCreateFolder, vRefNumP, dirIDP) != noErr) {
+                       *vRefNumP = 0;
+                       *dirIDP = 0;
+                       }
+               }
+       }
+       
+/* SearchFolderForDNRP is called to search a folder for files that might 
+       contain the 'dnrp' resource */
+short SearchFolderForDNRP(long targetType, long targetCreator, short vRefNum, long dirID)
+{
+       HParamBlockRec fi;
+       Str255 filename;
+       short refnum;
+       
+       fi.fileParam.ioCompletion = nil;
+       fi.fileParam.ioNamePtr = filename;
+       fi.fileParam.ioVRefNum = vRefNum;
+       fi.fileParam.ioDirID = dirID;
+       fi.fileParam.ioFDirIndex = 1;
+       
+       while (PBHGetFInfo(&fi, false) == noErr) {
+               /* scan system folder for driver resource files of specific type & creator */
+               if (fi.fileParam.ioFlFndrInfo.fdType == targetType &&
+                       fi.fileParam.ioFlFndrInfo.fdCreator == targetCreator) {
+                       /* found the MacTCP driver file? */
+                       refnum = HOpenResFile(vRefNum, dirID, filename, fsRdPerm);
+                       if (GetIndResource('dnrp', 1) == NULL)
+                               CloseResFile(refnum);
+                       else
+                               return refnum;
+                       }
+               /* check next file in system folder */
+               fi.fileParam.ioFDirIndex++;
+               fi.fileParam.ioDirID = dirID;   /* PBHGetFInfo() clobbers ioDirID */
+               }
+       return(-1);
+       }       
+
+/* OpenOurRF is called to open the MacTCP driver resources */
+
+short OpenOurRF()
+{
+       short refnum;
+       short vRefNum;
+       long dirID;
+       
+       /* first search Control Panels for MacTCP 1.1 */
+       GetCPanelFolder(&vRefNum, &dirID);
+       refnum = SearchFolderForDNRP('cdev', 'ztcp', vRefNum, dirID);
+       if (refnum != -1) return(refnum);
+               
+       /* next search System Folder for MacTCP 1.0.x */
+       GetSystemFolder(&vRefNum, &dirID);
+       refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID);
+       if (refnum != -1) return(refnum);
+               
+       /* finally, search Control Panels for MacTCP 1.0.x */
+       GetCPanelFolder(&vRefNum, &dirID);
+       refnum = SearchFolderForDNRP('cdev', 'mtcp', vRefNum, dirID);
+       if (refnum != -1) return(refnum);
+               
+       return -1;
+       }       
+
+
+OSErr OpenResolver(fileName)
+char *fileName;
+{
+       short refnum;
+       OSErr rc;
+       
+       if (dnr != nil)
+               /* resolver already loaded in */
+               return(noErr);
+               
+       /* open the MacTCP driver to get DNR resources. Search for it based on
+          creator & type rather than simply file name */       
+       refnum = OpenOurRF();
+
+       /* ignore failures since the resource may have been installed in the 
+          System file if running on a Mac 512Ke */
+          
+       /* load in the DNR resource package */
+       codeHndl = GetIndResource('dnrp', 1);
+       if (codeHndl == nil) {
+               /* can't open DNR */
+               return(ResError());
+               }
+       
+       DetachResource(codeHndl);
+       if (refnum != -1) {
+               CloseWD(refnum);
+               CloseResFile(refnum);
+               }
+               
+       /* lock the DNR resource since it cannot be reloated while opened */
+       HLock(codeHndl);
+       dnr = (OSErrProcPtr) *codeHndl;
+       
+       /* call open resolver */
+       rc = (*dnr)(OPENRESOLVER, fileName);
+       if (rc != noErr) {
+               /* problem with open resolver, flush it */
+               HUnlock(codeHndl);
+               DisposHandle(codeHndl);
+               dnr = nil;
+               }
+       return(rc);
+       }
+
+
+OSErr CloseResolver()
+{
+       if (dnr == nil)
+               /* resolver not loaded error */
+               return(notOpenErr);
+               
+       /* call close resolver */
+       (void) (*dnr)(CLOSERESOLVER);
+
+       /* release the DNR resource package */
+       HUnlock(codeHndl);
+       DisposHandle(codeHndl);
+       dnr = nil;
+       return(noErr);
+       }
+
+OSErr StrToAddr(hostName, rtnStruct, resultproc, userDataPtr)
+char *hostName;
+struct hostInfo *rtnStruct;
+long resultproc;
+char *userDataPtr;
+{
+       if (dnr == nil)
+               /* resolver not loaded error */
+               return(notOpenErr);
+               
+       return((*dnr)(STRTOADDR, hostName, rtnStruct, resultproc, userDataPtr));
+       }
+       
+OSErr AddrToStr(addr, addrStr)
+unsigned long addr;
+char *addrStr;                                                                 
+{
+       if (dnr == nil)
+               /* resolver not loaded error */
+               return(notOpenErr);
+               
+       (*dnr)(ADDRTOSTR, addr, addrStr);
+       return(noErr);
+       }
+       
+OSErr EnumCache(resultproc, userDataPtr)
+long resultproc;
+char *userDataPtr;
+{
+       if (dnr == nil)
+               /* resolver not loaded error */
+               return(notOpenErr);
+               
+       return((*dnr)(ENUMCACHE, resultproc, userDataPtr));
+       }
+       
+       
+OSErr AddrToName(addr, rtnStruct, resultproc, userDataPtr)
+unsigned long addr;
+struct hostInfo *rtnStruct;
+long resultproc;
+char *userDataPtr;                                                                     
+{
+       if (dnr == nil)
+               /* resolver not loaded error */
+               return(notOpenErr);
+               
+       return((*dnr)(ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr));
+       }
+
+
+extern OSErr HInfo(hostName, returnRecPtr, resultProc, userDataPtr)
+char *hostName;
+struct returnRec *returnRecPtr;
+long resultProc;
+char *userDataPtr;
+{
+       if (dnr == nil)
+               /* resolver not loaded error */
+               return(notOpenErr);
+               
+       return((*dnr)(HINFO, hostName, returnRecPtr, resultProc, userDataPtr));
+
+       }
+       
+extern OSErr MXInfo(hostName, returnRecPtr, resultProc, userDataPtr)
+char *hostName;
+struct returnRec *returnRecPtr;
+long resultProc;
+char *userDataPtr;
+{
+       if (dnr == nil)
+               /* resolver not loaded error */
+               return(notOpenErr);
+               
+       return((*dnr)(MXINFO, hostName, returnRecPtr, resultProc, userDataPtr));
+
+       }
\ No newline at end of file
diff --git a/src/mac/kconfig/encrypt.h b/src/mac/kconfig/encrypt.h
new file mode 100644 (file)
index 0000000..2afe916
--- /dev/null
@@ -0,0 +1,92 @@
+#pragma once
+
+/*-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted provided
+ * that: (1) source distributions retain this entire copyright notice and
+ * comment, and (2) distributions including binaries display the following
+ * acknowledgement:  ``This product includes software developed by the
+ * University of California, Berkeley and its contributors'' in the
+ * documentation or other materials provided with the distribution and in
+ * all advertising materials mentioning features or use of this software.
+ * Neither the name of the University nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *     @(#)encrypt.h   5.1 (Berkeley) 2/28/91
+ */
+
+/*
+ * Copyright (C) 1990 by the Massachusetts Institute of Technology
+ *
+ * Export of this software from the United States of America is assumed
+ * to require a specific license from the United States Government.
+ * It is the responsibility of any person or organization contemplating
+ * export to obtain such a license before exporting.
+ *
+ * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ * distribute this software and its documentation for any purpose and
+ * without fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright notice and
+ * this permission notice appear in supporting documentation, and that
+ * the name of 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.
+ */
+
+#ifndef        __ENCRYPT__
+#define        __ENCRYPT__
+
+#define        DIR_DECRYPT             1
+#define        DIR_ENCRYPT             2
+
+typedef        unsigned char Block[8];
+typedef unsigned char *BlockT;
+typedef struct { Block _; } Schedule[16];
+
+#define        VALIDKEY(key)   ( key[0] | key[1] | key[2] | key[3] | \
+                         key[4] | key[5] | key[6] | key[7])
+
+#define        SAMEKEY(k1, k2) (!bcmp((void *)k1, (void *)k2, sizeof(Block)))
+
+typedef        struct {
+       short           type;
+       long            length;
+       unsigned char   *data;
+} Session_Key;
+
+#define P(x)   x
+
+typedef struct {
+       char *name;
+       long    type;
+       void (*output) (void *, unsigned char *, long);
+       long    (*input) (void *, long);
+       void (*init) (void *, long);
+       long    (*start) (void *, long, long);
+       long    (*is) (void *, unsigned char *, long);
+       long    (*reply) (void *, unsigned char *, long);
+       void (*session) (void *, Session_Key *, long);
+       long    (*keyid) (void *, long, unsigned char *, long *);
+       void (*printsub) (unsigned char *, long, unsigned char *, long);
+} Encryptions;
+
+#define        SK_DES          1       /* Matched Kerberos v5 KEYTYPE_DES */
+
+extern long encrypt_debug_mode;
+
+#ifdef notdef
+extern long (*decrypt_input) P((long));
+extern void (*encrypt_output) P((unsigned char *, long));
+#endif
+#endif
+
+#define ENCTYPE_DES_CFB64      1
+#define ENCTYPE_DES_OFB64      2
diff --git a/src/mac/kconfig/getpasswd.c b/src/mac/kconfig/getpasswd.c
new file mode 100644 (file)
index 0000000..df2f81e
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * getpasswd.c
+ * ripped from krb4
+ */
+
+#define cKrbUserCancelled      2
+#define kLoginDLOGID           -4081
+#define kErrorALERTID          -4082
+#define kLoginOKItem           1
+#define kLoginCnclItem         2
+#define kLoginNameItem         10
+#define kLoginVisPwItem                9
+#define kLoginFrameItem                5
+#define kLoginIvisPwItem       6
+#define kBadUserError          1
+#define kNotUniqueError                2
+#define kGenError                      3
+#define kIntegrityError                4
+#define kBadPasswordError      5
+#define cr                                     0x0D
+#define enter                          0x03
+#define bs                                     0x08
+#define tab                            0x09
+#define larrow                                 0x1C
+#define rarrow                                 0x1D
+#define uarrow                                 0x1E
+#define darrow                                 0x1F
+#define DialogNotDone          1
+
+typedef union {                                                                // used to convert ProcPtr to Handle
+       Handle          H;
+       ProcPtr         P;
+} Proc2Hand;
+
+
+static pascal void FrameOKbtn( WindowPtr myWindow, short itemNo )
+{
+       short           tempType;
+       Handle          tempHandle;
+       Rect            itemRect;
+
+       GetDItem( (DialogPtr) myWindow, itemNo, &tempType, &tempHandle, &itemRect );
+       PenSize( 3, 3 );
+       FrameRoundRect( &itemRect, 16, 16 );            // make it an OK button suitable for framing
+}
+
+
+static pascal Boolean TwoItemFilter( DialogPtr dlog, EventRecord *event, short *itemHit )
+{
+       DialogPtr       evtDlog;
+       short           selStart, selEnd;
+       Handle          okBtnHandle;
+       short           tempType;
+       Rect            tempRect;
+       long            tempTicks;
+
+       if( event->what != keyDown && event->what != autoKey )
+               return false;                           // don't care about this event
+
+       switch( event->message & charCodeMask )
+       {
+       case cr:                                                // Return  (hitting return or enter is the same as hitting the OK button)
+       case enter:                                             // Enter
+       
+               if (!OKIsEnabled(dlog)) {
+                       event->what = nullEvent;
+                       return false;
+               }
+               
+               GetDItem( dlog, kLoginOKItem, &tempType, &okBtnHandle, &tempRect );
+               HiliteControl( (ControlHandle) okBtnHandle, 1 );        // hilite the OK button
+               Delay( 10, &tempTicks );        // wait a little while
+               HiliteControl( (ControlHandle) okBtnHandle, 0 );
+
+               *itemHit = kLoginOKItem;                // OK Button
+               return true;                            // We handled the event
+
+       case tab:                                               // Tab
+       case larrow:                                    // Left arrow  (Keys that just change the selection)
+       case rarrow:                                    // Right arrow
+       case uarrow:                                    // Up arrow
+       case darrow:                                    // Down arrow
+               return false;                           // Let ModalDialog handle them
+
+       default:
+       
+               // First see if we're in password field, do stuff to make ¥ displayed
+               
+               if( ((DialogPeek) dlog)->editField == kLoginVisPwItem - 1 ) {
+
+                       selStart = (**((DialogPeek) dlog)->textH).selStart;     // Get the selection in the visible item
+                       selEnd = (**((DialogPeek) dlog)->textH).selEnd;
+
+                       SelIText( dlog, kLoginIvisPwItem, selStart, selEnd );   // Select text in invisible item
+                       DialogSelect( event,&evtDlog, itemHit );                        // Input key
+
+                       SelIText( dlog, kLoginVisPwItem, selStart, selEnd );    // Select same area in visible item
+                       if( ( event->message & charCodeMask ) != bs )           // If it's not a backspace (backspace is the only key that can affect both the text and the selection- thus we need to process it in both fields, but not change it for the hidden field.
+                               event->message = '¥';                                                   // Replace with character to use
+               }
+               
+               // Do the key event and set the hilite on the OK button accordingly
+               
+               DialogSelect( event,&evtDlog, itemHit );                        // Input key
+               SetOKEnable(dlog);
+               
+               // Pass a NULL event back to DialogMgr
+               
+               event->what = nullEvent;
+               
+               return false;
+       }
+}
+
+static int SetOKEnable( DialogPtr dlog )
+{
+       short           itemType,state;
+       Handle          itemHandle;
+       Rect            itemRect;
+       Str255          tpswd,tuser;
+       ControlHandle okButton;
+
+       GetDItem( dlog, kLoginNameItem, &itemType, &itemHandle, &itemRect );
+       GetIText( itemHandle, tuser );
+       GetDItem( dlog, kLoginVisPwItem, &itemType, &itemHandle, &itemRect );
+       GetIText( itemHandle, tpswd );
+       GetDItem( dlog, kLoginOKItem, &itemType, (Handle *) &okButton, &itemRect );
+       state = (tuser[0] && tpswd[0]) ? 0 : 255;
+       HiliteControl(okButton,state);
+}
+
+static int OKIsEnabled( DialogPtr dlog )
+{
+       short           itemType;
+       Rect            itemRect;
+       ControlHandle okButton;
+
+       GetDItem( dlog, kLoginOKItem, &itemType, (Handle *) &okButton, &itemRect );
+       return ((**okButton).contrlHilite != 255);
+}
+
+#define ANAME_SZ       100
+#define        INST_SZ         100
+#define REALM_SZ       100
+#define MAX_K_NAME_SZ  100
+
+OSErr GetUserInfo( char *UserName, char *password )
+{
+       DialogPtr               myDLOG;
+       short                   itemHit;
+       short                   itemType;
+       Handle                  itemHandle;
+       Rect                    itemRect;
+       OSErr                   rc = DialogNotDone;
+       Str255                  tempStr,tpswd,tuser;
+       Proc2Hand               procConv;
+       short                   rf;
+       char uname[ANAME_SZ]="\0";
+       char uinst[INST_SZ]="\0";
+       char realm[REALM_SZ]="\0";
+       CursHandle              aCursor;
+               
+       /////////////////////////
+       // Ask user for password
+       /////////////////////////
+       password[0] = 0;
+       myDLOG = GetNewDialog( kLoginDLOGID, (void *) NULL, (WindowPtr) -1 );
+       if( myDLOG == NULL ) {
+               return -1;
+       }
+
+       // Insert user's name in dialog
+       if (*UserName) {
+               tempStr[0] = strlen(UserName);
+               memcpy( &(tempStr[1]), UserName, tempStr[0]);
+               GetDItem( myDLOG, kLoginNameItem, &itemType, &itemHandle, &itemRect );
+               SetIText( itemHandle, tempStr );
+               SelIText( myDLOG, kLoginVisPwItem,0,0 );
+       }
+       else SelIText( myDLOG, kLoginNameItem,0,0 );
+       
+       // Establish a user item around the OK button to draw the default button frame in
+       GetDItem( myDLOG, kLoginOKItem, &itemType, &itemHandle, &itemRect );
+       InsetRect( &itemRect, -4, -4 );                         // position user item around OK button
+       procConv.P = (ProcPtr) FrameOKbtn;                      // convert ProcPtr to a Handle
+       SetDItem( myDLOG, kLoginFrameItem, userItem, procConv.H, &itemRect );
+       
+       InitCursor();
+       do {
+               do {                                                                            // display the dialog & handle events
+                       SetOKEnable(myDLOG);
+                       ModalDialog( (ModalFilterProcPtr) TwoItemFilter, (short *) &itemHit );
+               } while( itemHit != kLoginOKItem && itemHit != kLoginCnclItem );
+               
+               if( itemHit == kLoginOKItem ) {                         // OK button pressed?                   
+                       GetDItem( myDLOG, kLoginNameItem, &itemType, &itemHandle, &itemRect );
+                       GetIText( itemHandle, tempStr );
+               
+                       tempStr[0] = ( tempStr[0] < MAX_K_NAME_SZ ) ? tempStr[0] : MAX_K_NAME_SZ-1 ;
+                       memcpy ((void*) UserName, (void*) &(tempStr[1]), tempStr[0]);
+                       UserName[tempStr[0]] = 0;
+                       
+                       GetDItem( myDLOG, kLoginIvisPwItem, &itemType, &itemHandle, &itemRect );
+                       GetIText( itemHandle, tempStr );
+               
+                       tempStr[0] = ( tempStr[0] < ANAME_SZ ) ? tempStr[0] : ANAME_SZ-1 ;
+                       memcpy( (void*) password, (void*) &(tempStr[1]), tempStr[0]);
+                       password[tempStr[0]] = 0;
+
+                       rc = !DialogNotDone;
+               }
+               else rc = cKrbUserCancelled;                                            // pressed the Cancel button
+       } while( rc == DialogNotDone );
+
+       DisposDialog( myDLOG );
+       return rc;
+}
diff --git a/src/mac/kconfig/glue.h b/src/mac/kconfig/glue.h
new file mode 100644 (file)
index 0000000..841e37a
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+#pragma parameter __D0 getA5
+long getA5 () = {
+       0x200d                                  /* move.l a5, d0 */
+};
+
+#pragma parameter setD0(__D0)
+void setD0 () = {
+       0x4e71                                  /* nop */
+};
+
+/*
+ * getA0
+ * returns the current value of register A0
+ */
+#pragma parameter _D0 getA0()
+long getA0 () = {
+       0x2008                                  // move.l a0, d0
+};
+
+/*
+ * swap bytes in a long
+ */
+#pragma parameter __D0 swapl(__A0)
+unsigned long swapl (unsigned long target) = {
+       0x2008,                                                 // move.l a0, d0
+       0xe058,                                                 // ror.w d0, 8
+       0x4840,                                                 // swap d0
+       0xe058                                                  // ror.w d0, 8
+};
+
+#pragma parameter __D0 swapA4(__D0)
+long swapA4(long);
+long swapA4 () = {
+       0xc18c                                  /* exg d0, a4 */
+};
diff --git a/src/mac/kconfig/k.bw b/src/mac/kconfig/k.bw
new file mode 100644 (file)
index 0000000..9b6766c
Binary files /dev/null and b/src/mac/kconfig/k.bw differ
diff --git a/src/mac/kconfig/k.color b/src/mac/kconfig/k.color
new file mode 100644 (file)
index 0000000..9e315ff
Binary files /dev/null and b/src/mac/kconfig/k.color differ
diff --git a/src/mac/kconfig/kadm.c b/src/mac/kconfig/kadm.c
new file mode 100644 (file)
index 0000000..606d8bf
--- /dev/null
@@ -0,0 +1,1282 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+#include <AppleTalk.h>
+#include <Devices.h>
+#include <Lists.h>
+#include <Menus.h>
+#include <Packages.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "MacTCPCommonTypes.h"
+#include "AddressXlation.h"
+#include "UDPPB.h"
+#include "TCPPB.h"
+#include "GetMyIPAddr.h"
+       
+#include "kadm.h"
+#include "krb_driver.h"
+#include "glue.h"
+#include "kconfig.h"
+
+#include "kconfig.proto.h"
+#include "kadm.proto.h"
+#include "desproto.h"
+
+int private_msg_ver = KRB_PROT_VERSION;
+Boolean kerberos_debug = 0;                            /* ddd */
+int kerberos_debug_packet = 0;
+static int ONE = 1;
+static short mactcp = 0;
+
+extern queuetype serverQ;
+extern krbHiParmBlock khipb;
+extern krbParmBlock klopb;
+
+/*
+ * kerberos_changepw
+ * Return error or zero if ok
+ */
+int kerberos_changepw (char *name, char *password, char *new, char **reason)
+{
+       int s;
+       int rc = 0;
+       int life = 255;                                         /* 255 * 5 minutes */
+       char *realm, *instance, *sinstance;
+       char uname[ANAME_SZ], uinstance[INST_SZ], urealm[REALM_SZ];
+       char service[256];
+       servertype *sp;
+       des_cblock newkey;
+       unsigned char snewkey[1+8];
+       CREDENTIALS *cr;
+       unsigned char buf[1300];                                /* changepw credentials buffer */
+       des_cblock sessionKey;
+
+       *reason = "unknown";
+       krb_parse_principal(name, uname, uinstance, urealm);
+
+       /*
+        * If the user specified a realm, try to match it up with 
+        * a realm that we know about. Try case-sensitive first,
+        * then case insensitive so the user doesn't have to worry about
+        * case matching. If no match, bomb out immediately.
+        */
+       if (urealm[0]) {
+               for (sp = (servertype *)serverQ; sp; sp = sp->next)
+                       if (sp->admin && (strcmp(urealm, sp->realm) == 0))
+                               break;
+               if (!sp) 
+                       for (sp = (servertype *)serverQ; sp; sp = sp->next)
+                               if (sp->admin && (ustrcmp(urealm, sp->realm) == 0))
+                                       break;
+               if (!sp) {
+                       *reason = "Could not find admin server for specified realm.";
+                       return -1;
+               }
+               strcpy(urealm, sp->realm);              /* insure correct case */
+               realm = urealm;
+       } else {                                                        /* get local realm */
+               klopb.uRealm = urealm;
+               if (s = lowcall(cKrbGetLocalRealm))
+                       strcpy(urealm, "");
+               realm = urealm;
+       }
+
+       if (uinstance[0])
+               instance = uinstance;
+       else
+               instance = "";
+
+       sinstance = realm;
+
+       /*
+        * Get password changing credentials.
+        * changepw.kerberos@realm user.instance
+        * We shouldn't keep these around after using them.
+        * 
+        * First, setup the username and old password the user typed in.
+        */
+       khipb.user = uname;
+       if (s = hicall(cKrbSetUserName)) {
+               *reason = "cKrbSetUserName";
+               return s;
+       }
+       khipb.user = password;
+       if (s = hicall(cKrbSetPassword)) {
+               *reason = "cKrbSetPassword";
+               return s;
+       }
+       
+       strcpy(service, "changepw.kerberos@");
+       strcat(service, realm);
+       bzero(&khipb, sizeof(krbHiParmBlock));
+       khipb.service = service;
+       khipb.buf = (char *)buf;                                /* where to build it */
+       khipb.checksum = 0;
+       khipb.buflen = sizeof(buf);
+       if (s = hicall(cKrbCacheInitialTicket)) {
+               *reason = "cKrbCacheInitialTicket";     /* ddd */
+               return s;
+       }
+       bcopy(khipb.sessionKey, sessionKey, sizeof(sessionKey));        /* save the session key */
+
+       /*
+        * Change the new password to a key.
+        */
+    (void)des_string_to_key(new, (unsigned char *)newkey);
+
+    /* 
+        * insert code, change key to stream 
+        */
+       snewkey[0]  = (unsigned char) CHANGE_PW;
+    bcopy((char *) (((long *) newkey) + 1), &snewkey[1], 4);
+    bcopy((char *) (((long *) newkey)), &snewkey[5], 4);
+
+    s = kadm_cli_send(snewkey, sizeof(snewkey), uname, uinstance, urealm);
+       if (s) {
+               *reason = "kadm_cli_send";                      /* ddd */
+               rc = s;
+               goto xit;
+       }
+
+       rc = 0;
+
+xit:
+#ifdef notdef /* ddd */        
+       /* 
+        * destroy changepw credentials
+        */
+       if (cr = krb_get_cred("changepw", "kerberos", urealm)) {
+               qunlink(&k_credentialsQ, cr);
+               freecredentials(cr);
+       }
+#endif
+
+       return rc;
+}
+
+
+/*
+ * kadm_cli_send
+ *     recieves   : opcode, packet, packet length, serv_name, serv_inst
+ *     returns    : return code from the packet build, the server, or
+ *                      something else 
+ *
+ * It assembles a packet as follows:
+ *      8 bytes    : VERSION STRING
+ *      4 bytes    : LENGTH OF MESSAGE DATA and OPCODE
+ *                 : KTEXT
+ *                 : OPCODE       \
+ *                 : DATA          > Encrypted (with make priv)
+ *                 : ......       / 
+ *
+ * If it builds the packet and it is small enough, then it attempts to open the
+ * connection to the admin server.  If the connection is succesfully open
+ * then it sends the data and waits for a reply. 
+ */
+
+/*
+ * unsigned char *st_dat:      theactual data
+ * int st_siz:         length of said data
+ * unsigned char **ret_dat:    to give return info
+ * int *ret_siz:       length of returned info
+ */
+
+int kadm_cli_send (unsigned char *st_dat, int st_siz, char *uname, char *uinstance, char *urealm)
+{
+       int s;
+    unsigned char *priv_pak = 0;               /* private version of the packet */
+    int priv_len;                                              /* length of private packet */
+    unsigned long cksum;                               /* checksum of the packet */
+    MSG_DAT mdat;
+       CREDENTIALS cred, *cr = &cred;
+       paktype *pak = 0;
+       unsigned char *pp;                                      /* packet build pointer */
+       long tmpl;
+       tcprequest *tcprequest = 0;
+       long error = KRBE_FAIL;                         /* preset general failure */
+       des_cblock sess_key;
+       Key_schedule sess_sched;
+       servertype *sp;
+
+    if (!(pak = newpaktype(2048)))
+               goto err;
+       pp = pak->data;
+
+    strncpy((char *)pp, KADM_VERSTR, KADM_VERSIZE);
+       pp += KADM_VERSIZE;
+
+       /*
+        * Find password changing credentials that we previously requested.
+        */
+       bzero(cr, sizeof(CREDENTIALS));
+       strcpy(cr->service, "changepw");
+       strcpy(cr->instance, "kerberos");
+       strcpy(cr->realm, urealm);
+       bzero(&klopb, sizeof(klopb));
+       klopb.uName = uname;
+       klopb.uInstance = uinstance;
+       klopb.uRealm = urealm;
+       klopb.cred = &cred;
+       if (s = lowcall(cKrbGetCredentials)) {
+               error = s;
+               goto err;
+       }
+
+       /*
+        * Open a socket so that we will have addresses and ports for
+        * idiotic krb_mk_priv().
+        */
+       if (!(tcprequest = (struct tcprequest *)NewPtrClear(sizeof(struct tcprequest)))) {
+               error = KRBE_MEM;
+               goto err;
+       }
+       tcprequest->remotePort = 751;                                           /* admin port */
+
+       /*
+        * Find admin server with the correct realm.
+        * ... may need to make better way to map realms to servers/admin servers.
+        */
+       for (sp = (servertype *)serverQ; sp; sp = sp->next)
+               if (sp->admin && (strcmp(urealm, sp->realm) == 0))
+                       break;
+
+       if (sp)
+               tcprequest->remoteHost = lookupaddr(sp->host);
+       else
+               goto err;
+               
+       if (!tcprequest->remoteHost)
+               goto err;
+               
+       if (!tcp_open(tcprequest))
+               goto err;
+
+       bcopy((char *)cr->session, (char *) sess_key, sizeof(des_cblock));
+       /* bzero((char *)cr->session, sizeof(des_cblock)); ??? */
+       des_key_sched(sess_key, sess_sched);
+
+    /* 
+        * 200 bytes for extra info case 
+        */
+    priv_pak = (unsigned char *)NewPtrClear(st_siz + 200);
+    if ((priv_len = krb_mk_priv(st_dat, priv_pak, (unsigned long)st_siz,
+                                                               sess_sched, sess_key, tcprequest)) < 0)
+               goto err;
+
+    /* 
+        * here is the length of priv data.  receiver calcs
+        * size of authenticator by subtracting vno size, priv size, and
+        * sizeof(unsigned long) (for the size indication) from total size 
+        */
+       tmpl = htonl(priv_len);
+       bcopy(&tmpl, pp, sizeof(long));
+       pp += sizeof(long);                                                     /* priv_len: length of priv_pak */
+
+#ifdef notdef
+       if (kerberos_debug_packet)
+               khexout(priv_pak, priv_len, "KRB:", "priv_pak ");
+#endif
+
+    cksum = des_quad_cksum(priv_pak, (unsigned long *)0, (long)priv_len, 0,
+                                          (unsigned char *)sess_key);
+
+#ifdef notdef
+       if (kerberos_debug_packet) {
+               khexout(&cksum, 4, "KRB:", "quad checksum ");
+               khexout(sess_key, 8, "KRB:", "session key ");
+               khexout(priv_pak, priv_len, "KRB:", "priv pak");
+       }
+#endif
+
+       pp += krb_build_ap(pp, cr, urealm, cksum);      /* KRB_AP_REQ msg */
+
+    bcopy(priv_pak, pp, priv_len);                             /* priv_pak */
+       pp += priv_len;
+    DisposePtr((Ptr)priv_pak);
+       priv_pak = 0;
+
+       /*
+     * Transmit request packet and get reply packet.
+        */
+       pak->len = pp - pak->data;
+#ifdef notdef
+       if (kerberos_debug_packet)
+               khexout(pak->data, pak->len, "KRB:", "kpasswd request packet ");
+#endif
+       pak = krb_ask_tcp(pak, urealm, tcprequest);
+       if (!pak) {
+               error = KRBE_TIMO;                              /* Timeout */
+               goto err;
+       }
+
+       /*
+        * Process reply packet.
+        */
+#ifdef notdef
+       if (kerberos_debug_packet)
+               khexout(pak->data, pak->len, "KRB:", "kpasswd response packet ");
+#endif
+
+    /* 
+        * first see if it's a YOULOSE 
+        */
+    if ((pak->len >= KADM_VERSIZE) &&
+               !strncmp(KADM_ULOSE, (char *)pak->data, KADM_VERSIZE)) {
+
+               /* it's a youlose packet */
+               if (pak->len < KADM_VERSIZE + sizeof(long)) {
+                       goto err;
+               }
+
+               bcopy(pak->data + KADM_VERSIZE, (char *)&error, sizeof(long));
+               error = ntohl(error);
+               goto err;
+    }
+
+    /* 
+        * need to decode the ret_dat 
+        */
+    if (error = krb_rd_priv(pak->data, (unsigned long)pak->len, sess_sched,
+                                                        sess_key, tcprequest, &mdat))
+               goto err;
+
+    if (mdat.app_length < KADM_VERSIZE + 4)    {                       /* if too short */
+               goto err;
+       }
+    if (strncmp((char *)mdat.app_data, KADM_VERSTR, KADM_VERSIZE)) { /* if bad ver */
+               goto err;
+       }
+    bcopy((char *)mdat.app_data+KADM_VERSIZE, (char *)&error, sizeof(unsigned long));
+    error = ntohl((unsigned long)error);
+
+#ifdef notdef  /* don't care about rest of data */
+    if (!(return_dat = (unsigned char *)xmalloc((unsigned)(mdat.app_length -
+                                                                                                  KADM_VERSIZE - sizeof(unsigned long)))))
+               RET_N_FREE2(KADM_NOMEM);
+    bcopy((char *) mdat.app_data + KADM_VERSIZE + sizeof(unsigned long),
+                 (char *)return_dat,
+                 (int)mdat.app_length - KADM_VERSIZE - sizeof(unsigned long));
+
+    free((char *)*ret_dat);
+    clear_secrets();
+    *ret_dat = return_dat;
+    *ret_siz = mdat.app_length - KADM_VERSIZE - sizeof(unsigned long);
+#endif
+
+err:   
+       if (priv_pak)
+               DisposePtr((Ptr)priv_pak);
+       if (pak)
+               DisposePtr((Ptr)pak);
+       if (tcprequest)
+               tcp_freerequest(tcprequest);
+
+    return error;
+}
+
+
+/*
+ * krb_ask_tcp
+ * Sends a request to a Kerberos server and waits for a response.
+ * Timeouts SHOULD... cause other servers in the list to be tried.
+ * 
+ * The respose packet, if any, is returned.
+ * The request packet is discarded.
+ *
+ * PROBABLY SHOULD USE REALM TO SPECIFY WHICH SERVERS ARE USABLE. ???
+ */
+paktype *krb_ask_tcp (paktype *pak, char *realm, tcprequest *tcprequest)
+{
+       paktype *newpak;
+       servertype *sp;
+               
+       /*
+        * Find a server with the correct realm.
+        */
+       for (sp = (servertype *)serverQ; sp; sp = sp->next)
+               if (strcmp(realm, sp->realm) == 0)
+                       break;
+       if (!sp) {
+               disposepak(pak);
+#ifdef notdef
+               if (kerberos_debug || kerberos_debug_packet)
+                       buginf("\nKRB: krb_ask_tcp: no server for realm \"%s\"", realm);
+#endif
+               return 0;
+       }
+       
+       /*
+        * Build and transmit the request
+        */
+       tcprequest->pak = pak;          
+       tcprequest->timeout = 2;                                /* timeout period in seconds */
+       tcprequest->retries = 8;                                /* number of retransmits allowed */
+       tcprequest->remoteHost = lookupaddr(sp->host);
+       if (!tcp_transmit(tcprequest))
+               return ((paktype *)0);
+
+       /*
+        * Wait for request complete
+        */
+       for (;;) {
+               /* ... wait next event or spincursor ... */
+               
+               switch (tcprequest->result) {
+               case UR_READERROR:
+                       disposepak(pak);
+                       return 0;
+
+               case UR_TIMEOUT:
+                       disposepak(pak);
+                       return 0;
+
+               case UR_READDONE:
+                       disposepak(pak);
+                       newpak = newpaktype(tcprequest->rpb.csParam.receive.rcvBuffLen);
+                       if (newpak) {
+                               bcopy(tcprequest->rpb.csParam.receive.rcvBuff, newpak->data,
+                                     tcprequest->rpb.csParam.receive.rcvBuffLen);
+                               newpak->len = tcprequest->rpb.csParam.receive.rcvBuffLen;
+                       }
+                       return newpak;
+               } /* switch tcprequest->result */
+       }
+}
+
+
+/*
+ * krb_parse_principal
+ * Parse a name which may include an instance and realm. 
+ * The return locations are assumed to be of sufficient
+ * size, bounded by the _SZ constants.
+ * 
+ * If periods are allowed in kerberos names, this code will need
+ * to be smarter. The case of rick.watson@realm is ambiguous and
+ * joe.smith.rcmd@realm is parsed incorrectly.
+ */
+void krb_parse_principal (char *user, char *uname, char *uinst, char *urealm)
+{
+       char *cp;
+       char tmp[ANAME_SZ + INST_SZ + REALM_SZ];
+
+       strncpy(tmp, user, ANAME_SZ + INST_SZ + REALM_SZ);
+
+       if (cp = strchr(tmp, '@')) {
+               *cp++ = '\0';
+               strncpy(urealm, cp, REALM_SZ);
+       } else
+               *urealm = '\0';
+
+       if (cp = strchr(tmp, '.')) {
+               *cp++ = '\0';
+               strncpy(uinst, cp, INST_SZ);
+       } else
+               *uinst = '\0';
+
+       strncpy(uname, tmp, ANAME_SZ);
+}
+
+
+/*
+ * krb_build_ap
+ *
+ * Build a KRB_AP_REQ message.
+ * Returns the message length.
+ *
+ * cp:    where to build the message
+ */
+
+int krb_build_ap (char *cp, CREDENTIALS *cr, char *srealm, long checksum)
+{
+       int len;
+       long gmtunixtime;
+       unsigned char *sp, *ap, *lenAp;
+       KTEXT_ST *ticket;
+       Key_schedule key_s;
+       struct timeval tv;
+       struct timezone tz;
+
+       ticket = &cr->ticket_st;
+
+       sp = cp;
+       /*
+        * pvno, type, kvno, srealm, ticket length, authenticator length.
+        */
+       *cp++ = KRB_PROT_VERSION;                                       /* pvno */
+       *cp++ = AUTH_MSG_APPL_REQUEST | HOST_BYTE_ORDER; /* type | B */
+       *cp++ = (unsigned char) cr->kvno;                       /* kvno */
+       cp = stringcopy(cp, srealm);                            /* srealm */
+       *cp++ = (unsigned char) ticket->length;         /* len_T */
+       lenAp = cp++;                                                           /* save pointer to len_A */
+       /*
+        * ticket
+        */
+       bcopy((char *)(ticket->dat), cp, ticket->length); /* ticket */
+       cp += ticket->length;
+       /*
+        * Build authenticator and encrypt it using the session key.
+        */
+       ap = cp;
+       cp = stringcopy(cp, cr->pname);                         /* Principal's cname */
+       cp = stringcopy(cp, cr->pinst);                         /* Principal's instance */
+       cp = stringcopy(cp, cr->realm);                         /* Authentication domain */
+       bcopy((char *)&checksum, (char *)cp, 4);        /* Checksum */
+       cp += 4;
+#ifdef notdef /* ... */
+       *cp++ = (char)(msclock & 0xff);                         /* times */
+#else
+       *cp++ = 1;
+#endif
+       gettimeofdaynet(&tv, &tz);
+       gmtunixtime = tv.tv_sec;
+       bcopy(&gmtunixtime, cp,  4);
+       cp += 4;
+       len = cp - ap;
+       len = ((len+7)/8)*8;            /* Fill to a multiple of 8 bytes for DES */
+       *lenAp = len;
+       cp = ap + len;
+#ifdef notdef
+       if (kerberos_debug_packet)                                      /* temp !!! ??? */
+               khexout((char *)sp, cp - sp, "KRB:", 
+                               "krb_build_ap (unencrypted) message:");
+#endif
+       des_key_sched((des_cblock)cr->session, key_s);
+
+       /*
+        * The cblock must be word aligned or we'll crash on a 68000, so copy it.
+        */
+       des_pcbc_encrypt((unsigned char *)ap, (unsigned char *)ap, (long) len, key_s, 
+                                (unsigned char *)cr->session, 1);
+       bzero((char *) key_s, sizeof(key_s));           /* clean up */
+       len = cp - sp;                                                          /* data length */
+       return len;
+}
+
+
+/*
+ * tcp_open
+ */
+#define TCP_RBUFSIZE   4096                                    /* size of receive buffer */
+Boolean tcp_open (tcprequest *tcprequest)
+{
+       int s;
+       TCPiopb pb;
+       struct GetAddrParamBlock my;
+               
+       if (!mactcp) {
+               if (s = OpenDriver("\p.ipp", &mactcp)) {
+                       doalert("Could not open .ipp driver: %d", s);
+                       getout(0);
+               }
+       }
+
+       if (tcprequest->stream)                                         /* if stream already open */
+               return true;
+
+       if (!(tcprequest->tcpbuf = (char *)NewPtrClear(TCP_RBUFSIZE)))
+               return false;
+
+       /*
+        * Create a TCP stream
+        */
+       pb.csParam.create.rcvBuff = tcprequest->tcpbuf;
+       pb.csParam.create.rcvBuffLen = TCP_RBUFSIZE;
+       pb.csParam.create.notifyProc = 0;                               /* no ASR */
+       pb.csParam.create.userDataPtr = (Ptr)tcprequest;
+       pb.ioCompletion = 0;
+       pb.ioCRefNum = mactcp;
+       pb.csCode = TCPCreate;
+       s = PBControl((ParmBlkPtr)&pb, false);
+       if (s)
+               return false;
+       tcprequest->stream = pb.tcpStream;
+               
+
+       /*
+        * Open the connection
+        */
+       pb.ioCRefNum = mactcp;
+       pb.csCode = TCPActiveOpen;
+       pb.csParam.open.validityFlags = timeoutValue | timeoutAction;
+       pb.csParam.open.ulpTimeoutValue = 60    /* seconds */;
+       pb.csParam.open.ulpTimeoutAction = 1    /* 1:abort 0:report */;
+       pb.csParam.open.commandTimeoutValue = 0;
+       pb.csParam.open.remoteHost = tcprequest->remoteHost;
+       pb.csParam.open.remotePort = tcprequest->remotePort;
+       pb.csParam.open.localHost = 0;
+       pb.csParam.open.localPort = 0;
+       pb.csParam.open.dontFrag = 0;
+       pb.csParam.open.timeToLive = 0;
+       pb.csParam.open.security = 0;
+       pb.csParam.open.optionCnt = 0;
+       s = PBControl((ParmBlkPtr)&pb, false);  
+       if (s) {
+               tcp_close(tcprequest);
+               return false;
+       }
+       tcprequest->localPort = pb.csParam.open.localPort;
+
+       /*
+        * Fill in our local ip address
+        */
+       bzero(&my, sizeof(my));
+       my.ioCRefNum = mactcp;
+       my.csCode = ipctlGetAddr;
+       s = PBControl((ParmBlkPtr)&my, false);
+       if (s)
+               return false;
+       tcprequest->localHost = my.ourAddress;
+
+       return true;
+}
+       
+
+/*
+ * tcp_close
+ * Close the stream associated with a request entry
+ */
+void tcp_close (tcprequest *tcprequest)
+{
+       int s;
+       TCPiopb pb;
+       
+       if (!tcprequest->stream)
+               return;
+               
+#ifdef notdef
+       pb.csParam.close.validityFlags = timeoutValue | timeoutAction;
+       pb.csParam.close.ulpTimeoutValue = 60 /* seconds */;
+       pb.csParam.close.ulpTimeoutAction = 1 /* 1:abort 0:report */;
+#endif
+       pb.ioCompletion = 0;
+       pb.ioCRefNum = mactcp;
+       pb.tcpStream = tcprequest->stream;
+       pb.csCode = TCPRelease;
+
+       s = PBControl((ParmBlkPtr)&pb, false);
+       /* ignore error */
+
+       tcprequest->stream = 0;
+
+       if (tcprequest->tcpbuf)
+               DisposePtr((Ptr)tcprequest->tcpbuf);
+       tcprequest->tcpbuf = 0;
+}
+
+
+/*
+ * tcp_transmit
+ */
+Boolean tcp_transmit (tcprequest *tcprequest)
+{
+       int s;
+       TCPiopb *pb;
+
+       /*
+        * Get a socket so that we will be able to identify responses.
+        */
+       if (!tcp_open(tcprequest))
+               return false;
+               
+       pb = &tcprequest->wpb;
+       if (pb->ioResult == 1) {                                /* if busy */
+               DebugStr("\ptcp_transmit: pb is busy");
+               return false;
+       }
+       bzero(pb, sizeof(struct TCPiopb));
+       pb->csCode = TCPSend;
+       pb->ioCompletion = 0;
+       pb->ioCRefNum = mactcp;
+       pb->tcpStream = tcprequest->stream;
+
+       pb->csParam.send.validityFlags = timeoutValue | timeoutAction;
+       pb->csParam.send.ulpTimeoutValue = 30   /* seconds */;
+       pb->csParam.send.ulpTimeoutAction = 1   /* 1:abort 0:report */;
+       pb->csParam.send.pushFlag = true;
+       pb->csParam.send.urgentFlag = false;
+
+       pb->csParam.send.wdsPtr = (Ptr)&tcprequest->wds[0];
+       pb->csParam.send.userDataPtr = (Ptr)tcprequest;
+
+       tcprequest->wds[0].length = sizeof(tcprequest->xlen); /* transmit length */
+       tcprequest->wds[0].ptr = (Ptr)&tcprequest->xlen;
+       tcprequest->xlen = tcprequest->pak->len;
+       tcprequest->wds[1].length = tcprequest->pak->len;
+       tcprequest->wds[1].ptr = tcprequest->pak->data;
+       tcprequest->wds[2].length = 0;
+       tcprequest->wds[2].ptr = 0;
+
+       s = PBControl((ParmBlkPtr)pb, true);
+       if (s)
+               return false;
+               
+       tcprequest->readheader = true;
+       if (!tcp_startread(tcprequest))                         /* setup read/timeout */
+               return false;
+
+       return true;
+}
+
+/*
+ * tcp_startread
+ * Start a read with a timeout. A timeout will trigger a 
+ * request failure.
+ */
+Boolean tcp_startread (tcprequest *tcprequest)
+{
+       int s;
+       TCPiopb *pb;
+       
+       pb = &tcprequest->rpb;
+       if (pb->ioResult == 1)                                          /* if read busy */
+               return false;
+               
+       bzero(pb, sizeof(struct TCPiopb));
+
+       pb->csCode = TCPRcv;
+       pb->csParam.receive.commandTimeoutValue = 30;
+
+       /*
+        * First, read a  length header.
+        */
+       if (tcprequest->readheader) {
+               pb->csParam.receive.rcvBuffLen = sizeof(tcprequest->header);
+               pb->csParam.receive.rcvBuff = (Ptr)&tcprequest->header;
+       } else {
+               pb->csParam.receive.rcvBuffLen = tcprequest->header;
+               pb->csParam.receive.rcvBuff = tcprequest->rbuf;
+       }
+
+       pb->ioCRefNum = mactcp;
+       pb->tcpStream = tcprequest->stream;
+       pb->ioCompletion = (TCPIOCompletionProc)tcp_readdone;
+       pb->csParam.receive.userDataPtr = (Ptr)tcprequest;
+
+       s = PBControl((ParmBlkPtr)pb, true);
+       if (s)
+               return false;
+       return true;
+}
+
+
+/*
+ * tcp_readdone
+ * IO Completion routine called when a read request completes or times out
+ */
+void tcp_readdone ()
+{
+       TCPiopb *pb;
+       tcprequest *tcprequest;
+       
+       pb = (TCPiopb *)getA0();                                        /* recover pb */
+       tcprequest = (struct tcprequest *)pb->csParam.receive.userDataPtr;
+
+       if (pb->ioResult == commandTimeout) {           /* if command timeout */
+               tcprequest->result = UR_TIMEOUT;
+               return;
+       } 
+       
+       if (pb->ioResult != noErr) {                            /* error */
+               tcprequest->result = UR_READERROR;
+               return;
+       }
+       
+       if (tcprequest->readheader) {           /* if we just read header */
+               tcprequest->readheader = false; /* read the packet now */
+               tcp_startread(tcprequest);
+               return;
+       }
+
+       /*
+        * Read has completed successfully. Data pointers are in the rpb.
+        * Signal success to user-level code.
+        */
+       tcprequest->result = UR_READDONE;                       /* read has completed */
+}
+
+
+/*
+ * tcp_freerequest
+ */
+void tcp_freerequest (tcprequest *request)
+{
+       if (request->stream)
+               tcp_close(request);
+
+       DisposePtr((Ptr)request);
+}
+
+
+paktype *newpaktype (int len)
+{
+       paktype *pak;
+       
+       if (pak = (paktype *)NewPtrClear(sizeof(paktype) + len)) {
+               pak->len = len;
+               pak->data = (unsigned char *)pak + sizeof(paktype);
+       }
+       return pak;
+}
+
+
+void disposepak (paktype *pak)
+{
+       DisposePtr((Ptr)pak);
+}
+
+
+/*
+ * stringcopy
+ * This version of strcpy writes a null string into dst
+ * if the src string is a null pointer.         It returns 
+ * a pointer to the byte after the string terminator.
+ */
+void *stringcopy (void *dst, void *src)
+{
+       char *d = dst;
+       char *s = src;
+
+       if (s)
+               while (*s)
+                       *d++ = *s++;
+       *d++ = '\0';
+
+       return (void *)d;
+}
+
+
+/*
+ * ustrcmp
+ * Compare strings, ignoring case.
+ * Return 0 if strings are equal
+ */
+int ustrcmp (char *src, char *dst)
+{
+       Boolean s;
+       
+       c2pstr(src);
+       c2pstr(dst);
+       s = EqualString(src, dst, false, false);
+       p2cstr(src);
+       p2cstr(dst);
+       return (s)? 0 : 1;
+}
+
+
+/*
+ * krb_mk_priv() constructs an AUTH_MSG_PRIVATE message.  It takes
+ * some user data "in" of "length" bytes and creates a packet in "out"
+ * consisting of the user data, a timestamp, and the sender's network
+ * address.
+ * The packet is encrypted by pcbc_encrypt(), using the given
+ * "key" and "schedule".
+ * The length of the resulting packet "out" is
+ * returned.
+ *
+ * It is similar to krb_mk_safe() except for the additional key
+ * schedule argument "schedule" and the fact that the data is encrypted
+ * rather than appended with a checksum.  Also, the protocol version
+ * number is "private_msg_ver", defined in krb_rd_priv.c, rather than
+ * KRB_PROT_VERSION, defined in "krb.h".
+ *
+ * The "out" packet consists of:
+ *
+ * Size                        Variable                Field
+ * ----                        --------                -----
+ *
+ * 1 byte              private_msg_ver         protocol version number
+ * 1 byte              AUTH_MSG_PRIVATE |      message type plus local
+ *                         HOST_BYTE_ORDER             byte order in low bit
+ *
+ * 4 bytes             c_length                length of encrypted data
+ *
+ * ===================== begin encrypt ================================
+ * 
+ * 4 bytes             length                          length of user data
+ * length              in                                      user data
+ * 1 byte              msg_time_5ms            timestamp milliseconds
+ * 4 bytes             sender->sin.addr.s_addr sender's IP address
+ *
+ * 4 bytes             msg_time_sec or         timestamp seconds with
+ *                             -msg_time_sec           direction in sign bit
+ *
+ * 0<=n<=7  bytes      pad to 8 byte multiple  zeroes
+ *                     (done by pcbc_encrypt())
+ *
+ * ======================= end encrypt ================================
+ */
+
+/*
+ * unsigned char *in                   application data
+ * unsigned char *out                  put msg here, leave room for
+ *                                header! breaks if in and out
+ *                                (header stuff) overlap
+ * unsigned long length                length of in data
+ * Key_schedule schedule        precomputed key schedule
+ * C_Block key                  encryption key for seed and ivec
+ * struct tcprequest *                 tcp request struct for send/rcvr addresses
+ */
+
+long krb_mk_priv (unsigned char *in, unsigned char *out, unsigned long length, 
+                                 des_key_schedule schedule, C_Block key, 
+                                 struct tcprequest *tcprequest)
+{
+    register unsigned char *p, *q;
+    static unsigned  char *c_length_ptr;
+       long msg_time_sec;
+       unsigned char msg_time_5ms;
+       unsigned long c_length;
+       struct timeval tv;
+       struct timezone tz;
+
+    /*
+     * get the current time to use instead of a sequence #, since
+     * process lifetime may be shorter than the lifetime of a session
+     * key.
+     */
+       
+       gettimeofdaynet(&tv, &tz);
+    msg_time_sec = (long)tv.tv_sec;
+    msg_time_5ms = 1;
+
+    p = out;
+
+    *p++ = private_msg_ver;
+    *p++ = AUTH_MSG_PRIVATE | HOST_BYTE_ORDER;
+
+    /* calculate cipher length */
+    c_length_ptr = p;
+    p += sizeof(c_length);
+
+    /* start for encrypted stuff */
+    q = p;
+
+    /* stuff input length */
+    bcopy((char *)&length, (char *)p, sizeof(length));
+    p += sizeof(length);
+
+    /* make all the stuff contiguous for checksum and encryption */
+    bcopy((char *)in, (char *)p, (int)length);
+    p += length;
+
+    /* stuff time 5ms */
+    bcopy((char *)&msg_time_5ms, (char *)p, sizeof(msg_time_5ms));
+    p += sizeof(msg_time_5ms);
+
+    /* stuff source address */
+    bcopy((char *)&tcprequest->localHost, (char *)p, sizeof(tcprequest->localHost));
+    p += sizeof(tcprequest->localHost);
+
+    /*
+     * direction bit is the sign bit of the timestamp.  Ok
+     * until 2038??
+     */
+    /* 
+        * For compatibility with broken old code, compares are done in VAX 
+     * byte order (LSBFIRST) 
+        */ 
+    if (lsb_net_ulong_less(tcprequest->localHost,       /* src < recv */ 
+                          tcprequest->remoteHost) == -1) 
+        msg_time_sec =  -msg_time_sec; 
+    else if (lsb_net_ulong_less(tcprequest->localHost, 
+                                                               tcprequest->remoteHost) == 0) 
+        if (lsb_net_ushort_less(tcprequest->localPort, tcprequest->remotePort) == -1) 
+            msg_time_sec = -msg_time_sec; 
+    /* stuff time sec */
+    bcopy((char *)&msg_time_sec, (char *)p, sizeof(msg_time_sec));
+    p += sizeof(msg_time_sec);
+
+    /*
+     * All that for one tiny bit!  Heaven help those that talk to
+     * themselves.
+     */
+
+#ifdef NOTDEF
+    /*
+     * calculate the checksum of the length, address, sequence, and
+     * inp data
+     */
+    cksum =  quad_cksum(q,NULL,p-q,0,key);
+    if (krb_debug)
+        printf("\ncksum = %u",cksum);
+    /* stuff checksum */
+    bcopy((char *) &cksum,(char *) p,sizeof(cksum));
+    p += sizeof(cksum);
+#endif
+
+    /*
+     * All the data have been assembled, compute length and encrypt
+     * starting with the length, data, and timestamps use the key as
+     * an ivec.
+     */
+
+    c_length = p - q;
+    c_length = ((c_length + sizeof(C_Block) -1)/sizeof(C_Block)) *
+        sizeof(C_Block);
+
+    /* stuff the length */
+    bcopy((char *) &c_length, (char *)c_length_ptr, sizeof(c_length));
+
+#ifdef notdef
+       if (kerberos_debug_packet)
+               khexout(q, p-q, "KRB:", "krb_mk_priv unencrypted ");
+#endif
+
+    /* pcbc encrypt, pad as needed, use key as ivec */
+    des_pcbc_encrypt((des_cblock) q, (des_cblock) q, (long) (p-q), schedule,
+                 (des_cblock)key, 1); /* ENCRYPT */
+
+    return (q - out + c_length);        /* resulting size */
+}
+
+
+/*
+ * krb_rd_priv() decrypts and checks the integrity of an
+ * AUTH_MSG_PRIVATE message.  Given the message received, "in",
+ * the length of that message, "in_length", the key "schedule"
+ * and "key" to decrypt with, and the network addresses of the
+ * "sender" and "receiver" of the message, krb_rd_safe() returns
+ * RD_AP_OK if the message is okay, otherwise some error code.
+ *
+ * The message data retrieved from "in" are returned in the structure
+ * "m_data".  The pointer to the decrypted application data
+ * (m_data->app_data) refers back to the appropriate place in "in".
+ *
+ * See the file "mk_priv.c" for the format of the AUTH_MSG_PRIVATE
+ * message.  The structure containing the extracted message
+ * information, MSG_DAT, is defined in "krb.h".
+ */
+
+/*
+ * unsigned char *in                           pointer to the msg received
+ * unsigned long in_length;            length of "in" msg
+ * Key_schedule schedule;      precomputed key schedule
+ * C_Block key                         encryption key for seed and ivec
+ * struct tcprequest *tcprequest;
+ * MSG_DAT *m_data                     various input/output data from msg
+ */
+
+/*
+ * NOTE: the original routine had sender and receiver where we only
+ * have tcprequest. So, we have to reverse the sense of the sender
+ * and receiver.
+ */
+#define sender remoteHost
+#define receiver localHost
+#define senderp remotePort
+#define receiverp localPort
+
+long krb_rd_priv (unsigned char *in, unsigned long in_length, Key_schedule schedule,
+                                C_Block key, struct tcprequest *tcprequest, 
+                                MSG_DAT *m_data)
+{
+    register unsigned char *p, *q;
+    static unsigned long src_addr;     /* Can't send structs since no guarantees on size */
+       int swap_bytes = 0;
+       unsigned long c_length;
+       long delta_t;
+       struct timeval tv;
+       struct timezone tz;
+       
+    p = in;                    /* beginning of message */
+    swap_bytes = 0;
+
+    if (*p++ != KRB_PROT_VERSION && *(p-1) != 3)
+        return KRBE_FAIL;
+
+    /* ...??? private_msg_ver = *(p-1); */
+    if (((*p) & ~1) != AUTH_MSG_PRIVATE)
+        return KRBE_FAIL;
+
+    if ((*p++ & 1) != HOST_BYTE_ORDER)
+        swap_bytes++;
+
+    /* get cipher length */
+    bcopy((char *)p, (char *)&c_length, sizeof(c_length));
+    if (swap_bytes)
+        c_length = swapl(c_length);
+    p += sizeof(c_length);
+    /* check for rational length so we don't go comatose */
+    if (VERSION_SZ + MSG_TYPE_SZ + c_length > in_length)
+        return KRBE_FAIL;
+
+    /*
+     * decrypt to obtain length, timestamps, app_data, and checksum
+     * use the session key as an ivec
+     */
+
+    q = p;                     /* mark start of encrypted stuff */
+
+    /* pcbc decrypt, use key as ivec */
+    des_pcbc_encrypt((des_cblock)q, (des_cblock)q, (long) c_length,
+                 schedule, (des_cblock)key, 0);        /* DECRYPT */
+
+    /* safely get application data length */
+    bcopy((char *)p, (char *)&(m_data->app_length), sizeof(m_data->app_length));
+    if (swap_bytes)
+        m_data->app_length = swapl(m_data->app_length);
+    p += sizeof(m_data->app_length);    /* skip over */
+
+    if (m_data->app_length + sizeof(c_length) + sizeof(in_length) +
+        sizeof(m_data->time_sec) + sizeof(m_data->time_5ms) +
+        sizeof(src_addr) + VERSION_SZ + MSG_TYPE_SZ
+        > in_length)
+        return KRBE_FAIL;
+
+    /* we're now at the decrypted application data */
+    m_data->app_data = p;
+
+    p += m_data->app_length;
+
+    /* safely get time_5ms */
+    bcopy((char *) p, (char *)&(m_data->time_5ms),
+         sizeof(m_data->time_5ms));
+    /*  don't need to swap-- one byte for now */
+    p += sizeof(m_data->time_5ms);
+
+    /* safely get src address */
+    bcopy((char *) p,(char *)&src_addr,sizeof(src_addr));
+    /* don't swap, net order always */
+    p += sizeof(src_addr);
+
+    if (src_addr != (unsigned long) tcprequest->sender)
+               return KRBE_FAIL;
+
+    /* safely get time_sec */
+    bcopy((char *) p, (char *)&(m_data->time_sec), sizeof(m_data->time_sec));
+    if (swap_bytes) 
+               m_data->time_sec = swapl(m_data->time_sec);
+
+    p += sizeof(m_data->time_sec);
+
+    /* 
+        * check direction bit is the sign bit.
+     * For compatibility with broken old code, compares are done in VAX 
+        * byte order (LSBFIRST) 
+        */ 
+    if (lsb_net_ulong_less(tcprequest->sender, tcprequest->receiver) == -1) 
+               /* src < recv */ 
+               m_data->time_sec =  - m_data->time_sec; 
+    else if (lsb_net_ulong_less(tcprequest->sender, 
+                                                               tcprequest->receiver) == 0) 
+               if (lsb_net_ushort_less(tcprequest->senderp, tcprequest->receiverp) == -1)
+                       /* src < recv */
+                       m_data->time_sec =  - m_data->time_sec; 
+    /*
+     * all that for one tiny bit!
+     * Heaven help those that talk to themselves.
+     */
+
+    /* check the time integrity of the msg */
+
+       gettimeofdaynet(&tv, &tz);
+    delta_t = abs((int)((long) tv.tv_sec - m_data->time_sec));
+    if (delta_t > CLOCK_SKEW)
+               return KRBE_SKEW;
+
+    /*
+     * caller must check timestamps for proper order and
+     * replays, since server might have multiple clients
+     * each with its own timestamps and we don't assume
+     * tightly synchronized clocks.
+     */
+
+#ifdef notdef
+    bcopy((char *) p,(char *)&cksum,sizeof(cksum));
+    if (swap_bytes) 
+               cksum = swapl(cksum)
+    /*
+     * calculate the checksum of the length, sequence,
+     * and input data, on the sending byte order!!
+     */
+    calc_cksum = quad_cksum(q,NULL,p-q,0,key);
+
+    if (krb_debug)
+       printf("\ncalc_cksum = %u, received cksum = %u",
+              calc_cksum, cksum);
+    if (cksum != calc_cksum)
+       return RD_AP_MODIFIED;
+#endif
+
+    return 0;        /* OK == 0 */
+}
+
+
+/*
+ * lookupaddr
+ * Lookup address
+ * Return 0 if not found
+ */
+unsigned long lookupaddr (char *hostname)
+{
+       int s;
+       struct hostInfo *rtnStruct = 0;
+       char done = 0;
+       unsigned long addr;
+
+       if (!(rtnStruct = (struct hostInfo *) NewPtrClear(sizeof(struct hostInfo)))) {
+               goto xit;
+       }
+
+       s = StrToAddr(hostname, rtnStruct, dnsDone, (char *)&done);
+       if (s && (s != cacheFault)) {
+               goto xit;
+       }       
+
+       /*
+        * wait for the result
+        * ... should timeout? (dnr probably does)
+        * ... should run minimal event loop
+        * ... should finish processing in netevent loop
+        */
+       if (s) {
+               while (!done)
+                       ;
+       }
+       
+       if (rtnStruct->rtnCode == noErr) {                              /* if success */
+               addr = rtnStruct->addr[0];
+       } else {
+               addr = 0;
+       }
+       
+xit:
+       if (rtnStruct)
+               DisposPtr((Ptr)rtnStruct);
+       
+       return addr;
+}
+
+
+/*
+ * dnsDone
+ * completion routine for dns
+ */
+pascal void dnsDone (struct hostInfo *info, char *userdata)
+{
+       #pragma unused(info)
+       *userdata = 1;
+}
+
+
+/*
+ * Junk so Emacs will set local variables to be compatible with Mac/MPW.
+ * Should be at end of file.
+ * 
+ * Local Variables:
+ * tab-width: 4
+ * End:
+ */
diff --git a/src/mac/kconfig/kadm.h b/src/mac/kconfig/kadm.h
new file mode 100644 (file)
index 0000000..821a8e9
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+#define                        KRB_PROT_VERSION                4
+
+#define ntohl(x) (x)
+#define ntohs(x) (x)
+#define htonl(x) (x)
+#define htons(x) (x)
+
+typedef struct pak_ {
+       int len;                                                        /* data length */
+       unsigned char *data;                            /* pointer to data */
+       /* data goes here */
+} paktype;
+
+struct tcprequest {
+       struct tcprequest *next;
+       paktype *pak;
+       char *tcpbuf;                                           /* buffer for mactcp */
+       StreamPtr stream;                                       /* udp stream pointer */
+       TCPiopb wpb;                                            /* pb for writes */
+       TCPiopb rpb;                                            /* pb for reads */
+       wdsEntry wds[3];                                        /* wds for writing */
+       ip_addr remoteHost;                                     /* address of kerberos server */
+       ip_addr localHost;
+       unsigned short remotePort;                      /* remote port */
+       unsigned short localPort;                       /* local port */
+       int timeout;                                            /* timeout in seconds */
+       int retries;                                            /* number of times to retry */
+       short result;                                           /* request result */
+       unsigned short xlen;                            /* transmit length */
+       unsigned char rbuf[750];                        /* receive buffer */
+       Boolean readheader;                                     /* true if reading 4 byte header */
+       unsigned short header;                          /* length header */
+};
+typedef struct tcprequest tcprequest;
+/*
+ * result values
+ */
+#define UR_TIMEOUT 1                                   /* request timed out */
+#define UR_READERROR 2                                 /* read error */
+#define UR_READDONE 3                                  /* read finished successfully */
+
+/*
+ * Kadm constants
+ */
+#define CHANGE_PW              2
+#define KADM_VERSTR            "KADM0.0A"
+#define KADM_VERSIZE   strlen(KADM_VERSTR)
+#define KADM_ULOSE     "KYOULOSE"      /* sent back when server can't decrypt client's msg */
+
+#define HOST_BYTE_ORDER (*(char *)&ONE)
+
+/*
+ * Errors and associated text for get ticket routines.
+ * See krbe_text[].
+ */
+enum KRBE {
+       KRBE_OK = 0,                                            /* no error */
+       KRBE_FAIL,                                                      /* General failure */
+       KRBE_SKEW,                                                      /* Clock Skew */
+       KRBE_PROT,                                                      /* Protocol Error */
+       KRBE_PASS,                                                      /* Invalid login or password */
+       KRBE_TIMO,                                                      /* Timeout */
+       KRBE_MEM,                                                       /* No memory */
+       KRBE_N                                                          /* must be last */
+};
+
+/* Message types , always leave lsb for byte order */
+
+#define                        AUTH_MSG_KDC_REQUEST                                     1<<1
+#define                        AUTH_MSG_KDC_REPLY                                               2<<1
+#define                        AUTH_MSG_APPL_REQUEST                                    3<<1
+#define                        AUTH_MSG_APPL_REQUEST_MUTUAL                     4<<1
+#define                        AUTH_MSG_ERR_REPLY                                               5<<1
+#define                        AUTH_MSG_PRIVATE                                                 6<<1
+#define                        AUTH_MSG_SAFE                                                    7<<1
+#define                        AUTH_MSG_APPL_ERR                                                8<<1
+#define                        AUTH_MSG_DIE                                                    63<<1
+
+
+/* include space for '.' and '@' */
+#define                        MAX_K_NAME_SZ   (ANAME_SZ + INST_SZ + REALM_SZ + 2)
+#define                        KKEY_SZ                 100
+#define                        VERSION_SZ              1
+#define                        MSG_TYPE_SZ             1
+#define                        DATE_SZ                 26              /* RTI date output */
+#define                        MAX_KTXT_LEN    1250
+#define KRB_SENDAUTH_VLEN 8                    /* length for version strings */
+#define K_FLAG_ORDER   0               /* bit 0 --> lsb */
+
+/* 
+ * Maximum alloable clock skew in seconds 
+ */
+#define                        CLOCK_SKEW              5*60
+
+#define MSBFIRST                                       /* macintosh 68000 */
+
+#ifdef LSBFIRST
+#define lsb_net_ulong_less(x,y) ((x < y) ? -1 : ((x > y) ? 1 : 0))
+#define lsb_net_ushort_less(x,y) ((x < y) ? -1 : ((x > y) ? 1 : 0))
+#else
+/* MSBFIRST */
+#define uchar_comp(x,y) \
+        (((x)>(y))?(1):(((x)==(y))?(0):(-1)))
+/* This is gross, but... */
+#define lsb_net_ulong_less(x, y) long_less_than((unsigned char *)&x, (unsigned char *)&y)
+#define lsb_net_ushort_less(x, y) short_less_than((unsigned char *)&x, (unsigned char *)&y)
+
+#define long_less_than(x,y) \
+        (uchar_comp((x)[3],(y)[3])?uchar_comp((x)[3],(y)[3]): \
+        (uchar_comp((x)[2],(y)[2])?uchar_comp((x)[2],(y)[2]): \
+         (uchar_comp((x)[1],(y)[1])?uchar_comp((x)[1],(y)[1]): \
+          (uchar_comp((x)[0],(y)[0])))))
+#define short_less_than(x,y) \
+         (uchar_comp((x)[1],(y)[1])?uchar_comp((x)[1],(y)[1]): \
+          (uchar_comp((x)[0],(y)[0])))
+
+#endif /* LSBFIRST */
diff --git a/src/mac/kconfig/kadm.proto.h b/src/mac/kconfig/kadm.proto.h
new file mode 100644 (file)
index 0000000..97255c2
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * kadm.c
+ */
+extern int kerberos_changepw(char *name, char *password, char *new, char **reason);
+extern int kadm_cli_send(unsigned char *st_dat, int st_siz, char *uname, char *uinstance, char *urealm);
+extern paktype *krb_ask_tcp(paktype *pak, char *realm, tcprequest *tcprequest);
+extern void krb_parse_principal(char *user, char *uname, char *uinst, char *urealm);
+extern int krb_build_ap(char *cp, CREDENTIALS *cr, char *srealm, long checksum);
+extern Boolean tcp_open(tcprequest *tcprequest);
+extern void tcp_close(tcprequest *tcprequest);
+extern Boolean tcp_transmit(tcprequest *tcprequest);
+extern Boolean tcp_startread(tcprequest *tcprequest);
+extern void tcp_readdone(void);
+extern void tcp_freerequest(tcprequest *request);
+extern paktype *newpaktype(int len);
+extern void disposepak(paktype *pak);
+extern void *stringcopy(void *dst, void *src);
+extern int ustrcmp(char *src, char *dst);
+extern long krb_mk_priv(unsigned char *in, unsigned char *out, unsigned long length, des_key_schedule schedule, C_Block key, struct tcprequest *tcprequest);
+extern long krb_rd_priv(unsigned char *in, unsigned long in_length, Key_schedule schedule, C_Block key, struct tcprequest *tcprequest, MSG_DAT *m_data);
+extern unsigned long lookupaddr(char *hostname);
+extern pascal void dnsDone(struct hostInfo *info, char *userdata);
diff --git a/src/mac/kconfig/kconfig.c b/src/mac/kconfig/kconfig.c
new file mode 100644 (file)
index 0000000..8b6c855
--- /dev/null
@@ -0,0 +1,3793 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+/*
+ * Kconfig
+ */
+#include <stdio.h>
+#ifndef _MWERKS
+#include <Controls.h>
+#include <Desk.h>
+#include <DiskInit.h>
+#include <Devices.h>
+#include <Dialogs.h>
+#include <Errors.h>
+#include <Events.h>
+#include <Folders.h>
+#include <Fonts.h>
+#include <GestaltEqu.h>
+#include <Lists.h>
+#include <Memory.h>
+#include <Menus.h>
+#include <Notification.h>
+#include <OSEvents.h>
+#include <OSUtils.h>
+#include <Packages.h>
+#include <Printing.h>
+#include <QuickDraw.h>
+#include <Resources.h>
+#include <Scrap.h>
+#include <Script.h>
+#include <StdArg.h>
+#include <StdLib.h>
+#include <String.h>
+#include <Strings.h>
+#include <SysEqu.h>
+#include <TextEdit.h>
+#include <ToolUtils.h>
+#include <Traps.h>
+#include <Windows.h>
+#include <StdLib.h>
+
+#define TRUE 1
+#define FALSE 0
+#endif
+
+#define CELLH 12                                               /* list cell height */
+
+#ifdef KRB4
+#      define  DEFINE_SOCKADDR
+#      include "krb.h"
+#      include "kconfig.h"
+#      include "kconfig.proto.h"
+#      include "krb_driver.h"
+#      include "kconfig.vers"
+#      include "glue.h"
+#endif
+
+#ifdef KRB5
+#      include "k5-int.h"
+#      include "com_err.h"
+#      include "kconfig.h"
+#      include "kconfig.proto.h"
+#      include "kconfig.vers"
+#      include "prof_int.h"
+#      include "adm_proto.h"
+#endif
+
+#include "WindowUtil.h"
+
+#define num_WaitNextEvent      0x60
+#define num_JugglDispatch      0x8F    /* The Temp Memory calls (RWR) */
+#define num_UnknownTrap                0x9F
+#define num_ScriptTrap         0xBF
+#define switchEvt       1 /* Switching event (suspend/resume )  for app4evt */
+
+//#define dangerousPattern 1
+#define KFAILURE 255
+#define KSUCCESS 0
+
+/*
+ * Globals
+ */
+#ifdef KRB4
+       krbHiParmBlock khipb;
+       krbParmBlock klopb;
+       /* We use the mac stubs to open the driver. */
+#      define  kdriver mac_stubs_kdriver               /* .Kerberos driver reference */
+#endif
+
+#ifdef KRB5
+       krb5_context kcontext;
+       krb5_ccache k5_ccache;
+    static char ccname[FILENAME_MAX] = "ccredcache";           /* ccache file location */
+#endif
+
+MenuHandle menus[NUM_MENUS];
+DialogPtr maind = 0;                                   /* main dialog window */
+Rect oldzoom;
+ParamBlockRec pb;
+queuetype domainQ = 0;
+queuetype serverQ = 0;
+queuetype credentialsQ = 0;
+ListHandle dlist;                                              /* domain list */
+ListHandle slist;                                              /* server list */
+struct listfilter lf;                                  /* lf for maind */
+Handle ddeleteHandle, deditHandle;
+Handle sdeleteHandle, seditHandle;
+preferences prefs;                                             /* preferences */
+
+#ifdef KRB4
+char *prefsFilename = "\pCNS Config Preferences";
+#endif
+
+#ifdef KRB5
+char *prefsFilename = "\pCNSk5 Config Preferences";
+#endif
+
+/*+
+ * Function: Initializes ccache and catches illegal caches such as
+ *  bad format or no permissions.
+ *
+ * Parameters:
+ *  ccache - credential cache structure to use
+ *
+ * Returns: krb5_error_code
+ */
+static krb5_error_code
+k5_init_ccache (krb5_ccache *ccache) {
+    krb5_error_code code;
+    krb5_principal princ;
+    FILE *fp;
+
+    code = krb5_cc_default (kcontext, ccache); // Initialize the ccache
+    if (code)
+        return code;
+
+    code = krb5_cc_get_principal (kcontext, *ccache, &princ);
+    if (code == KRB5_FCC_NOFILE) {              // Doesn't exist yet
+        fp = fopen (krb5_cc_get_name(kcontext, *ccache), "w");
+        if (fp == NULL)                         // Can't open it
+            return KRB5_FCC_PERM;
+        fclose (fp);
+    }
+
+    if (code) {                                 // Bad, delete and try again
+        remove (krb5_cc_get_name(kcontext, *ccache));
+        code = krb5_cc_get_principal (kcontext, *ccache, &princ);
+        if (code == KRB5_FCC_NOFILE)            // Doesn't exist yet
+            return 0;
+        if (code)
+            return code;
+    }
+
+    krb5_free_principal (kcontext, princ);
+    return 0;
+}
+
+int main (void)
+{
+       int i, s;
+       MenuHandle menuhandle;
+
+       /*      
+        * Setup
+        */
+       InitGraf (&qd.thePort); /* Init the graf port */
+       InitFonts();
+       InitWindows();
+       InitMenus();
+       TEInit();
+       InitDialogs(0);
+       InitCursor();
+       FlushEvents(everyEvent, 0);
+#ifdef KRB4
+       init_cornell_des();
+#endif
+#ifdef KRB5
+       k5_init_ccache (&k5_ccache);
+#endif
+       
+       readprefs();
+       
+       /*
+        *      Setup the menus.  Assumes the menu resources start at 128 and are
+        *      contiguous.
+        */
+       for (i = 0; i < NUM_MENUS; i++) {
+               menuhandle = GetMenu(i + MENU_OFFSET);
+               if (menuhandle == 0) 
+                       break;
+
+               if (i < MENU_SUBMENUS)                  /* if not a submenu */
+                       InsertMenu(menuhandle, 0);
+               else
+                       InsertMenu(menuhandle, -1);
+               menus[i] = menuhandle;
+       }
+       AddResMenu (menus[APPL_MENU], 'DRVR');
+       DrawMenuBar();
+
+#ifdef KRB4
+       s = krb_start_session((char *)0);
+       if (s != KSUCCESS) {
+               doalert("Kerberos driver is not installed");
+               getout(0);
+       }
+#endif
+
+#ifdef KRB5
+    krb5_init_context(&kcontext);
+    if (kcontext->profile == 0)
+    {
+       doalert("Kerberos configuration file not present");
+       getout(0);
+    }
+    krb5_init_ets(kcontext);
+#endif
+
+       /*
+        * build the main window
+        */
+       bzero(&oldzoom, sizeof(oldzoom));
+#ifdef KRB4
+       getRealmMaps();
+       getServerMaps();
+#endif
+#ifdef KRB5
+       getServerMaps();        /* Get Servers first */
+       getRealmMaps();         /* Need servers to get realms */
+#endif
+       buildmain();
+
+       /*
+        * Run the main event loop.
+        */
+       mainEvent();
+}
+
+
+/*
+ * mainEvent
+ * The main event loop.
+ */
+void mainEvent ()
+{
+       int s, state;
+       int aborted;
+       int in_background;
+       int running = TRUE;
+       unsigned long curtime;
+       short item;
+       EventRecord event;
+       DialogPtr mydlg;
+       Point cell;
+       
+       while (running) {
+               WaitNextEvent (everyEvent, &event, 30, NULL);
+               
+               /*
+                * Update display items.
+                */
+               updatedisplay();
+
+               /*
+                * Set the state of the edit and delete buttons depending on if any
+                * cells are selected or not.
+                */
+               SetPt(&cell, 0, 0);
+               if (LGetSelect(true, &cell, dlist))
+                       state = 0;
+               else
+                       state = 255;                                    /* disable */
+               HiliteControl((ControlHandle) ddeleteHandle, state);
+               HiliteControl((ControlHandle) deditHandle, state);
+
+               SetPt(&cell, 0, 0);
+               if (LGetSelect(true, &cell, slist))
+                       state = 0;
+               else
+                       state = 255;                                    /* disable */
+               HiliteControl((ControlHandle) sdeleteHandle, state);
+               HiliteControl((ControlHandle) seditHandle, state);
+
+               /*
+                * First handle some events we want to see before the
+                * Dialog Manager sees them. If we continue, we will
+                * bypass letting the Dialog Manager look at the
+                * events.
+                */
+               switch (event.what) {
+               case mouseDown:
+                       if (HandleMouseDown(&event))
+                               continue;
+                       break;
+
+               case keyDown:
+                       if ((event.modifiers & cmdKey) && 
+                               ((event.message & 0x7f) == '.')) {
+                               aborted = TRUE;
+                               SysBeep(20);
+                               continue;
+                       } else if (event.modifiers & cmdKey) {
+                               HandleMenu(MenuKey(event.message&charCodeMask), 
+                                                  event.modifiers);
+                               continue;
+                       }
+                       break;
+
+               case app4Evt:                                   /* really a suspend/resume event */
+                       switch ((event.message>>24) & 0xff) {
+                       case switchEvt:
+                               /* Treat switch events as activate events too */
+                               if (event.message & 0x01) { /* Resume Event */
+                                       in_background = FALSE;
+                                       doactivate(FrontWindow(), activeFlag);
+                                       break;
+                               } else {                                /* Suspend Event */
+                                       in_background = TRUE;
+                                       doactivate(FrontWindow(), 0);
+                                       break;
+                               }
+                       }
+                       break;
+
+               case updateEvt:
+                       if (doupdate((WindowPtr) event.message)) /* handle updates */
+                               continue;
+                       break;
+
+               case activateEvt:                               /* (de)active a window */
+                       if (doactivate((WindowPtr) event.message, event.modifiers))
+                               continue;
+                       break;
+
+               case diskEvt:                                   /* disk inserted */
+                       if (((event.message >> 16) & 0xFFFF) != noErr) {
+                               DILoad();
+                               DIBadMount(event.where, event.message);
+                               DIUnload();
+                               continue;
+                       }
+                       break;
+               } /* switch */
+
+               /*
+                * Let the Dialog Manager have a crack at it.
+                */
+               if (IsDialogEvent (&event))
+                       if (DialogSelect (&event, &mydlg, &item))
+                               if (mydlg == maind)
+                                       mainhit(&event, mydlg, item);
+       }                                                                       /* while */
+       
+       getout(0);
+}
+
+
+int HandleMouseDown (event)
+       EventRecord *event;
+{
+       struct cmdw *cmdw;
+       WindowPtr window;
+
+       int windowCode = FindWindow (event->where, &window);
+       
+       switch (windowCode) {
+       
+       case inSysWindow: 
+               SystemClick (event, window);
+               return TRUE;
+               
+       case inMenuBar:
+               HandleMenu(MenuSelect(event->where), event->modifiers);
+               return TRUE;
+               
+       case inContent:
+               if (window != FrontWindow ()) {
+                       if (window == (WindowPtr)maind) {
+                               SelectWindow(window);
+                               return TRUE;
+                       }
+               } else if (window == (WindowPtr)maind) {
+#ifdef notdef
+                       (void) listevents(maind, event);
+                       return TRUE;
+#endif
+               }
+               break;
+
+       case inDrag:                                            /* Wanna drag? */
+               SelectWindow(window);
+               DragWindow (window, event->where, &qd.screenBits.bounds);
+               writeprefs();
+               return TRUE;
+
+       case inGoAway:
+               if (window == (WindowPtr)maind)
+                       if (TrackGoAway (window, event->where))
+                               getout(0);
+               break;
+
+#ifdef notdef
+       case inGrow:
+               if (window != FrontWindow()) {
+                       SelectWindow(window);
+                       return TRUE;
+               } else {
+                       if (window == (WindowPtr)maind) {
+                               dogrow(window, event->where);
+                               return TRUE;
+                       }
+               }
+               break;
+#endif
+               
+       case inZoomOut:
+               if (window == (WindowPtr)maind) {
+               }
+               break;
+               
+       } /* switch */
+
+       return FALSE;
+}
+
+
+/*
+ * HandleMenu - handle menu events.
+ */
+HandleMenu (long which, short modifiers)
+{
+       int id;                                                         /* menu id */
+       int item;                                                       /* menu item */
+       int s;
+       short num;
+       WindowPtr window;
+       struct cmdw *cmdw;
+       char fname[256];
+       Point pt;
+       SFReply reply;
+       
+       item = which & 0xFFFF;
+       id = which >> 16;
+       
+       switch (id - MENU_OFFSET) {
+       case APPL_MENU:                                         /* Mac system menu item */
+               handapple(item);
+               break;
+
+       case FILE_MENU:                                         /* File menu */
+               switch (item) {
+               case LOGIN_FILE:
+                       doLogin();
+                       break;
+               
+               case LOGOUT_FILE:
+                       doLogout();
+                       break;
+               
+               case PASSWORD_FILE:
+                       kpass_dialog();
+                       break;
+
+               case LIST_FILE:
+                       klist_dialog();
+                       break;
+
+               case QUIT_FILE:                                 /* Quit */
+               case CLOSE_FILE:                                /* Close Window */
+                       getout(0);
+               }
+               break;
+
+       case EDIT_MENU:
+               window = FrontWindow();
+       
+               switch(item) {
+               case UNDO_EDIT:                                 /* undo */
+                       SysBeep(3);
+                       break;
+
+               case CUT_EDIT:                                  /* cut */
+                       break;
+
+               case COPY_EDIT:                                 /* copy */
+                       break;
+
+               case PASTE_EDIT:                                /* paste */
+                       break;
+
+               case CLEAR_EDIT:                                /* clear */
+                       break;
+               }
+               break;
+
+       }
+
+       HiliteMenu(0);
+}
+
+       
+/*
+ * doupdate
+ */
+int doupdate (WindowPtr window)
+{
+#ifdef notdef
+       GrafPtr savePort;
+
+       GetPort (&savePort);
+       SetPort (window);
+
+       if (window == (WindowPtr)maind) {
+               BeginUpdate (window);
+
+               DrawGrowIcon(window);
+
+               EndUpdate(window);
+               return FALSE;
+       }
+
+       SetPort(savePort);
+#endif
+       return FALSE;
+}
+
+
+/*
+ * doactivate
+ */
+int doactivate (WindowPtr window, int mod)
+{
+       GrafPtr savePort;
+       struct cmdw *cmdw;
+       
+       if (!window)
+               return FALSE;
+
+       GetPort (&savePort);
+       SetPort (window);
+
+       HiliteWindow (window, ((mod & activeFlag) != 0));
+       
+#ifdef notdef
+       if (window == (WindowPtr)maind)
+               DrawGrowIcon(window);
+#endif
+
+       SetPort (savePort);
+       return FALSE;
+}
+
+
+#ifdef notdef
+/*
+ * dogrow
+ */
+void dogrow (WindowPtr window, Point p)
+{
+    long gr;
+    int height;
+    int width;
+    Rect growRect;
+    GrafPtr savePort;
+
+    growRect = qd.screenBits.bounds;
+    growRect.top = 50;                                 /* minimal horizontal size */
+    growRect.left = 50;                                        /* minimal vertical size */
+
+    gr = GrowWindow(window, p, &growRect);
+
+    if (gr == 0)
+               return;
+    height = HiWord (gr);
+    width = LoWord (gr);
+
+    SizeWindow (window, width, height, FALSE); /* resize the window */
+
+    GetPort (&savePort);
+    SetPort (window);
+       /* setsizes(false); */
+    InvalRect(&window->portRect);              /* invalidate whole window rectangle */
+    EraseRect(&window->portRect);
+    SetPort (savePort);
+}
+#endif
+
+
+/* 
+ * handapple - Handle the apple menu, either running a desk accessory
+ *                        or calling a routine to display information about our
+ *                        program.      Use the practice of
+ *                        checking for available memory, and saving the GrafPort
+ *                        described in the DA Manager's Guide.
+ */
+handapple (accitem)
+       int accitem;
+{
+       GrafPtr savePort;                                       /* Where to save current port */
+       Handle acchdl;                                          /* holds ptr to accessory resource */
+       Str255 accname;                                         /* string holds accessory name */
+       long accsize;                                           /* holds size of the acc + stack */
+
+       if (accitem == 1) {
+               about ();
+               return;
+       }
+       GetItem (menus[APPL_MENU], accitem, accname); /* get the pascal name */
+       SetResLoad (FALSE);                                     /* don't load into memory */
+
+       /* figure out acc size + heap */
+       accsize = SizeResource (GetNamedResource ((ResType) 'DRVR', accname));
+       acchdl = NewHandle (accsize);           /* try for a block this size */
+       SetResLoad (TRUE);                                      /* reset flag for rsrc mgr */
+       if (!acchdl) {                                          /* if not able to get a chunk */
+               SysBeep(3);
+               return;
+       }
+       DisposHandle (acchdl);                          /* get rid of this handle */
+       GetPort (&savePort);                            /* save the current port */
+       OpenDeskAcc (accname);                          /* run desk accessory */
+       SetPort (savePort);                                     /* and put back our port */
+}
+
+
+#define DTH 14                                                 /* dialog text height */
+void about ()
+{
+       int ok;
+       GrafPtr savePort;
+       DialogPtr dialog;
+       short item;
+       short itemType;
+       Handle itemHandle;
+       Rect itemRect;
+
+       GetPort(&savePort);
+
+       PositionTemplate((Rect *)0, 'DLOG', DLOG_ABOUT, 50, 50);
+       dialog = GetNewDialog(DLOG_ABOUT, (Ptr)0, (WindowPtr)-1);
+       SetPort((GrafPtr)dialog);
+
+       /*
+        * Set the draw procedure for the user items.
+        */
+       GetDItem(dialog, ABOUT_OUT, &itemType, &itemHandle, &itemRect);
+       SetDItem(dialog, ABOUT_OUT, itemType, (Handle)dooutline, &itemRect);
+       GetDItem(dialog, ABOUT_PICT, &itemType, &itemHandle, &itemRect);
+       SetDItem(dialog, ABOUT_PICT, itemType, (Handle)dopict, &itemRect);
+
+       ok = 0;
+       do {
+               /* 
+                * process hits in the dialog.
+                */
+               ModalDialog(0, &item);
+                               
+               switch(item) {
+               case ABOUT_OK:
+                       ok = 1;
+                       break;
+               } /* switch */
+       } while (ok == 0);
+
+       DisposDialog(dialog);
+       SetPort(savePort);
+}
+
+
+pascal void pictdrawproc (short depth, short flags, GDHandle device, DialogPtr dialog)
+{
+       #pragma unused (device, flags)
+       
+       if (depth < 8)
+               drawpict(dialog, PICT_ABOUT_BW);
+       else
+               drawpict(dialog, PICT_ABOUT_C);
+}
+
+
+void drawpict (DialogPtr dialog, int id)
+{
+       Handle h;
+       Rect rect;
+    short itemType;
+    Handle itemHandle;
+    Rect itemRect;
+       GrafPtr savePort;
+
+       GetPort(&savePort);
+       SetPort(dialog);
+
+       GetDItem(dialog, ABOUT_PICT, &itemType, &itemHandle, &itemRect);
+       if (h = Get1Resource('PICT', id)) {
+               LoadResource(h);
+               if (!ResError()) {
+                       HLock(h);
+
+                       bcopy(((char *)*h)+2, &rect, sizeof(Rect));
+                       AlignRect(&itemRect, &rect, 50, 50);
+                       DrawPicture((PicHandle)h, &rect);
+                       HUnlock(h);
+               }
+       }
+       SetPort(savePort);
+}
+
+
+/*
+ * this routine will be called by the Dialog Manager to draw the pict
+ */
+pascal void dopict (DialogPtr dialog, short itemNo)
+{
+       long qdv;
+       
+       if (!trapAvailable(_DeviceLoop) || Gestalt('qd  ', &qdv) || ((qdv&0xff) == 0)) { /* if old mac */
+               drawpict(dialog, PICT_ABOUT_BW);
+       } else {
+               DeviceLoop(dialog->visRgn, (DeviceLoopDrawingProcPtr)pictdrawproc, 
+                                  (long)dialog, 0);
+       }
+}
+
+
+/*
+ * this routine will be called by the Dialog Manager to draw the outline of the
+ * default button.
+ */
+pascal void dooutline (DialogPtr dialog, short itemNo)
+{
+       short           itemType;
+       Handle          itemHandle;
+       Rect            itemRect;
+       
+       GetDItem(dialog, itemNo, &itemType, &itemHandle, &itemRect);
+       /* 
+        * outline the default button (see IM I-407).  in this case it 
+        * is the OK button. this lets the user know that pressing 
+        * the return will have the same effect as clicking this button.
+        */
+       PenSize(3, 3);
+       InsetRect(&itemRect, -4, -4);
+       FrameRoundRect(&itemRect, 16, 16);
+       PenSize(1, 1);
+}
+
+
+/*
+ * ------------------ routines ------------------
+ */
+
+
+/*
+ * updatedisplay
+ * Update the main display window.
+ */
+void updatedisplay ()
+{
+       int s, savemode;
+       Str255 scratch;
+       static Str255 oldrealm = "", olduser = "";
+       GrafPtr savePort;
+       short itemType;
+       Handle itemHandle;
+       Rect itemRect;
+       Point pt;
+               
+       if (!maind)
+               return;
+               
+       GetPort(&savePort);
+       SetPort(maind);
+       
+       /*
+        * Display the local realm
+        */
+#ifdef KRB4
+       klopb.uRealm = scratch;
+       if (s = lowcall(cKrbGetLocalRealm))
+               strcpy(scratch, "None");
+#endif
+#ifdef KRB5
+{
+char *ptr;
+       if (krb5_get_default_realm(kcontext, &ptr) == 0)
+       {
+               strcpy(scratch, ptr);
+               free(ptr);
+       }
+       else
+               strcpy(scratch, "None");
+}
+#endif
+
+       if (strcmp(scratch, oldrealm)) {
+               GetDItem(maind, MAIN_REALM, &itemType, &itemHandle, &itemRect);
+               savemode = maind->txMode;
+               MoveTo(itemRect.left+4, itemRect.bottom-4);
+               strcpy(oldrealm, scratch);
+               c2pstr(scratch);
+               TextMode(srcCopy);
+               DrawString(scratch);
+               GetPen(&pt);
+               itemRect.right -= 17;   /* room for triangle */
+               itemRect.left = pt.h;
+               InsetRect(&itemRect, 1, 1);
+               EraseRect(&itemRect);   /* erase remainder of space in rect */
+               TextMode(savemode);
+       }
+       
+       /*
+        * Display the local user
+        */
+#ifdef KRB4
+       bzero(&khipb, sizeof(krbHiParmBlock));
+       khipb.user = scratch;
+       if (s = hicall(cKrbGetUserName))
+               strcpy(scratch, "None");
+#endif
+#ifdef KRB5
+       /* FIXME */
+       strcpy(scratch, "unknown");
+#endif
+       if (strcmp(scratch, olduser)) {
+               strcpy(olduser, scratch);
+               c2pstr(scratch);
+               setText(maind, MAIN_USER, scratch);
+       }
+       SetPort(savePort);
+}
+
+
+void setText (DialogPtr dialog, int item, char *text)
+{
+       short itemType;
+       Handle itemHandle;
+       Rect itemRect;
+
+       GetDItem(dialog, item, &itemType, &itemHandle, &itemRect);
+       SetIText(itemHandle, text);
+}
+
+
+/*
+ * buildmain
+ * Build the main window.
+ */
+void buildmain ()
+{
+       int h;
+       int n, cellw;
+       int ndomains, nservers;
+       int listwidth;
+       short itemNo;                           /* the item in the dialog selected */
+       short itemType;                         /* dummy parameter for call to GetDItem */
+       Handle itemHandle;                      /* dummy parameter for call to GetDItem */
+       Rect itemRect;                          /* the location of the list in the dialog */
+       Rect dataBounds;                        /* the dimensions of the data in the list */
+       Point cellSize;                         /* width and height of a cells rectangle */
+       Point cell;                                     /* an index through the list */
+       char string[255];
+       short length;
+       short checked;                          /* flag for check box value */
+       short bit;                                      /* used as a mask to test selection flags */ 
+       struct user *user, *save, *tmp;
+       char *cp;
+       GrafPtr savePort;
+    Handle wh;                                 /* window handle */
+    Rect *rectp;
+       DialogPtr dialog;
+       Rect dRect, sRect;
+       domaintype *dp;
+       servertype *sp;
+       
+    /*
+     * Get the dialog resource and modify the location.
+     * Since it will already be in memory, GetNewDialog will use
+     * the values we just set.
+        * ??? WE SHOULD MAKE SURE THE WINDOW IS ON THE SCREEN ???
+     */
+       if (prefs.wrect.top != prefs.wrect.bottom) {
+               if (wh = GetResource('DLOG', DLOG_MAIN)) {
+                       rectp = (Rect *)*wh;
+                       bcopy(&prefs.wrect, rectp, sizeof(Rect));
+                       PositionRectOnScreen(rectp, false);
+/*                     PositionRect(rectp, rectp, 50, 50);                     /* make sure on screen */
+               }
+       }
+       maind = dialog = GetNewDialog(DLOG_MAIN, (Ptr)0, (WindowPtr) -1);
+       if (!maind) {
+               doalert("DLOG %d missing", DLOG_MAIN);
+               getout(0);
+       }
+       GetPort(&savePort);
+       SetPort((GrafPtr)maind);
+
+       /* 
+        * allow the dialog manager routines to access various things
+        */
+       ((DialogPeek)dialog)->window.refCon = (long)&lf;
+               
+       /* 
+        * set the procedure pointer for the user items in the dialog.
+        * this will allow he default button to be outlined and the list 
+        * to be drawn by the Dialog Manger.
+     * Also, set the correct list heights.
+        */
+       GetDItem(dialog, MAIN_REALM, &itemType, &itemHandle, &itemRect);
+       SetDItem(dialog, MAIN_REALM, itemType, (Handle)drawRealm, &itemRect);
+       
+       GetDItem(dialog, MAIN_DMAP, &itemType, &itemHandle, &dRect);
+       h = (((dRect.bottom - dRect.top) / CELLH) * CELLH);
+       dRect.bottom = dRect.top + h;
+       SetDItem(dialog, MAIN_DMAP, itemType, (Handle) dolist, &dRect);
+
+       GetDItem(dialog, MAIN_SERVERS, &itemType, &itemHandle, &sRect);
+       h = (((sRect.bottom - sRect.top) / CELLH) * CELLH);
+       sRect.bottom = sRect.top + h;
+       SetDItem(dialog, MAIN_SERVERS, itemType, (Handle) dolist, &sRect);
+
+       GetDItem(dialog, MAIN_DDELETE, &itemType, &ddeleteHandle, &itemRect);
+       GetDItem(dialog, MAIN_SDELETE, &itemType, &sdeleteHandle, &itemRect);
+       GetDItem(dialog, MAIN_DEDIT, &itemType, &deditHandle, &itemRect);
+       GetDItem(dialog, MAIN_SEDIT, &itemType, &seditHandle, &itemRect);
+
+       listwidth = dRect.right - dRect.left;
+
+       /* 
+        * make room for scroll bars (see IM IV-270)
+        */
+       dRect.right -= 15;
+       sRect.right -= 15;      
+
+       /* 
+        * create domain list
+        */
+       ndomains = 0;                                                           /* count items */
+       for (dp = (domaintype *)domainQ; dp; dp = dp->next)
+               ndomains++;
+       SetRect(&dataBounds, 0, 0, 1, ndomains);
+       SetPt(&cellSize, dRect.right-dRect.left, CELLH);
+       dlist = LNew(&dRect, &dataBounds, cellSize, 128,
+                               (WindowPtr) dialog, false, false, false, true);
+
+       /* 
+        * use the default selection flags
+        */
+       (*dlist)->selFlags = 0;
+
+       /*
+        * Initialize the cells in the list.
+        */
+       dp = (domaintype *)domainQ;
+       cell.h = cell.v = 0;
+       while (dp) {
+               setdcellstring(string, dp);
+               LSetCell(string, strlen(string), cell, dlist);
+               cell.v++;
+               dp = dp->next;
+       }
+
+       /* 
+        * create servers list
+        */
+       nservers = 0;                                                           /* count items */
+       for (sp = (servertype *)serverQ; sp; sp = sp->next)
+               nservers++;
+       SetRect(&dataBounds, 0, 0, 1, nservers);
+       SetPt(&cellSize, sRect.right-sRect.left, CELLH);
+       slist = LNew(&sRect, &dataBounds, cellSize, 128, 
+                               (WindowPtr) dialog, false, false, false, true);
+
+       /* 
+        * use the default selection flags
+        */
+       (*slist)->selFlags = 0;
+
+       /*
+        * Initialize the cells in the list.
+        */
+       sp = (servertype *)serverQ;
+       cell.h = cell.v = 0;
+       while (sp) {
+               setscellstring(string, sp);
+               LSetCell(string, strlen(string), cell, slist);
+               cell.v++;
+               sp = sp->next;
+       }
+
+       lf.nlists = 2;
+       lf.list[0] = dlist;
+       lf.list[1] = slist;
+       lf.listitem[0] = MAIN_DMAP;
+       lf.listitem[1] = MAIN_SERVERS;
+       lf.edititem[0] = MAIN_DEDIT;
+       lf.edititem[1] = MAIN_SEDIT;
+
+       /* 
+        * turn cell drawing on only after the cell contents have been initialized.
+        * this will avoid watching the delay between the LSetCells 
+        * calls and is faster.
+        */
+       LDoDraw(true, dlist);
+       LDoDraw(true, slist);
+               
+       DrawMenuBar();
+       SetPort (savePort);                                     /* and put back our port */
+}
+
+
+/*
+ * setdcellstring
+ */
+void setdcellstring (unsigned char *string, domaintype *dp)
+{
+       unsigned char *cp;
+
+       cp = string;
+       strcpy(cp, dp->host);
+       cp += strlen(cp);
+               
+       strcpy(cp, "\x09" "170;");                      /* tab over */
+       cp += strlen(cp);
+
+       strcpy(cp, dp->realm);
+       cp += strlen(cp);
+
+       *cp = '\0';
+}
+
+
+/*
+ * setscellstring
+ */
+void setscellstring (unsigned char *string, servertype *sp)
+{
+       unsigned char *cp;
+
+       cp = string;
+       strcpy(cp, sp->host);
+       cp += strlen(cp);
+               
+       strcpy(cp, "\x09" "170;");                      /* tab over */
+       cp += strlen(cp);
+
+       strcpy(cp, sp->realm);
+       cp += strlen(cp);
+
+       if (sp->admin) {
+               strcpy(cp, "\x09" "360;");
+               cp += strlen(cp);
+               strcpy(cp, "Admin");
+               cp += strlen(cp);
+       }
+
+       *cp = '\0';
+}
+
+
+/*
+ * setrcellstring
+ */
+void setrcellstring (unsigned char *string, credentialstype *rp)
+{
+#ifdef KRB4
+       unsigned char *cp;
+       
+       cp = string;                            /* name */
+       strcpy(cp, rp->name);   
+       cp += strlen(cp);
+       if (rp->instance[0]) {          /* instance */
+               *cp++ = '.';
+               strcpy(cp, rp->instance);
+               cp += strlen(cp);
+       }
+       if (rp->realm[0]) {                     /* realm */
+               *cp++ = '@';
+               strcpy(cp, rp->realm);
+               cp += strlen(cp);
+       }
+       strcpy(cp, "\x09" "170;");      /* tab */
+       cp += strlen(cp);
+       strcpy(cp, rp->sname);          /* sname */
+       cp += strlen(cp);
+       if (rp->sinstance[0]) {         /* sinstance */
+               *cp++ = '.';
+               strcpy(cp, rp->sinstance);
+               cp += strlen(cp);
+       }
+       if (rp->srealm[0]) {            /* srealm */
+               *cp++ = '@';
+               strcpy(cp, rp->srealm);
+               cp += strlen(cp);
+       }
+       *cp = '\0';
+#endif
+#ifdef KRB5
+       unsigned char *cp;
+       
+       cp = string;                            /* name */
+       strcpy(cp, rp->name);   
+       cp += strlen(cp);
+       if (rp->realm[0]) {                     /* realm */
+               *cp++ = '@';
+               strcpy(cp, rp->realm);
+               cp += strlen(cp);
+       }
+       strcpy(cp, "\x09" "170;");      /* tab */
+       cp += strlen(cp);
+       strcpy(cp, rp->sname);          /* sname */
+       cp += strlen(cp);
+       if (rp->srealm[0]) {            /* srealm */
+               *cp++ = '@';
+               strcpy(cp, rp->srealm);
+               cp += strlen(cp);
+       }
+       *cp = '\0';
+#endif
+}
+
+
+/*
+ * drawRealm
+ * Called by the Dialog manager to draw user items
+ */
+pascal void drawRealm (DialogPtr dialog, short item)
+{
+       int s, savemode;
+       short itemType;
+       Handle itemHandle;
+       Rect itemRect;
+       Str255 scratch;
+       GrafPtr savePort;
+       Point pt;
+       
+       GetPort(&savePort);
+       SetPort(dialog);
+
+       /*
+        * Display the local realm
+        */
+#ifdef KRB4
+       klopb.uRealm = scratch;
+       if (s = lowcall(cKrbGetLocalRealm))
+               strcpy(scratch, "None");
+#endif
+#ifdef KRB5
+{
+char *ptr;
+       if (krb5_get_default_realm(kcontext, &ptr) == 0)
+       {
+               strcpy(scratch, ptr);
+               free(ptr);
+       }
+       else
+               strcpy(scratch, "None");
+}
+#endif
+
+       GetDItem(dialog, item, &itemType, &itemHandle, &itemRect);
+       EraseRect(&itemRect);
+       doshadow(&itemRect);
+       dotriangle(&itemRect);
+
+       savemode = dialog->txMode;
+       MoveTo(itemRect.left+4, itemRect.bottom-4);
+       c2pstr(scratch);
+       TextMode(srcCopy);
+       DrawString(scratch);
+       TextMode(savemode);
+       GetPen(&pt);
+       itemRect.right -= 17;   /* room for triangle */
+       itemRect.left = pt.h;
+       InsetRect(&itemRect, 1, 1);
+       EraseRect(&itemRect);   /* erase remainder of space in rect */
+
+       SetPort(savePort);
+}
+
+
+/*
+ * this routine will be called by the Dialog Manager to draw the list. 
+ */
+pascal void dolist (DialogPtr dialog, short itemNo)
+{
+       int i;
+       short itemType;
+       Handle itemHandle;
+       Rect itemRect;
+       ListHandle list;
+       struct listfilter *lf;
+
+       /*
+        * figure out which list is being updated
+        */
+       lf = (struct listfilter *) ((DialogPeek)dialog)->window.refCon;
+       for (i = 0; i < lf->nlists; i++)
+               if (lf->listitem[i] == itemNo)
+                       break;
+       if (i == lf->nlists)
+               return;
+               
+       list = lf->list[i];
+       GetDItem(dialog, itemNo,  &itemType, &itemHandle, &itemRect);
+       
+       /* 
+        *let the List Manager draw the list
+        */
+       LUpdate(dialog->visRgn, list);
+       
+       /* 
+        * draw the lists framing rectangle OUTSIDE the view rectangle.
+        * if the frame is drawn inside the view rectangle then these lines
+        * will be erased, drawn onto or scrolled by the List Manager 
+        * since the lines are within the rectangle LM expects to be 
+        * able to draw in.
+        */
+       InsetRect(&itemRect, -1, -1);
+       FrameRect(&itemRect);
+}
+
+
+/*
+ * mainhit
+ * Called when an item in the dialog box is hit.
+ */
+void mainhit (EventRecord *event, DialogPtr dlg, int item)
+{
+       int s, i, n;
+       int admin;
+       int listwidth;
+       short itemType;                         /* dummy parameter for call to GetDItem */
+       Handle itemHandle;                      /* dummy parameter for call to GetDItem */
+       Rect itemRect;                          /* the location of the list in the dialog */
+       Point where;
+       Point cell;
+       GrafPtr savePort;
+       char e1[256];
+       char e2[256];
+       domaintype *dp;
+       servertype *sp;
+       Str255 string, oldh, oldr;
+       
+       GetPort(&savePort);
+       SetPort(dlg);
+
+       switch (item) {
+       case MAIN_LOGIN:                                                /* login button */
+               doLogin();
+               break;
+               
+       case MAIN_LOGOUT:                                               /* logout button */
+               doLogout();
+               break;
+               
+       case MAIN_DMAP:                                                 /* domain map ui */
+               where = event->where;
+               GlobalToLocal(&where);
+               /*
+                * Unselect cells in other list
+                */
+               cell.h = cell.v = 0;
+                while (LGetSelect(true, &cell, slist))
+                       LSetSelect(false, cell, slist);
+
+               /* 
+                * let the List Manager process the mouse down. this includes 
+                * cell selection dragging, scrolling and double clicks by the 
+                * user.
+                */
+               if (LClick(where, event->modifiers, dlist)) {
+                       /* 
+                        * a double click in a cell has occured. find out in which 
+                        * one of the cells the user has double clicked in.
+                        */
+                       cell = LLastClick(dlist);
+                       goto dedit;
+               }
+
+               break;
+               
+       case MAIN_SERVERS:                                              /* servers map ui */
+               where = event->where;
+               GlobalToLocal(&where);
+               /*
+                * Unselect cells in other list
+                */
+               cell.h = cell.v = 0;
+                while (LGetSelect(true, &cell, dlist))
+                       LSetSelect(false, cell, dlist);
+
+               /* 
+                * let the List Manager process the mouse down. this includes 
+                * cell selection dragging, scrolling and double clicks by the 
+                * user.
+                */
+               if (LClick(where, event->modifiers, slist)) {
+                       /* 
+                        * a double click in a cell has occured. find out in which 
+                        * one of the cells the user has double clicked in.
+                        */
+                       cell = LLastClick(slist);
+                       goto sedit;
+               }
+               break;
+               
+       case MAIN_PASSWORD:                                             /* change password button */
+               kpass_dialog();
+               break;
+
+       case MAIN_DNEW:                                                 /* domain new */
+               e1[0] = e2[0] = '\0';
+               if (editlist(DLOG_DEDIT, e1, e2, 0)) {
+                       if (!(dp = (domaintype *)NewPtrClear(sizeof(domaintype)))) {
+                               SysBeep(20);
+                               break;
+                       }
+                       if (newdp(dp, e1, e2)) {
+                               qlink(&domainQ, dp);
+                               cell.v = (*dlist)->dataBounds.bottom;
+                               cell.h = 0;
+                               setdcellstring(string, dp);
+                               LAddRow(1, cell.v, dlist);
+                               LSetCell(string, strlen(string), cell, dlist);
+                       }
+                       addRealmMap(e1, e2);                                    
+               }
+               break;
+               
+       case MAIN_DDELETE:                                              /* domain delete */
+               /*
+                * Loop for selected cells.
+                */
+                SetPt(&cell, 0, 0);
+                while (LGetSelect(true, &cell, dlist)) {
+                       dp = (domaintype *)domainQ;
+                       i = cell.v;
+                       while (dp && (i-- > 0))         /* find selected credential */
+                               dp = dp->next;
+                       if (dp) {
+                               qunlink(&domainQ, dp);
+                               deleteRealmMap(dp->host);
+                               DisposePtr((Ptr)dp);
+                               LSetSelect(false, cell, dlist);
+                               LDelRow(1, cell.v, dlist);
+                               SetPt(&cell, 0, 0);
+                       } else {                                                /* we are broken */
+                               SysBeep(20);
+                               break;
+                       }
+               }
+               break;
+               
+       case MAIN_DEDIT:                                                /* domain edit */
+       dedit:
+               /*
+                * Loop for selected cells.
+                */
+               SetPt(&cell, 0, 0);
+               while (LGetSelect(true, &cell, dlist)) {
+                       dp = (domaintype *)domainQ;
+                       i = cell.v;
+                       while (dp && (i-- > 0))         /* find selected item */
+                               dp = dp->next;
+                       if (dp) {
+                               strcpy(e1, dp->host);
+                               strcpy(e2, dp->realm);
+                               strcpy(oldh, dp->host);
+                               if (editlist(DLOG_DEDIT, e1, e2, 0)) {
+                                       if (newdp(dp, e1, e2)) {
+                                               setdcellstring(string, dp);
+                                               LSetCell(string, strlen(string), cell, dlist);
+                                       }
+                                       deleteRealmMap(oldh);
+                                       addRealmMap(e1, e2);                                    
+                               }
+                               LSetSelect(false, cell, dlist);         /* unselect item */
+                               SetPt(&cell, 0, 0);
+                       } else {                                                /* we are broken */
+                               SysBeep(20);
+                               break;
+                       }
+               }
+               break;
+
+       case MAIN_SNEW:                                                 /* server new */
+               e1[0] = e2[0] = '\0';
+               admin = 0;
+               if (editlist(DLOG_SEDIT, e1, e2, &admin)) {
+                       if (!(sp = (servertype *)NewPtrClear(sizeof(servertype)))) {
+                               SysBeep(20);
+                               break;
+                       }
+                       if (newsp(sp, e1, e2, admin)) {
+                               qlink(&serverQ, sp);
+                               cell.v = (*slist)->dataBounds.bottom;
+                               cell.h = 0;
+                               setscellstring(string, sp);
+                               LAddRow(1, cell.v, slist);
+                               LSetCell(string, strlen(string), cell, slist);
+                       }
+                       addServerMap(e1, e2, admin);
+               }
+               break;
+               
+       case MAIN_SDELETE:                                              /* server delete */
+               /*
+                * Loop for selected cells.
+                */
+                SetPt(&cell, 0, 0);
+                while (LGetSelect(true, &cell, slist)) {
+                       sp = (servertype *)serverQ;
+                       i = cell.v;
+                       while (sp && (i-- > 0))         /* find selected credential */
+                               sp = sp->next;
+                       if (sp) {
+                               qunlink(&serverQ, sp);
+                               deleteServerMap(sp->host, sp->realm);
+                               DisposePtr((Ptr)sp);
+                               LSetSelect(false, cell, slist);
+                               LDelRow(1, cell.v, slist);
+                               SetPt(&cell, 0, 0);
+                       } else {                                                /* we are broken */
+                               SysBeep(20);
+                               break;
+                       }
+               }
+               break;
+
+       case MAIN_SEDIT:                                                /* server edit */
+       sedit:
+               /*
+                * Loop for selected cells.
+                */
+               SetPt(&cell, 0, 0);
+               while (LGetSelect(true, &cell, slist)) {
+                       sp = (servertype *)serverQ;
+                       i = cell.v;
+                       while (sp && (i-- > 0))         /* find selected item */
+                               sp = sp->next;
+                       if (sp) {
+                               strcpy(e1, sp->host);
+                               strcpy(e2, sp->realm);
+                               strcpy(oldh, sp->host);
+                               strcpy(oldr, sp->realm);
+                               admin = sp->admin;
+                               if (editlist(DLOG_SEDIT, e1, e2, &admin)) {
+                                       if (newsp(sp, e1, e2, admin)) {
+                                               setscellstring(string, sp);
+                                               LSetCell(string, strlen(string), cell, slist);
+                                       }
+                                       deleteServerMap(oldh, oldr);
+                                       addServerMap(e1, e2, admin);
+                               }
+
+                               LSetSelect(false, cell, slist);         /* unselect item */
+                               SetPt(&cell, 0, 0);
+                       } else {                                                /* we are broken */
+                               SysBeep(20);
+                               break;
+                       }
+               }
+               break;
+               
+       case MAIN_REALM:
+               GetDItem(dlg, MAIN_REALM, &itemType, &itemHandle, &itemRect);
+               if (popRealms(&itemRect, &string)) {
+                       trimstring(string);
+#ifdef KRB4
+                       bzero(&klopb, sizeof(klopb));
+                       klopb.uRealm = string;
+                       if (s = lowcall(cKrbSetLocalRealm))
+                               kerror("Error in cKrbSetLocalRealm", s);
+#endif
+#ifdef KRB5
+{
+int            code;
+struct profile_node *node;
+char   *nam, *val;
+void   *state;
+
+                       if ((s = krb5_set_default_realm(kcontext, string)) != 0)
+                               kerror("Error in cKrbSetLocalRealm", s);
+/*also change the profile string to match */
+       state = NULL;
+       code = profile_find_node_subsection(kcontext->profile->first_file->root, "libdefaults", &state, &nam, &node);
+       code = profile_delete_node_relation(node, "default_realm");
+       code = profile_add_node(node, "default_realm", string, &node);
+}                      
+#endif
+               }                       
+               break;
+
+       default:
+               break;
+       }
+
+       SetPort(savePort);
+}
+
+
+/*
+ * klist_dialog
+ * Display credentials and allow selection/deletion
+ */
+void klist_dialog ()
+{
+       int i, ncredentials, listwidth;
+       DialogPtr dialog;                       /* the dialog */
+       short itemNo;                           /* the item in the dialog selected */
+       short itemType;                         /* dummy parameter for call to GetDItem */
+       Handle itemHandle;                      /* dummy parameter for call to GetDItem */
+       Rect itemRect;                          /* the location of the list in the dialog */
+       Handle deleteHandle;            /* handle of delete button */
+       ListHandle list;                        /* the list constructed in the dialog */
+       Rect dataBounds;                        /* the dimensions of the data in the list */
+       Point cellSize;                         /* width and height of a cells rectangle */
+       Point cell;                                     /* an index through the list */
+       GrafPtr savePort;
+       unsigned char string[512+4];
+       int state;
+       int changed = false;
+       credentialstype *rp;
+       struct listfilter lf;
+       
+       getCredentialsList();
+       
+       /*
+     * Get the dialog resource and modify the location.
+     * Since it will already be in memory, GetNewDialog will use
+     * the values we just set.
+     */
+       PositionTemplate((Rect *)-1, 'DLOG', DLOG_KLIST, 50, 50);
+       dialog = GetNewDialog(DLOG_KLIST, (Ptr) 0, (WindowPtr) -1);
+       GetPort(&savePort);
+       SetPort((GrafPtr) dialog);
+
+       GetDItem(dialog, KLIST_DELETE, &itemType, &deleteHandle, &itemRect);
+
+#ifdef KRB5
+/* use logout to delete credentials */
+       HideDItem(dialog, KLIST_DELETE);
+#endif
+
+       /* 
+        * allow the dialog manager routines to access various things
+        */
+       ((DialogPeek)dialog)->window.refCon = (long)&lf;
+               
+       /* 
+        * set the procedure pointer for the user items in the dialog.
+        * this will allow he default button to be outlined and the list 
+        * to be drawn by the Dialog Manger.
+        */
+       GetDItem(dialog, KLIST_OUT, &itemType, &itemHandle, &itemRect);
+       SetDItem(dialog, KLIST_OUT, itemType, (Handle) dooutline, &itemRect);
+               
+       GetDItem(dialog, KLIST_LIST, &itemType, &itemHandle, &itemRect);
+       SetDItem(dialog, KLIST_LIST, itemType, (Handle) dolist, &itemRect);
+       /* note item rect used later */
+
+       ShowWindow(dialog);
+
+       listwidth = itemRect.right - itemRect.left;
+
+       /* 
+        * make room for scroll bars (see IM IV-270)
+        */
+       itemRect.right -= 15;
+
+       /* 
+        * create a list
+        */
+       ncredentials = 0;                                                               /* count credentials */
+       for (rp = (credentialstype *)credentialsQ; rp; rp = rp->next)
+               ncredentials++;
+       SetRect(&dataBounds, 0, 0, 1, ncredentials);
+       SetPt(&cellSize, itemRect.right-itemRect.left, CELLH);
+       list = LNew(&itemRect, &dataBounds, cellSize, 128, 
+                               (WindowPtr) dialog, false, false, false, true);
+
+       /* 
+        * use the default selection flags
+        */
+       (*list)->selFlags = 0;
+
+       /*
+        * Initialize the cells in the list.
+        */
+       rp = (credentialstype *)credentialsQ;
+       cell.h = cell.v = 0;
+       while (rp) {
+               setrcellstring(string, rp);
+               LSetCell(string, strlen(string), cell, list);
+               cell.v++;
+               rp = rp->next;
+       }
+
+       lf.nlists = 1;
+       lf.list[0] = list;
+       lf.listitem[0] = KLIST_LIST;
+       lf.edititem[0] = 0;
+
+       /* 
+        * turn cell drawing on only after the cell contents have been initialized.
+        * this will avoid watching the delay between the LSetCells 
+        * calls and is faster.
+        */
+       LDoDraw(true, list);
+               
+       do {
+               /*
+                * Set the state of the edit and delete buttons depending on if any
+                * cells are selected or not.
+                */
+               SetPt(&cell, 0, 0);
+               if (LGetSelect(true, &cell, list))
+                       state = 0;
+               else
+                       state = 255;                                    /* disable */
+               HiliteControl((ControlHandle) deleteHandle, state);
+
+               /* 
+                * process hits in the dialog.
+                */
+               ModalDialog(klistFilter, &itemNo);
+                               
+               switch(itemNo) {
+                       /* 
+                        * process hits in the OK button.
+                        */ 
+               case KLIST_OK:
+                       /* 
+                        * find out which cells have been selected.
+                        */
+                       SetPt(&cell, 0, 0);
+                       while(LGetSelect(true, &cell, list)) {
+                               /* 
+                                * there is nothing to do with the user's selections in 
+                                * this sample so i'll just deselect the cells the 
+                                * users has selected.
+                                */
+                               LSetSelect(false, cell, list);
+                       }
+                       break;
+                       
+               case KLIST_DELETE:
+                       changed = true;
+                       /*
+                        * Loop for selected cells.
+                        */
+                        SetPt(&cell, 0, 0);
+                        while (LGetSelect(true, &cell, list)) {
+                               rp = (credentialstype *)credentialsQ;
+                               i = cell.v;
+                               while (rp && (i-- > 0))         /* find selected credential */
+                                       rp = rp->next;
+                               if (rp) {
+                                       qunlink(&credentialsQ, rp);
+                                       deleteCredentials(rp);
+                                       DisposePtr((Ptr)rp);
+                                       LSetSelect(false, cell, list);
+                                       LDelRow(1, cell.v, list);
+                                       SetPt(&cell, 0, 0);
+                               } else {                                                /* we are broken */
+                                       SysBeep(20);
+                                       break;
+                               }
+                       }
+                       break;
+               }
+       } while (itemNo != ok);
+       
+       /*      
+        * kill the list and dialog.
+        */
+       SetPort(savePort);
+       LDispose(list);
+       DisposDialog(dialog);
+}
+
+
+/* 
+ * we need to be able to process mouse clicks in the list. the Dialog 
+ * Manager makes this possible through filter procedures like this one. 
+ * since the default filter procedure will be replaced we also need to 
+ * handle return key presses.
+ */
+pascal Boolean klistFilter (DialogPtr dialog, EventRecord *event, short *itemHit)
+{
+       int i;
+       ListHandle list;
+       Point cell;
+       char character;
+       Point where;
+       Rect itemRect;
+       short itemType;
+       Handle itemHandle;
+       struct listfilter *lf;
+       
+       lf = (struct listfilter *) ((DialogPeek)dialog)->window.refCon;
+
+       switch (event->what) {
+       
+               /* 
+                * watch for mouse clicks in the List
+                */
+       case mouseDown :
+               for (i = 0; i < lf->nlists; i++) {
+                       GetDItem(dialog, lf->listitem[i], &itemType, &itemHandle, &itemRect);
+                       where = event->where;
+                       GlobalToLocal(&where);
+               
+                       /* 
+                        * if the user has clicked in the list then we'll handle the 
+                        * processing here
+                        */
+                       if (PtInRect(where, &itemRect)) {
+                               /* 
+                                * recover the list handle. it was stuffed into the dialog 
+                                * window's refCon field when it was created.
+                                */
+                               list = lf->list[i];
+                               
+                               /* 
+                                * let the List Manager process the mouse down. this includes 
+                                * cell selection dragging, scrolling and double clicks by the 
+                                * user.
+                                */
+                               if (LClick(where, event->modifiers, list)) {
+                                       /* 
+                                        * a double click in a cell has occured. find out in which 
+                                        * one of the cells the user has double clicked in.
+                                        */
+                                       cell = LLastClick(list);
+
+                                       if (lf->edititem[i])
+                                               *itemHit = lf->edititem[i];             /* fake an edit hit if double click */
+                               } else {
+                                       /* 
+                                        * tell the application that the list has been clicked in.
+                                        */
+                                       *itemHit = lf->listitem[i];
+                               }
+                               return true;    /* event has been handled */
+                       }
+               } /* for */
+               break;
+       
+               /* 
+                * be sure and return this information so the Dialog Manager will 
+                * process the return and enter key presses as clicks by the user in 
+                * the OK button. this is only required because we have overridden 
+                * the Dialog Manager's default filtering.
+                */
+       case keyDown :  
+       case autoKey :
+               character = event->message & charCodeMask;
+               switch (character) {
+               case '\n':                      /* Return */
+               case '\003':            /* Enter */
+                       /* 
+                        * tell the application that the OK button has been clicked by 
+                        * the user.
+                        */
+                       *itemHit = 1;                           /* item 1 must be ok button */
+                       return true;                            /* we handled the event */
+               }
+               break;
+       }
+       
+       /* 
+        * tell the Dialog Manger that the event has NOT been handled and that 
+        * it should take further action on this event.
+        */
+       return false;
+}
+
+
+Boolean editlist (int dlog, char *e1, char *e2, int *admin)
+{
+       int ok, ret = false;
+       short item;
+       GrafPtr savePort;
+       DialogPtr dialog;
+       short itemType;
+       Handle itemHandle;
+       Rect itemRect;
+       char s1[256], s2[256];
+       int astate;
+
+       PositionTemplate((Rect *)-1, 'DLOG', dlog, 50, 50);
+       dialog = GetNewDialog(dlog, (Ptr) 0, (WindowPtr) -1);
+       GetPort(&savePort);
+       SetPort((GrafPtr) dialog);
+
+       /*
+        * Set the draw procedure for the user items.
+        */
+       GetDItem(dialog, EDIT_OUT, &itemType, &itemHandle, &itemRect);
+       SetDItem(dialog, EDIT_OUT, itemType, (Handle)dooutline, &itemRect);
+
+       GetDItem(dialog, EDIT_E1, &itemType, &itemHandle, &itemRect);
+       c2pstr(e1);
+       SetIText(itemHandle, e1);
+       p2cstr(e1);
+
+       GetDItem(dialog, EDIT_E2, &itemType, &itemHandle, &itemRect);
+       c2pstr(e2);
+       SetIText(itemHandle, e2);
+       p2cstr(e2);
+
+       if (admin) {
+               astate = *admin;
+               GetDItem(dialog, EDIT_ADMIN, &itemType, &itemHandle, &itemRect);
+               SetCtlValue((ControlHandle)itemHandle, astate);
+       }
+
+       SelIText(dialog, EDIT_E1, 0, 32767);                            /* select E1 */
+
+       ok = 0;
+       do {
+               /* 
+                * process hits in the dialog.
+                */
+               ModalDialog(okFilter, &item);
+               switch (item) {
+               case EDIT_OK:                                                   /* ok button */
+                       ok = 1;
+                       break;
+                       
+               case EDIT_CANCEL:
+                       ok = 2;
+                       break;
+
+               case EDIT_ADMIN:
+                       astate ^= 1;
+                       GetDItem(dialog, EDIT_ADMIN, &itemType, &itemHandle, &itemRect);
+                       SetCtlValue((ControlHandle)itemHandle, astate);
+                       break;
+               }
+       } while (ok == 0);
+       
+       if (ok == 1) {
+               GetDItem(dialog, EDIT_E1, &itemType, &itemHandle, &itemRect);
+               GetIText(itemHandle, s1);
+               p2cstr(s1);
+
+               GetDItem(dialog, EDIT_E2, &itemType, &itemHandle, &itemRect);
+               GetIText(itemHandle, s2);
+               p2cstr(s2);
+
+               if (admin) {
+                       *admin = astate;
+               }
+
+               if (!s1[0] || !s2[0])                           /* if either is empty */
+                       goto xit;
+
+               strcpy(e1, s1);
+               strcpy(e2, s2);
+
+               ret = true;
+       }
+       
+xit:
+       DisposDialog(dialog);
+       SetPort(savePort);
+       return ret;
+}
+
+
+pascal Boolean okFilter (DialogPtr dialog, EventRecord *event, short *itemHit)
+{
+       #pragma unused (dialog)
+       char character;
+
+       switch (event->what) {
+       case keyDown :  
+       case autoKey :
+               character = event->message & charCodeMask;
+               switch (character) {
+               case '\n':                      /* Return */
+               case '\003':            /* Enter */
+                       /* 
+                        * tell the application that the OK button has been clicked by 
+                        * the user.
+                        */
+                       *itemHit = 1;                           /* item 1 must be ok button */
+                       return true;                            /* we handled the event */
+               }
+               break;
+       }
+       
+       /* 
+        * tell the Dialog Manger that the event has NOT been handled and that 
+        * it should take further action on this event.
+        */
+       return false;
+}
+
+
+int popRealms (Rect *rect, char *retstring)
+{   
+    int i, s, itsID, selected;
+    MenuHandle theMenu;
+    long theChoice;
+       Point pt;
+       servertype *sp;
+       Str255 scratch, localrealm;
+                
+       /*
+        * Get the local realm
+        */
+#ifdef KRB4
+       klopb.uRealm = localrealm;
+       if (s = lowcall(cKrbGetLocalRealm))
+               strcpy(localrealm, "None");
+#endif
+#ifdef KRB5
+{
+char *ptr;
+       if (krb5_get_default_realm(kcontext, &ptr) == 0)
+       {
+               strcpy(scratch, ptr);
+               free(ptr);
+       }
+       else
+               strcpy(scratch, "None");
+}
+#endif
+
+    /* 
+        * get an id for the menu and create it. 
+        */
+    itsID = 0;
+    while (itsID < 128)
+        itsID = UniqueID('MENU');
+    theMenu = NewMenu(itsID,"\pxxx");        /* create the menu */
+    InsertMenu(theMenu, -1);                 /* add it to the menu list */
+    
+    /* 
+        * add the items 
+        */
+       selected = 0;
+       for (i = 1, sp = (servertype *)serverQ; sp; sp = sp->next, i++) {
+               strcpy(scratch, sp->realm);
+               if (strcmp(scratch, localrealm) == 0)
+                       selected = i;
+               c2pstr(scratch);
+               AppendMenu(theMenu, scratch);
+       }
+    SetItemMark(theMenu, selected, checkMark);
+       fixmenuwidth(theMenu, rect->right - rect->left);
+#if 0
+{
+ int count;
+char **realmlist;
+char   host[] = "testing";
+int            code;
+int            i;
+domaintype *dp;
+const char     *realm_kdc_names[4];
+
+    realm_kdc_names[0] = "realms";
+    realm_kdc_names[1] = 0;
+
+    code = profile_get_first_values(kcontext->profile, realm_kdc_names, &realmlist);
+
+    count = 0;
+    while (realmlist && realmlist[count])
+       {
+               strcpy(scratch, realmlist[count]);
+               c2pstr(scratch);
+               AppendMenu(theMenu, scratch);
+           count++;
+       }
+
+    /* 
+        * add the items 
+        */
+       selected = 0;
+       for (i = 1, sp = (servertype *)serverQ; sp; sp = sp->next, i++) {
+               strcpy(scratch, sp->realm);
+               if (strcmp(scratch, localrealm) == 0)
+                       selected = i;
+               c2pstr(scratch);
+               AppendMenu(theMenu, scratch);
+       }
+    SetItemMark(theMenu, selected, checkMark);
+       fixmenuwidth(theMenu, rect->right - rect->left);
+}
+#endif
+    /* 
+        *pop it up 
+        */
+       pt.h = rect->left+1;
+       pt.v = rect->top;
+       LocalToGlobal(&pt);
+    theChoice = PopUpMenuSelect(theMenu, pt.v, pt.h, selected);
+       theChoice = theChoice & 0xffff;
+    
+       if (theChoice) {
+               GetItem(theMenu, theChoice, retstring);         
+               p2cstr(retstring);
+       }
+
+    DeleteMenu(itsID);
+       DisposeMenu(theMenu);
+       
+       return(theChoice);
+}
+
+
+Boolean newdp (domaintype *dp, char *e1, char *e2)
+{
+       char *s1, *s2;
+       
+       if (!e1[0] || !e2[0])                                   /* if empty strings */
+               return false;
+               
+       strcpy(dp->host, e1);
+       strcpy(dp->realm, e2);
+       return true;
+}
+
+
+Boolean newsp (servertype *sp, char *e1, char *e2, int admin)
+{
+       char *s1, *s2;
+       
+       if (!e1[0] || !e2[0])                                   /* if empty strings */
+               return false;
+               
+       strcpy(sp->host, e1);
+       strcpy(sp->realm, e2);
+       sp->admin = admin;
+
+       return true;
+}
+
+
+/*
+ * bzero
+ * Block zero
+ */
+void bzero (void *dst, long n)
+{
+       int i;
+       register char *d = dst;
+
+       while (n--)
+       *d++ = 0;
+}
+
+
+/*
+ * bcopy
+ * Block copy
+ */
+void bcopy (void *src, void *dst, int n)
+{
+       int i;
+       register char *s = src;
+       register char *d = dst;
+
+       for (i = 0; i < n; i++)
+               *d++ = *s++;
+}
+
+
+/*
+ * getmem
+ * malloc a block of zeroed memory
+ */
+Ptr getmem (size)
+       size_t size;
+{
+       Ptr p;
+
+       p = (Ptr) malloc(size);
+       if (!p) {
+               doalert("getmem: request for %ld failed", size);
+               getout(1);
+       }
+       bzero(p, size);
+
+       return p;
+}
+
+
+/*
+ * getout
+ * clean up and get out
+ */
+getout (exit)
+       int exit;
+{
+#ifdef KRB4
+       krb_end_session((char *)0);             /* Clean up nicely */
+       ExitToShell();
+#endif
+#ifdef KRB5
+/*try to dump the profile as it exists in memory to a file */
+
+       if (kcontext->profile)
+       {
+       FILE    *daFile;
+       char    *profilepath;
+       extern char* GetMacProfilePathName(void);
+               profilepath = GetMacProfilePathName();
+               daFile = fopen(profilepath, "w+");
+               dump_profile_to_file(kcontext->profile->first_file->root, 0, daFile);
+               fclose(daFile);
+               free(profilepath);
+       }
+       ExitToShell();
+       /* FIXME */
+#endif
+}
+
+
+/*
+ * doalert
+ * Bring up an alert box
+ */
+void doalert (char *format, ...)
+{
+       char string[256];
+       va_list args;
+
+       va_start(args, format);
+
+       vsprintf(&string[1], format, args);
+       string[0] = strlen(&string[1]);
+       va_end(args);
+
+       ParamText(string, "", "", "");
+
+       PositionTemplate((Rect *)-1, 'ALRT', ALERT_DOALERT, 50, 50);
+       Alert(ALERT_DOALERT, NULL);
+}
+
+
+/*
+ * Return 0 if strings (ignoring case) match
+ */
+static int strcasecmp (char *a, char *b)
+{
+       for (;;) {
+               if (toupper(*a) != toupper(*b))
+                       return 1;
+               if (*a == '\0')
+                       return 0;
+               a++;
+               b++;
+       }
+}
+
+
+fatal (char *string)
+{
+       doalert(string);
+       getout(0);
+}
+
+
+char *copystring (char *src)
+{
+       int n;
+       char *dst;
+
+       if (!src || (*src == '\0'))
+               return NULL;
+
+       n = strlen(src);
+       dst = malloc(n+1);
+       strcpy(dst, src);
+
+       return dst;
+}
+
+
+/*
+ * isPressed
+ * k =  any keyboard scan code, 0-127
+ */
+short isPressed (unsigned short k)
+{
+       unsigned char km[16];
+
+       GetKeys((long *)km);
+       return (( km[k>>3] >> (k & 7) ) & 1);
+}
+
+
+void doLogin ()
+{
+#ifdef KRB4
+       int s;
+
+       /*
+        * Get a TGT
+        */
+       bzero(&khipb, sizeof(krbHiParmBlock));
+       khipb.service = 0;
+       if (s = hicall(cKrbCacheInitialTicket))
+               if (s != cKrbUserCancelled)
+                       kerror("Error in cKrbCacheInitialTicket", s);
+#endif
+#ifdef KRB5
+long lifetime = 8*60;  // 8 hours
+krb5_error_code code;
+krb5_principal principal;
+krb5_creds creds;
+krb5_principal server;
+krb5_int32 sec, usec;
+char usernm[100] = "";
+char passwd[100];
+char credname[100];
+char realm[100];
+char   *ptr;
+
+       if (GetUserInfo(usernm, passwd) == 2)
+               return;
+
+       if (krb5_get_default_realm(kcontext, &ptr) == 0)
+       {
+               strcpy(realm, ptr);
+               free(ptr);
+       }
+       else
+               strcpy(realm, "None");
+
+       do {
+           principal = server = NULL;
+               memset(&creds, 0, sizeof(creds));
+       
+           sprintf (credname, "%s@%s", usernm, realm);
+           code = krb5_parse_name(kcontext, credname, &principal);
+           if (code) break;
+       
+               code = krb5_cc_initialize(kcontext, k5_ccache, principal);
+           if (code) break;
+       
+               code = krb5_build_principal_ext(kcontext, &server,
+                       krb5_princ_realm(kcontext, principal)->length,
+                       krb5_princ_realm(kcontext, principal)->data,
+               KRB5_TGS_NAME_SIZE, KRB5_TGS_NAME,
+                   krb5_princ_realm(kcontext, principal)->length,
+                       krb5_princ_realm(kcontext, principal)->data, 0);
+           if (code) break;
+       
+               creds.client = principal;
+               creds.server = server;
+       
+           code = krb5_crypto_us_timeofday(&sec, &usec);
+           if (code) break;
+           creds.times.starttime = 0;
+               creds.times.endtime = sec + 60L * lifetime;
+               creds.times.renew_till = 0;
+       
+               code = krb5_get_in_tkt_with_password(kcontext, 0, NULL,
+               NULL, NULL, passwd, k5_ccache, &creds, 0);
+       } while (0);
+       
+       if (principal)
+           krb5_free_principal(kcontext, principal);
+       if (server) 
+               krb5_free_principal(kcontext, server);
+
+//jfm toss in a little error detection 
+       if (code == 0)
+       {
+               //jfm got the ticket
+               ParamText("\pTicket granted.", "\p", "\p", "\p");
+               Alert(128, NULL);
+       }
+       else
+       {
+               //jfm failed to get the ticket
+               ParamText("\pTicket refused.", "\p", "\p", "\p");
+               Alert(128, NULL);
+       }
+#endif
+}
+
+
+#ifdef KRB5
+/*+
+ * Function: destroys all tickets in a k5 ccache
+ *
+ * Parameters:
+ *  none
+ *
+ * Returns: K5 error code (0 == success)
+ */
+static krb5_error_code
+k5_dest_tkt (void) {
+    krb5_error_code code;
+    krb5_principal princ;
+
+    if (code = krb5_cc_get_principal(kcontext, k5_ccache, &princ)) {
+        kerror ("while retrieving principal name", code);
+        return code;
+    }
+
+    code = krb5_cc_initialize (kcontext, k5_ccache, princ);
+    if (code != 0) {
+        kerror ("when re-initializing cache", code);
+        krb5_free_principal (kcontext, princ);
+        return code;
+    }
+
+    krb5_free_principal (kcontext, princ);
+    return code;
+}
+#endif
+
+void doLogout ()
+{
+#ifdef KRB4
+       int s;
+       
+       pb.cntrlParam.csCode = cKrbDeleteAllSessions;
+       if ((s = PBControl(&pb, false)) || (s = pb.cntrlParam.ioResult))
+               kerror("Error in cKrbDeleteAllSessions", s);
+#endif
+#ifdef KRB5
+       k5_dest_tkt();
+#endif
+}
+
+
+void getRealmMaps ()
+{
+#ifdef KRB4
+       int i, s;
+       Str255 host, realm;
+       domaintype *dp;
+
+       for (i = 1; ;i++) {
+               klopb.itemNumber = &i;
+               klopb.host = host;
+               klopb.uRealm = realm;
+               if (s = lowcall(cKrbGetNthRealmMap))
+                       break;
+                       
+               if (!(dp = (domaintype *)NewPtrClear(sizeof(domaintype))))
+                       return;
+               strcpy(dp->realm, realm);
+               strcpy(dp->host, host);
+               qlink(&domainQ, dp);
+       }
+#endif
+#ifdef KRB5
+int count;
+char **domainlist;
+char   *realm;
+int            code;
+int            i;
+domaintype *dp;
+const char     *realm_kdc_names[4];
+
+    realm_kdc_names[0] = "domain_realm";
+    realm_kdc_names[1] = 0;
+
+    code = profile_get_first_values(kcontext->profile, realm_kdc_names, &domainlist);
+
+    count = 0;
+    while (domainlist && domainlist[count])
+       {
+               code = profile_get_string(kcontext->profile, "domain_realm", domainlist[count], NULL, "", &realm);
+
+               if (!(dp = (domaintype *)NewPtrClear(sizeof(domaintype))))
+                       return;
+               strcpy(dp->realm, realm);
+               strcpy(dp->host, domainlist[count]);
+               qlink(&domainQ, dp);
+
+           count++;
+       }
+       free(domainlist);
+#endif
+}
+
+
+void getServerMaps ()
+{
+#ifdef KRB4
+       int i, s, ar;
+       Str255 host, realm;
+       servertype *sp;
+
+       for (i = 1; ;i++) {
+               klopb.itemNumber = &i;
+               klopb.host = host;
+               klopb.uRealm = realm;
+               klopb.adminReturn = &ar;
+               if (s = lowcall(cKrbGetNthServerMap))
+                       break;
+                       
+               if (!(sp = (servertype *)NewPtrClear(sizeof(servertype))))
+                       return;
+               strcpy(sp->realm, realm);
+               strcpy(sp->host, host);
+               sp->admin = ar;
+               qlink(&serverQ, sp);
+       }
+#endif
+#ifdef KRB5
+int i, s, ar = 1;
+Str255 realm;
+servertype *sp;
+int count;
+char **realmlist;
+char   *host;
+int            code;
+const char     *realm_kdc_names[4];
+
+    realm_kdc_names[0] = "realms";
+    realm_kdc_names[1] = 0;
+
+    code = profile_get_first_values(kcontext->profile, realm_kdc_names, &realmlist);
+
+    count = 0;
+    while (realmlist && realmlist[count])
+       {
+           realm_kdc_names[0] = "realms";
+       realm_kdc_names[1] = realmlist[count];
+       realm_kdc_names[2] = "kdc";
+       realm_kdc_names[3] = 0;
+
+               code = profile_get_string(kcontext->profile, "realms", realmlist[count], "kdc", "", &host);
+       
+               if (!(sp = (servertype *)NewPtrClear(sizeof(servertype))))
+                       return;
+               strcpy(sp->realm, realmlist[count]);
+               strcpy(sp->host, host);
+               code = profile_get_string(kcontext->profile, "realms", realmlist[count], "kdc", "", &host);
+               sp->admin = ar;
+               qlink(&serverQ, sp);
+
+           count++;
+       }
+       free(realmlist);
+
+#endif
+}
+
+
+void getCredentialsList ()
+{
+#ifdef KRB4
+       int i, j, s;
+       Str255 scratch;
+       Str255 name, instance, realm, sname, sinstance, srealm, tktfile;
+       credentialstype *rp;
+
+       killCredentialsList();
+
+       /*
+        * list credentials
+        */
+       bzero(&klopb, sizeof(krbParmBlock));
+       klopb.uName = name;
+       klopb.uInstance = instance;
+       klopb.uRealm = realm;
+       klopb.sName = sname;
+       klopb.sInstance = sinstance;
+       klopb.sRealm = srealm;
+       
+       i = 1;
+       for (j = 1; ;j++) {
+               klopb.itemNumber = &i;
+               if (s = lowcall(cKrbGetNthSession)) {
+                       if (s != cKrbSessDoesntExist)
+                               kerror("cKrbGetNthSession: ", s);
+                       return;
+               }
+
+               klopb.itemNumber = &j;
+               if (s = lowcall(cKrbGetNthCredentials)) {
+                       if ((s != cKrbCredsDontExist) & 
+                               (cKrbKerberosErrBlock - s != KFAILURE)) {
+                               kerror("cKrbGetNthCredentials: ", s);
+                               break;
+                       }
+                       i += 1;
+                   j = 0;
+                       continue;
+               }
+
+               if (!(rp = (credentialstype *)NewPtrClear(sizeof(credentialstype))))
+                       return;
+                               
+               strcpy(rp->sname, sname);
+               strcpy(rp->sinstance, sinstance);
+               strcpy(rp->srealm, srealm);
+               
+               /*      
+               cKrbGetNthCredentials no longer returns the principal's, name
+               instance and realm.  Instead it returns the cache name, 
+               "fixed user", "fixed instance", "fixed realm".  Must get the 
+               principal's name, instance, and realm by calling a routine 
+               added by cns.
+               */
+
+               bzero(&klopb, sizeof(krbParmBlock));
+               klopb.fullname = tktfile;
+               klopb.uName = name;
+               klopb.uInstance = instance;
+               klopb.uRealm = realm;
+               klopb.sName = sname;
+               klopb.sInstance = sinstance;
+               klopb.sRealm = srealm;
+               
+               if (s = lowcall(cKrbGetTfFullname)) {
+                       if (s != KSUCCESS)
+                               kerror("cKrbGetTfFullname: ", s);
+                       return;
+                       }
+               
+               strcpy(rp->name, name);
+               strcpy(rp->instance, instance);
+               strcpy(rp->realm, realm);
+               
+               qlink(&credentialsQ, rp);
+       }
+#endif
+#ifdef KRB5
+       int i, j, s;
+       Str255 scratch;
+       Str255 name, instance, realm, sname, sinstance, srealm, tktfile;
+       credentialstype *rp;
+       krb5_cc_cursor cursor;
+       krb5_creds creds;
+       char            *tmpstr;
+       
+       killCredentialsList();
+
+       /*
+        * list credentials
+        */
+       cursor = 0;
+       krb5_fcc_start_seq_get(kcontext, k5_ccache, &cursor);
+       while (0 == krb5_fcc_next_cred(kcontext, k5_ccache, &cursor, &creds)) {
+/* Get Cred info here */
+
+               if (!(rp = (credentialstype *)NewPtrClear(sizeof(credentialstype))))
+                       return;
+
+               strncpy(rp->name, (char*) creds.client->data->data, sizeof(Str255));
+               strcpy(rp->instance, "instance");
+               strncpy(rp->realm, (char*) creds.client->realm.data, sizeof(Str255));
+               strncpy(rp->sname, (char*) creds.server->data->data, sizeof(Str255));
+               strcpy(rp->sinstance, "sinstance");
+               strncpy(rp->srealm, (char*) creds.server->realm.data, sizeof(Str255));
+
+               qlink(&credentialsQ, rp);
+
+//             krb5_free_cred_contents(kcontext, &creds);
+       }
+       krb5_fcc_end_seq_get(kcontext, k5_ccache, &cursor);
+       krb5_cc_default (kcontext, &k5_ccache);
+#endif
+}
+
+
+void killCredentialsList ()
+{
+       credentialstype *rp;
+       
+       while (rp = credentialsQ) {
+               qunlink(&credentialsQ, rp);
+               DisposePtr((Ptr)rp);
+       }
+}
+
+
+void addRealmMap (char *host, char *realm)
+{
+#ifdef KRB4
+       int s;
+
+       klopb.host = host;
+       klopb.uRealm = realm;
+       if (s = lowcall(cKrbAddRealmMap))
+               kerror("Error calling cKrbAddRealmMap", s);
+#endif
+#ifdef KRB5
+int            code;
+struct profile_node *node;
+char   *nam, *val;
+void   *state;
+
+       state = NULL;
+       code = profile_find_node_subsection(kcontext->profile->first_file->root, "domain_realm", &state, &nam, &node);
+       code = profile_delete_node_relation(node, host);
+       code = profile_add_node(node, host, realm, &node);
+
+#endif
+}
+
+void deleteRealmMap (char *host)
+{
+#ifdef KRB4
+       int s;
+       
+       klopb.host = host;
+       if (s = lowcall(cKrbDeleteRealmMap))
+               kerror("Error calling cKrbDeleteRealmMap", s);
+#endif
+#ifdef KRB5
+int            code;
+struct profile_node *node;
+char   *nam, *val;
+void   *state;
+
+       state = NULL;
+       code = profile_find_node_subsection(kcontext->profile->first_file->root, "domain_realm", &state, &nam, &node);
+       code = profile_delete_node_relation(node, host);
+#endif
+}
+
+
+void deleteCredentials (credentialstype *rp)
+{
+#ifdef KRB4
+       int s;
+       
+       klopb.uName = rp->name;
+       klopb.uInstance = rp->instance;
+       klopb.uRealm = rp->realm;
+       klopb.sName = rp->sname;
+       klopb.sInstance = rp->sinstance;
+       klopb.sRealm = rp->srealm;
+       if (s = lowcall(cKrbDeleteCredentials))
+               kerror("Error calling cKrbDeleteCredentials: ", s);
+#endif
+#ifdef KRB5
+       /* FIXME */
+#endif
+}
+
+
+
+void addServerMap (char *host, char *realm, int admin)
+{
+#ifdef KRB4
+       int s;
+
+       klopb.host = host;
+       klopb.uRealm = realm;
+       klopb.admin = admin;
+       if (s = lowcall(cKrbAddServerMap))
+               kerror("Error calling cKrbAddServerMap", s);
+#endif
+#ifdef KRB5
+int            code;
+struct profile_node *node, *node2;
+char   *nam, *val;
+void   *state;
+
+       state = NULL;
+       code = profile_find_node_subsection(kcontext->profile->first_file->root, "realms", &state, &nam, &node);
+       code = profile_delete_node_relation(node, realm);       /* possible memory leak here */
+       code = profile_add_node(node, realm, 0, &node);         /* Create the realm node */
+       code = profile_add_node(node, "kdc", host, &node2);             /* Create the realm node */
+       /* what about default_domain, and admin_server? */
+#endif
+}
+
+
+void deleteServerMap (char *host, char *realm)
+{
+#ifdef KRB4
+       int s;
+       
+       klopb.host = host;
+       klopb.uRealm = realm;
+       if (s = lowcall(cKrbDeleteServerMap))
+               kerror("Error calling cKrbDeleteServerMap", s);
+#endif
+#ifdef KRB5
+int            code;
+struct profile_node *node;
+char   *nam, *val;
+void   *state;
+
+       state = NULL;
+       code = profile_find_node_subsection(kcontext->profile->first_file->root, "realms", &state, &nam, &node);
+       code = profile_delete_interior_node_relation(node, realm);      /* possible memory leak here */
+#endif
+}
+
+
+void kerror (char *text, int error)
+{
+#ifdef KRB4
+       int k;
+       Str255 scratch;
+       char *etext;
+
+       switch (error) {
+       case cKrbCorruptedFile:
+               etext = "Couldn't find a needed resource";
+               break;
+       case cKrbNoKillIO:
+               etext = "Can't killIO because all calls sync";
+               break;
+       case cKrbBadSelector:
+               etext = "csCode passed doesn't select a recognized function";
+               break;
+       case cKrbCantClose:
+               etext = "We must always remain open";
+               break;
+       case cKrbMapDoesntExist:
+               etext = "Tried to access a map that doesn't exist";
+               break;
+       case cKrbSessDoesntExist:
+               etext = "Tried to access a session that doesn't exist";
+               break;
+       case cKrbCredsDontExist:
+               etext = "Tried to access credentials that don't exist";
+               break;
+       case cKrbTCPunavailable:
+               etext = "Couldn't open MacTCP driver";
+               break;
+       case cKrbUserCancelled:
+               etext = "User cancelled a log in operation";
+               break;
+       case cKrbConfigurationErr:
+               etext = "Kerberos Preference file is not configured properly";
+               break;
+       case cKrbServerRejected:
+               etext = "A server rejected our ticket";
+               break;
+       case cKrbServerImposter:
+               etext = "Server appears to be a phoney";
+               break;
+       case cKrbServerRespIncomplete:
+               etext = "Server response is not complete";
+               break;
+       case cKrbNotLoggedIn:
+               etext = "Returned by cKrbGetUserName if user is not logged in";
+               break;
+       default:
+               k = cKrbKerberosErrBlock - error;
+               if ((k > 0) && (k < 256)) {
+                       etext = krb_get_err_text(k);
+                       break;
+               }
+
+               sprintf(scratch, "Mac Kerberos error #%d", error);
+               etext = scratch;
+               break;
+       }
+
+       doalert("%s: %s", text, etext);
+#endif
+#ifdef KRB5
+       /* FIXME */
+#endif
+}
+
+#ifdef KRB4
+int lowcall (int cscode)
+{
+       short s;
+       
+       bzero(&pb, sizeof(ParamBlockRec));
+       *(long *)pb.cntrlParam.csParam = (long)&klopb;
+       pb.cntrlParam.ioCompletion = nil;
+       pb.cntrlParam.ioCRefNum = kdriver;
+
+       pb.cntrlParam.csCode = cscode;
+       if (s = PBControl(&pb, false))
+               return s;
+       if (s = pb.cntrlParam.ioResult)
+               return s;
+       return 0;
+}
+
+
+int hicall (int cscode)
+{
+       short s;
+       
+       bzero(&pb, sizeof(ParamBlockRec));
+       *(long *)pb.cntrlParam.csParam = (long)&khipb;
+       pb.cntrlParam.ioCompletion = nil;
+       pb.cntrlParam.ioCRefNum = kdriver;
+
+       pb.cntrlParam.csCode = cscode;
+       if (s = PBControl(&pb, false))
+               return s;
+       if (s = pb.cntrlParam.ioResult)
+               return s;
+       return 0;
+}
+#endif
+
+/*
+ * qlink
+ * Add an entry to the end of a linked list
+ */
+void qlink (void **flist, void *fentry)
+{
+    struct dummy {
+               struct dummy *next;
+    } **list, *entry;
+
+    list = flist;
+    entry = fentry;
+    
+    /*
+     * Find address of last entry in the list.
+     */
+    while (*list)
+       list = &(*list)->next;
+
+    /*
+     * Link entry
+     */
+    *list = entry;
+    entry->next = 0;
+}
+
+
+/*
+ * qunlink
+ * Remove an entry from linked list
+ * Returns the entry or NULL if not found.
+ */
+void *qunlink (void **flist, void *fentry)
+{
+    struct dummy {
+       struct dummy *next;
+    } **list, *entry;
+
+    list = flist;
+    entry = fentry;
+    
+    /*
+     * Find entry and unlink it
+     */
+    while (*list) {
+       if ((*list) == entry) {
+           *list = entry->next;
+           return entry;
+       }
+
+       list = &(*list)->next;
+    }
+    return NULL;
+}
+
+
+/*
+ * fixmenuwidth
+ * set minimum menu width by widening item
+ */
+void fixmenuwidth (MenuHandle themenu, int minwidth)
+{
+       Str255 scratch;
+       
+       minwidth -= 27;
+       GetItem(themenu, 1, scratch);
+       if (StringWidth(scratch) >= minwidth)
+               return;
+       while (StringWidth(scratch) < minwidth)
+               scratch[scratch[0]++ + 1] = ' ';
+       SetItem(themenu, 1, scratch);
+}
+
+
+/*
+ * doshadow
+ * Draw shadowed frame
+ * Also in sldef.c
+ */
+doshadow (Rect *rect)
+{
+       FrameRect(rect);
+       MoveTo(rect->left+2, rect->bottom);     /* shadow */
+       LineTo(rect->right, rect->bottom);
+       LineTo(rect->right, rect->top+2);
+}
+
+
+/*
+ * dotriangle
+ * Also in sldef.c
+ */
+void dotriangle (Rect *rect)
+{
+       int i;
+       PolyHandle poly;
+       Pattern black;
+       
+       for (i = 0; i < sizeof(black); i++)
+#ifdef dangerousPattern
+               black[i] = 0xff;
+#else
+               black.pat[i] = 0xff;            /* ... should use qd-> */
+#endif
+
+       poly = OpenPoly();                                                      /* should make permanent ??? */
+       MoveTo(rect->right - 16, rect->top + 5);
+       LineTo(rect->right - 5, rect->top + 5);
+       LineTo(rect->right - 10, rect->top + 10);
+       LineTo(rect->right - 16, rect->top + 5);
+       ClosePoly();
+#ifdef dangerousPattern
+       FillPoly(poly, black);
+#else
+       FillPoly(poly, &black);
+#endif
+       KillPoly(poly);
+}
+
+
+/*
+ * trimstring
+ * Trim trailing blanks from a string
+ */
+void trimstring (char *cp)
+{
+       int n;
+       
+       if (*cp == ' ')
+               return;
+       
+       if (!(n = strlen(cp)))
+               return;
+       cp += n - 1;
+       while (*cp == ' ')
+               cp--;
+       *++cp = '\0';
+}
+
+
+/* changing passwords doesn't work presently because :src:lib:kadm doesn't
+compile.  kadm doesn't compile 'cause SOCKET_STREAM isn't an available socket
+type in macsock.  I'm not even real sure this is the right way to change
+a password, this is the only example I've seen yet
+*/
+
+#ifdef KRB5
+krb5_error_code
+k5_change_password (
+    krb5_context k5context,
+       char *user,
+       char *realm,
+       char *opasswd,
+       char *npasswd,
+    char **text);
+
+
+
+#if 0
+static const char *kpwd_old_password_prompt =  "   Enter old password: ";
+#define        KPWD_MAX_TRIES          4
+
+int
+krb5_change_password(krb5_context kcontext, char *name, char *opassword, char *npassword)
+{
+    int                        conn_socket = -1;
+       char            *opwd_prompt = NULL;
+       char            opassword[KRB5_ADM_MAX_PASSWORD_LEN];
+    krb5_auth_context  *auth_context;
+       int                     npass_tries;
+       
+    /*
+     * Establish the connection.
+     */
+    if (kret = krb5_adm_connect(kcontext,
+                               name,
+                               (opwd_prompt) ? 
+                                       opwd_prompt : kpwd_old_password_prompt,
+                               opassword,
+                               &conn_socket, 
+                               &auth_context,
+                               &k5_ccache)) {
+       switch (kret) {
+       case KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN:
+           fprintf(stderr, kpwd_bad_client_fmt, argv[0],
+                   (name) ? kpwd_quote : kpwd_null,
+                   (name) ? name : kpwd_you,
+                   (name) ? kpwd_quote : kpwd_null,
+                   (name) ? kpwd_is_third : kpwd_is_second);
+           break;
+       case KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN:
+           fprintf(stderr, kpwd_no_server_fmt, argv[0],
+                   (name) ? name : kpwd_this_realm);
+           break;
+       case KRB5KRB_AP_ERR_BAD_INTEGRITY:
+           fprintf(stderr, kpwd_incorrect_fmt, argv[0]);
+           break;
+       default:
+           fprintf(stderr, kpwd_cant_connect_fmt, argv[0],
+                   error_message(kret));
+           break;
+       }
+       goto cleanup;
+    }
+
+    send_quit = 1;
+
+    /* Now - Actually change the password. */
+    for (npass_tries = 1; npass_tries <= KPWD_MAX_TRIES; npass_tries++) {
+       int npass_len;
+
+       npass_len = KRB5_ADM_MAX_PASSWORD_LEN;
+       {
+           krb5_data           check_data[2];
+           krb5_int32          check_status;
+           krb5_int32          check_ncomps;
+           krb5_data           *check_reply;
+           krb5_data           set_data[3];
+           krb5_int32          set_status;
+           krb5_int32          set_ncomps;
+           krb5_int32          *set_reply;
+
+           check_data[0].data = KRB5_ADM_CHECKPW_CMD;
+           check_data[0].length = strlen(check_data[0].data);
+           check_data[1].data = npassword;
+           check_data[1].length = npass_len;
+           if ((kret = krb5_send_adm_cmd(kcontext,
+                                         &conn_socket,
+                                         auth_context,
+                                         2,
+                                         check_data)) ||
+               (kret = krb5_read_adm_reply(kcontext,
+                                           &conn_socket,
+                                           auth_context,
+                                           &check_status,
+                                           &check_ncomps,
+                                           &check_reply))) {
+               fprintf(stderr, kpwd_proto_error_fmt, argv[0], 
+                       kpwd_check_pwd_text, error_message(kret));
+               send_quit = 0;
+               error++;
+               break;
+           }
+           if ((check_status != KRB5_ADM_SUCCESS) &&
+               (check_status != KRB5_ADM_PW_UNACCEPT)) {
+               error++;
+               fprintf(stderr, kpwd_pwproto_error, argv[0],
+                       kpwd_reply_to_string(check_status),
+                       kpwd_check_pwd_text);
+               if (check_ncomps > 0)
+                   kpwd_print_sreply(argv[0], check_ncomps, check_reply);
+           }
+
+           if (check_status == KRB5_ADM_PW_UNACCEPT) {
+               fprintf(stderr, kpwd_pwd_unacceptable, argv[0],
+                       (npass_tries < KPWD_MAX_TRIES) ? 
+                       kpwd_try_again_text : kpwd_seeyalater_text);
+               if (check_ncomps > 0)
+                   kpwd_print_sreply(argv[0], check_ncomps, check_reply);
+               if (npass_tries == KPWD_MAX_TRIES)
+                   kret = check_status;
+               continue;
+           }
+           krb5_free_adm_data(kcontext, check_ncomps, check_reply);
+           if (error)
+               break;
+
+           /* Now actually change the password */
+           set_data[0].data = KRB5_ADM_CHANGEPW_CMD;
+           set_data[0].length = strlen(set_data[0].data);
+           set_data[1].data = opassword;
+           set_data[1].length = strlen(opassword);
+           set_data[2].data = npassword;
+           set_data[2].length = npass_len;
+           if ((kret = krb5_send_adm_cmd(kcontext,
+                                         &conn_socket,
+                                         auth_context,
+                                         3,
+                                         set_data)) ||
+               (kret = krb5_read_adm_reply(kcontext,
+                                           &conn_socket,
+                                           auth_context,
+                                           &set_status,
+                                           &set_ncomps,
+                                           &set_reply))) {
+               fprintf(stderr, kpwd_proto_error_fmt, argv[0], 
+                       kpwd_change_pwd_text, error_message(kret));
+               send_quit = 0;
+               error++;
+               break;
+           }
+           if (set_status != KRB5_ADM_SUCCESS) {
+               fprintf(stderr, kpwd_pwproto_error, argv[0],
+                       kpwd_reply_to_string(set_status),
+                       kpwd_change_pwd_text);
+               if (set_ncomps > 0)
+                   kpwd_print_sreply(argv[0], set_ncomps, set_reply);
+               error++;
+           }
+           krb5_free_adm_data(kcontext, set_ncomps, set_reply);
+           break;
+       }
+    }
+
+ cleanup:
+    if (kret)
+       error = kret;
+    if (language)
+       free(language);
+    if (name)
+       free(name);
+
+    /* Clear and free password storage */
+    if (opassword) {
+       memset(opassword, 0, KRB5_ADM_MAX_PASSWORD_LEN);
+       krb5_xfree(opassword);
+    }
+    if (npassword) {
+       memset(npassword, 0, KRB5_ADM_MAX_PASSWORD_LEN);
+       free(npassword);
+    }
+
+    if (send_quit) {
+       /*
+        * Need to send quit command.
+        */
+       krb5_data       quit_data;
+       krb5_int32      quit_status;
+       krb5_int32      quit_ncomps;
+       krb5_data       *quit_reply;
+       
+       quit_data.data = KRB5_ADM_QUIT_CMD;
+       quit_data.length = strlen(quit_data.data);
+       if ((kret = krb5_send_adm_cmd(kcontext,
+                                     &conn_socket,
+                                     auth_context,
+                                     1,
+                                     &quit_data)) ||
+           (kret = krb5_read_adm_reply(kcontext,
+                                       &conn_socket,
+                                       auth_context,
+                                       &quit_status,
+                                       &quit_ncomps,
+                                       &quit_reply))) {
+           fprintf(stderr, kpwd_proto_error_fmt, argv[0], kpwd_quit_text,
+                   error_message(kret));
+           goto done;
+       }
+       switch (quit_status) {
+       case KRB5_ADM_SUCCESS:
+           break;
+       case KRB5_ADM_CMD_UNKNOWN:
+           fprintf(stderr, kpwd_pwproto_unsupp_fmt, argv[0], kpwd_quit_text);
+           if (quit_ncomps > 0)
+               kpwd_print_sreply(argv[0], quit_ncomps, quit_reply);
+           break;
+       default:
+           fprintf(stderr, kpwd_pwproto_error, argv[0],
+                   kpwd_reply_to_string(quit_status), kpwd_quit_text);
+           if (quit_ncomps > 0)
+               kpwd_print_sreply(argv[0], quit_ncomps, quit_reply);
+       }
+       krb5_free_adm_data(kcontext, quit_ncomps, quit_reply);
+    }
+
+ done:
+    krb5_adm_disconnect(kcontext, &conn_socket,        auth_context, ccache);
+    krb5_xfree(kcontext);
+    return(error);
+
+
+       return 1;
+}
+#endif
+#endif
+
+/*
+ * kpass_dialog
+ */
+void kpass_dialog ()
+{
+       int s = 0, ok;
+       short item;
+       GrafPtr savePort;
+       DialogPtr dialog;
+       short itemType;
+       Handle itemHandle;
+       Rect itemRect;
+       char *reason = NULL, username[256], realm[256];
+       struct valcruft valcruft;
+       Str255 scratch;
+
+       PositionTemplate((Rect *)-1, 'DLOG', DLOG_KPASS, 50, 50);
+       dialog = GetNewDialog(DLOG_KPASS, (Ptr) 0, (WindowPtr) -1);
+       GetPort(&savePort);
+       SetPort((GrafPtr) dialog);
+
+       /*
+        * Set the draw procedure for the user items.
+        */
+       GetDItem(dialog, KPASS_OUT, &itemType, &itemHandle, &itemRect);
+       SetDItem(dialog, KPASS_OUT, itemType, (Handle)dooutline, &itemRect);
+
+       /* preset dialog ... */
+       SetWRefCon(dialog, (long)&valcruft);    /* Stash the cruft's address */
+       bzero(&valcruft, sizeof(valcruft));
+
+#ifdef KRB4
+       /* preset initial user */
+       khipb.user = scratch;
+       if (!(s = hicall(cKrbGetUserName))) {
+               c2pstr(scratch);
+               GetDItem(dialog, KPASS_USER, &itemType, &itemHandle, &itemRect);
+               SetIText(itemHandle, scratch);
+               SelIText(dialog, KPASS_PASS, 0, 32767);
+       }
+
+       /* get local realm */
+       klopb.uRealm = realm;
+       if (s = lowcall(cKrbGetLocalRealm))
+               strcpy(realm, "");
+
+#endif
+#ifdef KRB5
+{
+char *ptr;
+       GetDItem(dialog, KPASS_USER, &itemType, &itemHandle, &itemRect);
+       SetIText(itemHandle, "\p");
+       SelIText(dialog, KPASS_PASS, 0, 32767);
+
+// Get default realm
+       if (krb5_get_default_realm(kcontext, &ptr) == 0)
+       {
+               strcpy(realm, ptr);
+               free(ptr);
+       }
+       else
+               strcpy(realm, "None");
+}
+#endif
+       
+       retry:
+       ok = 0;
+       do {
+               /* 
+                * process hits in the dialog.
+                */
+               ModalDialog(internalBufferFilter, &item);
+               switch (item) {
+               case KPASS_OK:                                  /* ok button */
+                       ok = 1;
+                       break;
+                       
+               case KPASS_CANCEL:
+                       ok = 2;
+                       break;
+
+               case KPASS_JPW:                                 /* jump to password */
+                       SelIText(dialog, KPASS_PASS, 0, 32767);                 
+                       break;
+
+               case KPASS_JNEW:                                /* jump to new */
+                       SelIText(dialog, KPASS_NEW, 0, 32767);                  
+                       break;
+
+               case KPASS_JNEW2:
+                       SelIText(dialog, KPASS_NEW2, 0, 32767);
+                       break;
+               }
+       } while (ok == 0);
+       
+       if (ok == 1) {
+               GetDItem(dialog, KPASS_USER, &itemType, &itemHandle, &itemRect);
+               GetIText(itemHandle, username);
+               p2cstr(username);
+
+#ifndef KRB5
+               /*
+                * If user put an @ in the username, ignore the realm, otherwise
+                * tack on the realm. 
+                */
+               if ((strchr(username, '@') == 0) && realm[0]) {
+                       strcat(username, "@");
+                       strcat(username, realm);
+               }
+#endif
+
+               p2cstr(valcruft.buffer1);                               /* password */
+               p2cstr(valcruft.buffer2);                               /* new */
+               p2cstr(valcruft.buffer3);                               /* new2 */
+
+               if (strcmp(valcruft.buffer2, valcruft.buffer3) != 0) {
+                       doalert("New passwords do not match");
+                       c2pstr(valcruft.buffer1);                               /* password */
+                       c2pstr(valcruft.buffer2);                               /* new */
+                       c2pstr(valcruft.buffer3);                               /* new2 */
+                       goto retry;
+               }
+
+#ifdef KRB4
+               OpenResolver(0);
+               s = kerberos_changepw(username, valcruft.buffer1, valcruft.buffer2,
+                                                         &reason);
+               CloseResolver();
+#endif
+
+#ifdef KRB5
+#if 1
+{
+char   *text;
+// Change the password from old to new
+               s = k5_change_password(kcontext, username, realm, valcruft.buffer1, valcruft.buffer2, &text);
+               if (s)
+                       SysBeep(10);    // change password failed
+
+// not sure what "text" represents
+}
+#else
+               ParamText("\pChanging passwords does not work presently.", "\p", "\p", "\p");
+               Alert(128, NULL);
+#endif
+#endif
+               if (s) {
+                       kerror(reason, s);
+                       SelIText(dialog, KPASS_PASS, 0, 32767);         /* hilite password */
+                       c2pstr(valcruft.buffer1);                               /* password */
+                       c2pstr(valcruft.buffer2);                               /* new */
+                       c2pstr(valcruft.buffer3);                               /* new2 */
+                       goto retry;
+               }
+       }
+       
+       DisposDialog(dialog);
+       SetPort (savePort);
+}
+
+
+/*
+ * Routines from Apple for hiding passwords
+ */
+pascal Boolean internalBufferFilter (DialogPtr dlog, EventRecord *event, short *itemHit)
+{      
+       char key;
+       short start,end;
+       struct valcruft *valcruft;
+       unsigned char *buffer;
+       Handle h;
+       int i, len;
+       char *cp;
+       long offset;
+       unsigned char scratch[256];
+       int editevent;
+       
+       valcruft = (struct valcruft *)GetWRefCon(dlog);
+
+       if (((DialogPeek)dlog)->editField == (KPASS_PASS - 1))
+               buffer = valcruft->buffer1;
+       else if (((DialogPeek)dlog)->editField == (KPASS_NEW - 1))
+               buffer = valcruft->buffer2;
+       else if (((DialogPeek)dlog)->editField == (KPASS_NEW2 - 1))
+               buffer = valcruft->buffer3;
+       else
+               buffer = 0;
+
+       start = (**((DialogPeek)dlog)->textH).selStart; /* Get current selection */
+       end = (**((DialogPeek)dlog)->textH).selEnd;
+       
+       /*
+        * Preprocess events, looking for edit events.
+        */
+       editevent = 0;
+       switch (event->what) {
+       case keyDown:
+       case autoKey:
+               if (event->modifiers & cmdKey) {
+                       if (((DialogPeek)dlog)->editField != (KPASS_PASS - 1))
+                               return false;
+                       switch (event->message & charCodeMask) {
+                       case 'v':
+                       case 'V':
+                               editevent = EV_PASTE;
+                               break;
+                       case 'c':
+                       case 'C':
+                               editevent = EV_COPY;
+                               break;
+                       case 'x':
+                       case 'X':
+                               editevent = EV_CUT;
+                               break;
+                       default:
+                               return false;                   /* unknown cmd key */
+                       }
+               }
+               break;
+
+       default:                                                        /* not key */
+               return false;
+       }
+
+       /*
+        * Handle cut, copy, paste events.
+        */
+       if (editevent) {
+               switch (editevent) {
+               case EV_PASTE:
+                       if (!buffer)
+                               break;
+                       if (start != end)
+                               DeleteRange(buffer, start, end);
+                       h = NewHandle(100);
+                       if ((len = GetScrap(h, 'TEXT', &offset)) < 0) {
+                               SysBeep(3);
+                       } else {
+                               cp = (char *)*h;
+                               for (i = 0; i < len; i++)
+                                       InsertChar(buffer, start+i, cp[i]);
+                       }
+                       DisposHandle(h);
+                       buffer[(*buffer) + 1] = '\0';           /* terminate string */
+                       strcpy(scratch, &buffer[1]);
+                       hidestring(scratch);
+                       setctltxt(dlog, KPASS_PASS, scratch);   /* update display */
+                       SelIText(dlog, KPASS_PASS, start+i, start+i);
+                       break;
+                       
+               case EV_COPY:
+                       SysBeep(3);                                             /* can't copy hidden field */
+                       return true;
+               
+               case EV_CUT:
+                       SysBeep(3);
+                       return true;
+               }
+               return true;                                            /* we handled it */
+       }
+       
+       key = event->message & charCodeMask;
+       switch (key) {  
+       case '\n':                                                      /* Return */
+       case '\003':                                            /* Enter */
+               /*
+                * If return, check to see that the password has been filled
+                * in. If not, jump to it unless we're already in the password
+                * field.
+                */
+               switch (((DialogPeek)dlog)->editField + 1) {
+               case KPASS_USER:
+                       if (*valcruft->buffer1 == 0) {
+                               *itemHit = KPASS_JPW;
+                               return true;
+                       } else if (*valcruft->buffer2 == 0) {
+                               *itemHit = KPASS_JNEW;
+                               return true;
+                       } else if (*valcruft->buffer3 == 0) {
+                               *itemHit = KPASS_JNEW2;
+                               return true;
+                       }
+                       break;
+
+               case KPASS_PASS:
+                       if (*valcruft->buffer2 == 0) {
+                               *itemHit = KPASS_JNEW;
+                               return true;
+                       } else if (*valcruft->buffer3 == 0) {
+                               *itemHit = KPASS_JNEW2;
+                               return true;
+                       }
+                       break;
+
+               case KPASS_NEW:
+                       if (*valcruft->buffer1 == 0) {
+                               *itemHit = KPASS_JPW;
+                               return true;
+                       } else if (*valcruft->buffer3 == 0) {
+                               *itemHit = KPASS_JNEW2;
+                               return true;
+                       }
+                       break;
+
+               case KPASS_NEW2:
+                       if (*valcruft->buffer1 == 0) {
+                               *itemHit = KPASS_JPW;
+                               return true;
+                       } else if (*valcruft->buffer2 == 0) {
+                               *itemHit = KPASS_JNEW;
+                               return true;
+                       }
+               }
+               *itemHit = 1;                                   /* OK Button */
+               return true;                                    /* We handled the event */
+       case '\t':                                                      /* Tab */
+       case '\034':                                            /* Left arrow */
+       case '\035':                                            /* Right arrow */
+       case '\036':                                            /* Up arrow */
+       case '\037':                                            /* Down arrow */
+               return false;                                   /* Let ModalDialog handle them */
+       default:                                                        /* Everything else falls through */
+               break;
+       }
+       
+       switch (((DialogPeek)dlog)->editField + 1) {
+       case KPASS_PASS:
+       case KPASS_NEW:
+       case KPASS_NEW2:
+               break;
+
+       default:
+               return false;
+       }
+
+       if (start != end) {                                     /* If there's a selection, delete it */
+               DeleteRange(buffer,start,end);
+               if (key == '\010')
+                       return false;
+       }
+       
+       if (key == '\010') {                                    // Backspace
+               if (start != 0)
+               DeleteRange(buffer,start-1,start);      // Delete the character to the left
+       } else {
+               if (*buffer >= (VCL-1)) {                       /* if buffer full */
+                       SysBeep(10);
+                       return true;                                    /* eat event */
+               }
+               InsertChar(buffer,start,key);           // Insert the real key into the buffer
+               event->message = '¥';                   // Character to use in field
+       }
+       
+       return false;                                                   // Let ModalDialog insert the fake char
+}
+
+
+void DeleteRange (unsigned char *buffer, short start, short end)
+{      
+       register unsigned char  *src,*dest,*last;
+       
+       last = buffer + *buffer;
+       
+       src = buffer + end + 1;
+       dest = buffer + start + 1;
+       
+       while (src <= last)                     // Shift character to the left over the removed characters
+               *(dest++) = *(src++);
+       
+       (*buffer) -= (end-start);       // Adjust the buffer's length
+}
+
+void InsertChar (unsigned char *buffer, short pos, char c)
+{      
+       register short  index, len;
+       
+       len = *buffer;
+       
+       if (len >= (VCL-1))             // if the string is full
+               return;
+       
+       for (index = len; index > pos; index--) // Shift characters to the right to make room
+               buffer[index+1] = buffer[index];
+       
+       buffer[pos+1] = c;              // Fill in the new character
+       
+       (*buffer)++;                    // Add one to the length of the string
+}
+
+
+void hidestring (unsigned char *cp)
+{
+       while (*cp)
+               *cp++ = 0xa5;                   /* bullet */
+}
+
+
+/*
+ * setctltxt
+ * Set a control's text
+ */
+void setctltxt (DialogPtr dialog, int ctl, unsigned char *text)
+{
+       short itemType;
+       Handle itemHandle;
+       Rect itemRect;
+
+       GetDItem(dialog, ctl, &itemType, &itemHandle, &itemRect);
+       c2pstr(text);
+       SetIText(itemHandle, (StringPtr)text);
+       p2cstr(text);
+}
+
+
+/*
+ * readprefs
+ */
+void readprefs ()
+{
+       short rf = -1;
+       Handle h = 0;
+       
+       if ((rf = openprefres(true)) == -1)
+               goto defaults;
+       
+       if ((h = Get1Resource(PREFS_TYPE, PREFS_ID)) == 0)
+               goto defaults;
+
+       HLock(h);
+       bcopy(*h, &prefs, sizeof(prefs));
+       
+       if (prefs.version != PVERS)
+               goto defaults;
+               
+xit:
+       if (h)
+               ReleaseResource(h);
+       if (rf != -1)
+               CloseResFile(rf);
+       return;
+
+defaults:
+       bzero(&prefs, sizeof(prefs));
+       prefs.version = PVERS;
+       goto xit;
+}
+
+
+
+/*
+ * writeprefs
+ */
+void writeprefs ()
+{
+       OSErr s;
+       short rf = -1;
+       Handle h = 0;
+    Rect *rectp;
+       Point pt;
+       GrafPtr savePort;
+       
+       if ((rf = openprefres(true)) == -1) {
+               doalert("Could not open preferences file");
+               return;
+       }
+       
+       if ((h = Get1Resource(PREFS_TYPE, PREFS_ID)) == 0) {
+               if (!(h = NewHandle(sizeof(prefs)))) {
+                       doalert("Could not create prefs handle");
+                       goto xit;
+               }
+               AddResource(h, PREFS_TYPE, PREFS_ID, "\pPrefs");
+               if (s = ResError())
+                       doalert("Error creating Prefs resource: %d", s);
+       } else {
+               SetHandleSize(h, sizeof(prefs));
+               if (s = MemError()) {
+                       doalert("Could not resize prefs handle: %d", s);
+                       goto xit;
+               }
+       }               
+
+       /*
+        * Update window position
+        */
+       GetPort(&savePort);
+       SetPort(maind);
+       rectp = &maind->portRect;
+       pt.h = rectp->left;
+       pt.v = rectp->top;
+       LocalToGlobal(&pt);
+       prefs.wrect.left = pt.h;
+       prefs.wrect.top = pt.v;
+       pt.h = rectp->right;
+       pt.v = rectp->bottom;
+       LocalToGlobal(&pt);
+       prefs.wrect.right = pt.h;
+       prefs.wrect.bottom = pt.v;
+       SetPort(savePort);
+
+       HLock(h);
+       bcopy(&prefs, *h, sizeof(prefs));
+       ChangedResource(h);
+       
+xit:
+       if (rf != -1)
+               CloseResFile(rf);
+}
+
+
+/*
+ * openprefres
+ * Open CNS Config Preferences resource file
+ * return rf or -1 if error
+ */
+int openprefres (int create)
+{
+       int s;
+       int rf;
+       short vref;
+       long dirid = 0, fold;
+       SysEnvRec theWorld;
+       HParamBlockRec pb;
+       /*
+        * Try to find the Preferences folder, else use the system folder.
+        */
+       if (Gestalt('fold', &fold)  || 
+               ((fold & 1) != 1) ||
+               FindFolder(kOnSystemDisk, 'pref', false, &vref, &dirid)) {
+               if (SysEnvirons (1, &theWorld) == 0)
+                       vref = theWorld.sysVRefNum;
+               else
+                       vref = 0;
+       }
+
+       if ((rf = HOpenResFile(vref, dirid, prefsFilename, fsRdWrPerm)) == -1) {
+               s = ResError();
+               if (((s == fnfErr) || (s == eofErr)) && create) {
+                       HCreateResFile(vref, dirid, prefsFilename);                             /* create the file */
+                       if (s = ResError()) {
+                               return -1;
+                       }
+                       /*
+                        * set finder info for new file, ignore errors.
+                        */
+                       bzero(&pb, sizeof(pb));
+                       pb.fileParam.ioNamePtr = prefsFilename;
+                       pb.fileParam.ioVRefNum = vref;
+                       pb.fileParam.ioFDirIndex = 0;
+                       pb.fileParam.ioDirID = dirid;
+                       if (!(rf = PBHGetFInfo(&pb, false))) {
+                               pb.fileParam.ioFlFndrInfo.fdType = PREFS_TYPE;
+                               pb.fileParam.ioFlFndrInfo.fdCreator = KCONFIG_CREATOR;
+                               pb.fileParam.ioNamePtr = prefsFilename;
+                               pb.fileParam.ioVRefNum = vref;
+                               pb.fileParam.ioDirID = dirid;
+                               (void) PBHSetFInfo(&pb, false);
+                       }
+                       /*
+                        * retry open
+                        */
+                       if ((rf = HOpenResFile(vref, dirid, prefsFilename, fsRdWrPerm)) == -1) {
+                               s = ResError();
+                               return -1;
+                       }
+               } else {
+                       return -1;
+               }
+       }
+       return rf;
+}
+
+
+Boolean trapAvailable (int theTrap)
+{
+       int tType, numToolBoxTraps;
+       
+       if (theTrap & 0x800) {
+               tType = ToolTrap;
+               theTrap &= 0x7ff;
+               if (NGetTrapAddress(_InitGraf, ToolTrap) == NGetTrapAddress(0xaa6e, ToolTrap))
+                       numToolBoxTraps = 0x200;
+               else
+                       numToolBoxTraps = 0x400;
+               if (theTrap > numToolBoxTraps)
+                       theTrap = _Unimplemented;
+       } else {
+               tType = OSTrap;
+       }
+       
+       return (NGetTrapAddress(theTrap, tType) != NGetTrapAddress(_Unimplemented, ToolTrap));
+}
+
+
+/*
+ * Junk so Emacs will set local variables to be compatible with Mac/MPW.
+ * Should be at end of file.
+ * 
+ * Local Variables:
+ * tab-width: 4
+ * End:
+ */
+
diff --git a/src/mac/kconfig/kconfig.h b/src/mac/kconfig/kconfig.h
new file mode 100644 (file)
index 0000000..ea66d89
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+typedef void *queuetype;
+
+/*
+ * Resource ids
+ */
+#define ALERT_DOALERT  128
+#define DLOG_ABOUT             129
+#define DLOG_MAIN              130                             /* main dialog box */
+#define DLOG_DEDIT             131                             /* domain edit */
+#define DLOG_SEDIT             132                             /* server edit */
+#define DLOG_KLIST             133                             /* credentials edit */
+#define DLOG_KPASS             134                             /* password change */
+
+/*
+ * Menu resources
+ */
+#define MENU_OFFSET 128                                        /* offset to real menu id */
+enum MENUS {
+       APPL_MENU = 0,                                          /* must be first */
+       FILE_MENU,
+       EDIT_MENU,
+       NUM_MENUS                                                       /* must be last */
+}; 
+#define MENU_SUBMENUS NUM_MENUS                        /* first submenu in list */
+
+enum FILE_MENU {
+       LOGIN_FILE = 1,                                         /* login */
+       LOGOUT_FILE,                                            /* logout */
+       PASSWORD_FILE,                                          /* change password */
+       LIST_FILE,                                                      /* show credentials */
+       S1_FILE,                                                        /* --- */
+       CLOSE_FILE,                                                     /* Close Window */
+       QUIT_FILE                                                       /* Quit */
+};
+
+enum EDIT_MENU {
+       UNDO_EDIT = 1,                                          /* undo */
+       SPACE1_EDIT,                                            /* --- */
+       CUT_EDIT,                                                       /* cut */
+       COPY_EDIT,                                                      /* copy */
+       PASTE_EDIT,                                                     /* paste */
+       CLEAR_EDIT                                                      /* clear */
+};
+
+enum MAIN {                                                            /* main dialog */
+       MAIN_REALM = 1,                                         /* realm static text */
+       MAIN_L1,                                                        /* realm label */
+       MAIN_USER,                                                      /* user static text */
+       MAIN_L2,                                                        /* user label */
+       MAIN_LABEL,                                                     /* title static text */
+       MAIN_LOGIN,                                                     /* login button */
+       MAIN_LOGOUT,                                            /* logout button */
+       MAIN_DMAP,                                                      /* domain map ui */
+       MAIN_SERVERS,                                           /* servers map ui */
+       MAIN_PASSWORD,                                          /* change password button */
+       MAIN_DNEW,                                                      /* domain new */
+       MAIN_DDELETE,                                           /* domain delete */
+       MAIN_DEDIT,                                                     /* domain edit */
+       MAIN_SNEW,                                                      /* server new */
+       MAIN_SDELETE,                                           /* server delete */
+       MAIN_SEDIT                                                      /* server edit */
+};
+
+
+/*
+ * D/S EDIT DITL
+ */
+enum EDIT {
+       EDIT_OK = 1,                                    /* ok button */
+       EDIT_OUT,                                               /* button outline */
+       EDIT_CANCEL,                                    /* cancel button */
+       EDIT_E1,                                                /* edit field 1 */
+       EDIT_L1,
+       EDIT_E2,                                                /* edit field 2 */
+       EDIT_L2,
+       EDIT_ADMIN                                              /* admin checkbox (server only) */
+};
+
+/*
+ * KLIST DITL definition
+ */
+enum KLIST {
+       KLIST_OK = 1,                                   /* ok button */
+       KLIST_TITLE,                                    /* static text title */
+       KLIST_DELETE,                                   /* delete button */
+       KLIST_LIST,                                             /* listing ui */
+       KLIST_OUT                                               /* ok button outline */
+};
+
+/*
+ * About picts
+ */
+#define PICT_ABOUT_C   128
+#define PICT_ABOUT_BW  129
+
+enum ABOUT {                                                   /* about dialog item list */
+       ABOUT_OK = 1,                                           /* ok button */
+       ABOUT_OUT,                                                      /* outline ui */
+       ABOUT_PICT                                                      /* pict */
+};
+
+
+typedef struct domaintype_ {
+       struct domaintype_ *next;
+       Str255 host;
+       Str255 realm;
+} domaintype;
+
+typedef struct servertype_ {
+       struct servertype_ *next;
+       Str255 host;
+       Str255 realm;
+       int admin;
+} servertype;
+
+typedef struct credentials_ {
+       struct credentials_ *next;
+       Str255 name;
+       Str255 instance;
+       Str255 realm;
+       Str255 sname;
+       Str255 sinstance;
+       Str255 srealm;
+} credentialstype;
+
+
+/*
+ * struct for list filter
+ */
+#define NNL 2
+struct listfilter {
+       int nlists;                                                     /* number of lists */
+       int listitem[NNL];                                      /* item number of list */
+       int edititem[NNL];                                      /* item number of edit button */
+       ListHandle list[NNL];                           /* list handle */
+};
+
+
+/*
+ * KPASS DITL definition
+ */
+enum KPASS {
+       KPASS_OK = 1,                                   /* ok button */
+       KPASS_OUT,                                              /* ok button outline */
+       KPASS_CANCEL,                                   /* cancel button */
+       KPASS_TITLE,                                    /* title static text */
+       KPASS_USER,                                             /* username ei */
+       KPASS_L1,
+       KPASS_PASS,                                             /* password ei */
+       KPASS_L3,
+
+       KPASS_NEW,                                              /* new password ei */
+       KPASS_L4,
+       KPASS_NEW2,                                             /* verify password ei */
+       KPASS_L5,
+
+       KPASS_JPW = 30,                                 /* pseudo item to force password field */
+       KPASS_JNEW,                                             /* pseudo item to force new pw field */
+       KPASS_JNEW2
+};
+
+
+/*
+ * struct for password hiding filter
+ */
+#define VCL 255                                                        /* length of buffer */
+struct valcruft {                                              /* for password filter */
+       int flags;
+       unsigned char buffer1[VCL+1+1];
+       unsigned char buffer2[VCL+1+1];
+       unsigned char buffer3[VCL+1+1];
+};
+
+
+enum EV {                                                              /* edit menu */
+       EV_UNDO = 1,
+       EV_BAR,
+       EV_CUT,
+       EV_COPY,
+       EV_PASTE
+};
+
+
+/*
+ * Preferences
+ */
+#define PVERS          1
+#define PREFS_ID       1
+#define PREFS_TYPE 'Pref'
+
+typedef struct prefs_ {
+       unsigned short version;                         /* prefs version */
+       Rect wrect;                                                     /* position rect for main window */
+} preferences;
+
+
+
+/*
+ * Junk so Emacs will set local variables to be compatible with Mac/MPW.
+ * Should be at end of file.
+ * 
+ * Local Variables:
+ * tab-width: 4
+ * End:
+ */
diff --git a/src/mac/kconfig/kconfig.proto.h b/src/mac/kconfig/kconfig.proto.h
new file mode 100644 (file)
index 0000000..898b930
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * kconfig.c
+ */
+extern int main(void);
+extern void mainEvent(void);
+extern int HandleMouseDown(EventRecord *event);
+extern int HandleMenu(long which, short modifiers);
+extern int doupdate(WindowPtr window);
+extern int doactivate(WindowPtr window, int mod);
+extern void dogrow(WindowPtr window, Point p);
+extern int handapple(int accitem);
+extern void about(void);
+extern pascal void pictdrawproc(short depth, short flags, GDHandle device, DialogPtr dialog);
+extern void drawpict(DialogPtr dialog, int id);
+extern pascal void dopict(DialogPtr dialog, short itemNo);
+extern pascal void dooutline(DialogPtr dialog, short itemNo);
+extern void updatedisplay(void);
+extern void setText(DialogPtr dialog, int item, char *text);
+extern void buildmain(void);
+extern void setdcellstring(unsigned char *string, domaintype *dp);
+extern void setscellstring(unsigned char *string, servertype *sp);
+extern void setrcellstring(unsigned char *string, credentialstype *rp);
+extern pascal void drawRealm(DialogPtr dialog, short item);
+extern pascal void dolist(DialogPtr dialog, short itemNo);
+extern void mainhit(EventRecord *event, DialogPtr dlg, int item);
+extern void klist_dialog(void);
+extern pascal Boolean klistFilter(DialogPtr dialog, EventRecord *event, short *itemHit);
+extern Boolean editlist(int dlog, char *e1, char *e2, int *admin);
+extern pascal Boolean okFilter(DialogPtr dialog, EventRecord *event, short *itemHit);
+extern int popRealms(Rect *rect, char *retstring);
+extern Boolean newdp(domaintype *dp, char *e1, char *e2);
+extern Boolean newsp(servertype *sp, char *e1, char *e2, int admin);
+extern void bzero(void *dst, long n);
+extern void bcopy(void *src, void *dst, int n);
+extern Ptr getmem(size_t size);
+extern int getout(int exit);
+extern void doalert(char *format, ...);
+extern int strcasecmp(char *a, char *b);
+extern int fatal(char *string);
+extern char *copystring(char *src);
+extern short isPressed(unsigned short k);
+extern void doLogin(void);
+extern void doLogout(void);
+extern void getRealmMaps(void);
+extern void getServerMaps(void);
+extern void getCredentialsList(void);
+extern void killCredentialsList(void);
+extern void addRealmMap(char *host, char *realm);
+extern void deleteRealmMap(char *host);
+extern void deleteCredentials(credentialstype *rp);
+extern void addServerMap(char *host, char *realm, int admin);
+extern void deleteServerMap(char *host, char *realm);
+extern void kerror(char *text, int error);
+extern int lowcall(int cscode);
+extern int hicall(int cscode);
+extern void qlink(void **flist, void *fentry);
+extern void *qunlink(void **flist, void *fentry);
+extern void fixmenuwidth(MenuHandle themenu, int minwidth);
+extern int doshadow(Rect *rect);
+extern void dotriangle(Rect *rect);
+extern void trimstring(char *cp);
+extern void kpass_dialog(void);
+extern pascal Boolean internalBufferFilter(DialogPtr dlog, EventRecord *event, short *itemHit);
+extern void DeleteRange(unsigned char *buffer, short start, short end);
+extern void InsertChar(unsigned char *buffer, short pos, char c);
+extern void hidestring(unsigned char *cp);
+extern void setctltxt(DialogPtr dialog, int ctl, unsigned char *text);
+extern void readprefs(void);
+extern void writeprefs(void);
+extern int openprefres(int create);
+extern Boolean trapAvailable(int theTrap);
diff --git a/src/mac/kconfig/kconfig.r b/src/mac/kconfig/kconfig.r
new file mode 100644 (file)
index 0000000..1e8e0af
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+#include "Types.r"             /* To get system types */
+#include "SysTypes.r"  /* get more system types */
+#include "kconfig.vers"
+
+include "kconfig.rsrc" not 'ckid';
+include "ldef.rsrc";
+
+type KCONFIG_CREATOR {
+       pstring;
+};
+
+resource KCONFIG_CREATOR (0,purgeable) {
+       "CNS Config"
+};
+
+resource 'vers' (1, purgeable) {
+    VERSION,             /* version */
+    VERSION2,                   /* 2nd part of version */
+    0x60,                /* beta */
+    BETAPART,            /* beta part */
+    verUS,
+    SHORTVERS,
+       LONGVERS
+    };
+
+resource 'vers' (2, purgeable) {
+    VERSION,             /* version */
+    VERSION2,                   /* 2nd part of version */
+    0x60,                /* beta */
+    BETAPART,            /* beta part */
+    verUS,
+    SHORTVERS,
+    "Program"
+    };
+
+
+resource 'SIZE' (-1) {
+       dontSaveScreen,
+       acceptSuspendResumeEvents,
+       enableOptionSwitch,
+       canBackground,
+       doesActivateOnFGSwitch,
+       backgroundAndForeground,
+       dontGetFrontClicks,
+       ignoreAppDiedEvents,
+       not32BitCompatible,
+       notHighLevelEventAware,
+       onlyLocalHLEvents,
+       notStationeryAware,
+       dontUseTextEditServices,
+       reserved,
+       reserved,
+       reserved,
+       524288,
+       524288
+};
+
+resource 'SIZE' (0) {
+       dontSaveScreen,
+       acceptSuspendResumeEvents,
+       enableOptionSwitch,
+       canBackground,
+       doesActivateOnFGSwitch,
+       backgroundAndForeground,
+       dontGetFrontClicks,
+       ignoreAppDiedEvents,
+       not32BitCompatible,
+       notHighLevelEventAware,
+       onlyLocalHLEvents,
+       notStationeryAware,
+       dontUseTextEditServices,
+       reserved,
+       reserved,
+       reserved,
+       524288,
+       524288
+};
+
diff --git a/src/mac/kconfig/kconfig.sit.hqx b/src/mac/kconfig/kconfig.sit.hqx
new file mode 100644 (file)
index 0000000..eea3b70
--- /dev/null
@@ -0,0 +1,519 @@
+(This file must be converted with BinHex 4.0)
+
+:#fYMEfjQD@FZFfPd!&0*9%46593K!3#3!er&!!!"4ZCS8dP8)3!#!!"IaA*-BA8
+#c!#3!aB#93d!$'YMEfjQD@FZFR0bB`#3%hF!N"8a"`#3"2q3"&*68N0%Eh9R)3#
+VATi%V'1L!*!$EUJ!N!B`J3#3")dk!*!)9b%1`2LqXbZDNmfZXiYe91ifcflPbVh
+Y,dIEQPi[IhXhbmaEpm@AdkIFNhYb,hT&"rbmKGZTV#j1pb$fLfGRhd!ArX[cEef
+mcLkp[-iSAh6K"MfffE@F,XE,mqNqmq`kPVGbIjfC"h69GAfII9IliBCmL8!**!0
+)&[+3!"`Nd-K"b8&')%!(r(k66X35N4YI%ZR#2rJAF2lR8l0Q48rh$9fVQR[lHPH
+X#L"Lk99,&l6h$+`k9D`+fAA8Iq4mjTVI#KP2pi0[XMe'`QN4bLKbR98MrGE&SF!
+9PkZr$T(R@!Z'UUkCHFfXDpjacEPHe!3j4mkk0b#$m0iKP4Ve5pD*XXkkUS6Yq3P
+"Vr`p[(@KbJ8Gh5XkefV-bG)R-kcPp3EK&*NXcE*Qk,L&2Ahpjl6hh064e@dL@i'
+cZ)66+Qeb"A!UPRCfV,f*%EmKi@-'+"#5'G)c9%F&)TFZLA5XA0REfGIhZJTcT9d
+@!kZX!KQq8lVPJBUDH5Y[kZU1p(AfhY,CLqT5+mGTr)HY-q4HUk1NMqIhp2Q`M-"
+ldVJqPA+e('me$%fj[,2hqXlHRVl)NSkq[PYlHPG'&UcZk&l9U5J4Z8GQ@YGkbN4
+NMFb8M`b&&RIFC1*R)rl58[aX19%Z4AcpJS(HhXlZrK)PM9i+V1Y,@%Z4NGF$UfC
+ajkf(F0B!jlB5cSebN[`UF%k,m)b"6CcHfpQrB9eRT,mRJQcSZQ($QFL)VdL$iNk
+5AjI6VGZm+R5mc*26j@0$0BYk9R5XM@KQ[9-Mc`61E1Zf)HXp"[G-UBH1(aYU@0c
+C$jCV)J0)YQlSrFlM06iS$mPEV&9$*beBI&@NP$X,Y'`2p(EdGr9SD8&Q0PV6C&'
+SBP(2UUjZV@1)L5&Q@kJ5-6d$rFTR'IMqP[@`Tp1AT0i+q9lJIFUDCNd0eCQ-M+c
+cP!mDC1[cXYVD%`SL+8bGA)Z)3848YRHZlH`h'ASRBZj"61LLP9f'mCF3XA-Fpqm
+3mF*Kh*F38ac(A3#PVV)H($VG&0"c@-UB'*UBikGFZ"i#jTm#FrT9@V&'+ppr3V@
+Q)XHSrUR@VeVR@p[pQZEl[CSf!4QHY"lc[,DFB-feKSC'P-P&hFLA&CdV)pG[L#c
+BX+TlS#pbeF#kG6fprD`90h@XkB``Hdh50NmdfG9(Y-Yk9RG(6SpF0V#fUk2jU%4
+MBUhYl1MVM-`qrmTCc4-[lZQ0p(HZ@"hT-c62MR3L4GC'ZNd0QG(AZ@+JYkYr3pX
++9D0j4Fp0Cdrm+Ed)#+&3VBe%CdA1Qh9qC2E-Fb1ccTXjXaPD6jDc*'4GD@9JDAq
+*XjR'C&NN&m[MeS0LP3,[r+I!pjR!aE*5dYEIM!EqLJQF,"1YCGD,%L`&a['ri,i
+,lP2R8pCUD3Li0H)km#ldrRkNjLY5e2Gr)QjLr&LH-QB9X+V'QmC,IQ%h,"Fr2@,
+4fV&$!V3rq8N*dVlK"JR42[GFU9!80$9%J5G-'hK9Y)&A64Yi%fJ$lcKPJhkEE)!
+hN6BLDQN$Viifm1TT!kp"@BXdNMA`hN)EH*0S)h)bEH!G6aYi*kJk)P1S$["1T!f
+mNfJ$lkfdJ6#90["19KA4*P*&r*YS!bp#'hLRdJEH00T!HTZU,A)DeBE[lE5"GcT
+Yi*e"'hM6D32[6-d+NE1B&I"%D32[E&V!Qd%EH-fdJAH14S[-C$6`CY&'a$YS!`p
+DDRkF4aYijbX,NCmM#q$p2'hJYG"'j'cD`(XREH"GS'a&jT!!,I!ZT!fmZE5"edS
+E#'fdJ6G294'C6e@!Yi!frZfdJAF4EH"G6"Y)PkKkU#p8$hLAdNE-CE5"GcPYi#f
+L$EahUFSLLkNb2&I3"Yi5fX#lNME`PY)'hP@D$@M"Q!h!@diE%6(D`(Xh,H#pKcE
+`IN'M4+jQ&2"qN6E`ISNf)Yp,'hMAd!EHYBU1S3R4JGG"'hMAd`EH#YT!@%NEH*h
++%LP!PX"E44YiUfRMhd8EH$I5"Y)D93-0)p8!hNfdJGG0'l%pY)'hMME`EPE94(U
+T'MapY)(A6aYi!l5"G`YYi0fUkSUXTlV!fd!E%Ep-'hLhd3EH4YV!Zefc!!-ICJ(
+`0Y%'hL"Y4-CT!fmc,H$GU9id-I3#lrfdJIFVY)&h&fdJ$0%'hJF89H5$4!AHKfJ
+$lm1dJIHVY2(I3KY)@j@Gb$Db!pk[d3EH4fJ$lk1dJA%hEH"p6&83q6K9J1FHfX$
+l"'hJDIB#le1dJIIVUKE'5e3,H,p*'a'r44YiRkB0[(YT!qqh99@4qkJUm1kR$E`
+(D#2bGfJ$lhGT!qrh9(f4"kNqm"kL$Eb(D32[-l5"N!#J$EcI9d[NXl5!pcRD`2X
+$fX$l3pV!qcaYr2p)d86qf(4SmKpS!qp2D!2[#l5"pdAD`2T6CFAa"PM"mfAD`2X
+cfX$lFpV!q`TYi'&3U[Na62E!Hi3f)[k50[#q5KYiMp)'hPqT5L+285AJEDF0[-G
+T)r)rdJEHAp-'hYqSQL"*0B(h0GV!fdNEH"LXDRim34YiIkZUBe"#dB(hGGV!Hj)
+fm2kH0[#q34Y)rl"hVqPhRhjDl@pq'BVMr12$CV6cVD%KYEppkkeU2lemZGV2Y,H
+VrHbdD@U20*LKe(G%P0&h!89'ciNSSqq*++2R4C64#b,+#0fc-RT44"PKq+b-[Lq
+LM(j!8Q#d4mNr,5r6"L09$Bcfd3DM*'d`HS8f'1fR$8B(D)243GTJP0UV4p*2kj(
+-Pr9)pQ%pNK[5)rPEp8KKZ4kafr9)FCSHF4VdX2-[(ApQB1c+11B3529MCpJREC9
+!5P*TT"MYab8%5e,IB'cVh@+PT*LUBB6rTBST5e)C#IX4a953!2D6F)5m!!!m63)
+Aijp1ji1j9#UGbl[jB"VaH3PQmJR(F@X5m@`+!F8XBEmT9XCfh+T%2*e+j4dhAd`
+Kbe,2NXIL6dSJR8rNh,!0+Y&m`E(GUBPiP1JTJ'35VZ[%BpNXF*ei0ZjQED2"K!)
+#FpQLkf4J#-+H)Cr,2Sk*A!(qBYT*#8#YI040fb"XTH2`*Y)30Ch+18AAbL)1*5h
+RZ1&#+ZfiEM&HG!2j0-*'9*YlN!!N'GZ9SK0edQkU`JECG*V-!T*11!M-Ti1TG!D
++5pC"'*4j9J4ZX-K"P4Mr$&5Yh`9YXU#6F$)Z4!N8h#+i3"!VR5Lk`@`k(EA6!I)
+KXU*+"SV%Sc((V8K%imJ!"m#1N@IT*jMAd-FUCTe-+*S'(mJ89H@KT1@NEG@Y+Te
+hh9JkQMD8)%ap2)T%Y@1CD!DrU%BUTi'540P3*PT`#i@d+!IbV)JVQ*1fN!!YU9$
+4MG&C6)Ap!T+4fY&bJLpIG%2a6#DE,@B#S%Va6-dTBq`Pl3fJ$B,KBLb@K9f`deB
+d65ba)8DZL(b4G#%9b,Sa'p5RT$-C&JM[dpS&!`bp3JAH&3A3cQ6Y60"SjM)jRBb
+94K'V--#[N!$k,8ab5PjdBN(EYD2jY*!!1,)T$(cN"mTFUMUABIkNdRN@MQ,16Nf
+)*QaqX95fL*!!1)Y#cSDV`LNQl'bZN!#SbM'a8UPFN5ND,qD459Vi$T!!pde'mPT
+)EL-l!F@2a8"L514X!-3*9dcCkH03%GaF+KehAGB[+d2'HC6GN!!0J[QX'bTQ-ba
+TJ[T3RBi@8FUbUDc$1QLRpT2ZlBCZS*K$hE++QD*QVL9jC&dLLrS+!4`Ype*)eC*
+[(QUR8Af,,!kDb3NhRidM8c,&02e53-BJ33V32%kT`5`%PG)SU0A&H"kPNQQTDYp
+QkSU&e%!0eN)J+6H&!5i#UMAYS6Fk%,BP0KS0P%!8-YCQP$+PDcPC*bSfH1HF+)T
+j%98EZ!#'#e8Q'QA&44P'lBG'TP!Uq6kYi`IGbJ*)3LGAG3Ea#55HCC*+UL"3'3b
+!'QAG4[P,Nk38LKQYTJ93SX162HUacP#4G"%jT`JZf#RTILBF%V#BGb[b+Ui[0bZ
+0Qa'SNi8ZfNEB84Ck-$--iiBbXMPMNDFR0&h!b!Lk"6H+!N&-0"-Sr8JGCGe66R0
+8KacPCV153KQY5Z3mX8PE#&f!DU%%3)c1@IbK)TS*XJmA8"BJR0%jQ`&TQi5,$QS
+jDm,"dBBK@-cPLJA8)E38U*rXK&"Cd!R&)"2+APBl'5X4CH[$0XTN%LM$VLKi@D`
+k'cP#M''4S4T)k#V&B)P3R3HmeL`%hRR8Z@!#Z%aibD&Zjf+8)Beq4'Y"J[f$NSD
+q5+#XaCTP(#DPXN'`0L80-5Jq5"e890$1Q3l!Shf,55rN3%lLH6G3b%E4U"46"H3
+iT'1b'D8V%pSkN!#e5Q`9BXCaK,8T-8kfQPdXUMC-ajf!3X8mB&h5,#[a,LT[+km
+0%G4QAKImiJRUD9!['ZV))ALbEdL1h&B-6h*Q"XS31`-RCk2Qq*A6+pZ9a9J11@A
+R8AZYM$D!8-18E5fHYS3bE2FG&4l5X9$B8*bp!I6*qSUAC"L9hXQ%FdiL(LrNXJ@
+[PQR,XY(,FE4E+*KCP#XN3"LC63Md)BejC"aeC`-S-6H2i3*b+1Y#3"C`T($f5-D
+0TjkRIMJ$Y!3b,Zr9Ef@rfD4F&D4RIV'CdL+$CJ59X,C)PEA"N93-I6FD4NM0KM'
++RU9#Xq#RUHH,Mr%!LJ2+)LS9a#FR(50SfYm"$G!GXSb'#)V'-13@6!XHC@T"%#3
+JqMDfkQLE3!Bc$qL2F3X*P3[HDrVlf8mpUiZ*"(jf2-BZ"i`d"p!i56D2"M&(YD0
+SCea-)c+B8V!KQi#j$(T@L1,Q-@$4CLf)p)4TCD'STBeaNB82$+%9a%*%f0&k&@@
+lLM'$*!kk!CY&a8Zmkr$2T0&4C+)B#f'88N!C69ZS$8b8BQS5qY*81SE1P'd3Xb'
+6L6%lR9c-38e@+e6-)fATcH31Z%&Eqb!rV6Sr,QJ"d`"f8#aF8NFhPFe@DC2&V0D
+)A0af%XI&Ffclp8X9daACA$bHbk5L"A63GXE'R`-AY"FC+`FPQ9CqmH`Q6D5&BYM
+!X$)BUP"l6S5FG!'M"Nb28ZJI-+'+9ZS!J&TM1+4C@03H6r-4%@kd!0[*"*("m8,
+"XM&Q#ZQ)`@[&V[N%qcV-$*3!CFA!3b(Kadb,-PNF-@'DNmkPpS*c%Iq#6SN)9Bb
+'N98jcQYBF+Z4AYT"HXh2`Sq$R*0'm`IF)M`5GD0))c6mUDa4%LdAL,k!2dT%&VQ
+,h-aR*f"ZB6V[P&(U[4r$@+1!X3UR!%8c6N+6LL#,Z3Gr(T1!,'5L1fp#LK33)38
+bai#L-JYb+,KS(j!!%-V25i5j(pACSCh+SH2'L%cfQcQQ,4P[M[QY9%M(Ki9--*G
+`E@mHTf-NeSHlNEJLi)hLlX"A`'56RJ`k5Ja43F#-5K"5B8C36UV1Qk'@TP)14JS
+kBlAbb&3RJAQCDmGXl9*9TZ8I!j1d%Z2r&FjG$AB4GTl8k-6J'miJR95KD&`fLD&
+aLBGbR"eaR1-0(Nlq#-)a08ppKNJ8J#-09JN0RacR5$le&HKc3#G!4ScDZ$bJ5CN
+a9AKLA(kAmZe,*Eh`qq5J+U96-l$iY-k*95q'l@2B#A'jAbCk-RV'bcqG8FrmRN`
+B(4MqN94k(JFUD6@$32GL@F$-V[p)C"h8ba6b+"4f2K6c%J3PAkAmZNc-aK1*H!a
+60q@r9fV5"BcM8V'%MT5IP-TS3P'IPiTdh!`Y$3%AFm`iaTd)H8R#a$26FYRbSP4
+`))BbQDT'Rk@6EFke*U53!0*HdRp$kY"aS`9&Nj4)+))JGDSa9XEF0SCQ4HI@hjD
+*Q)pJq15L`K"jYi6cV)*`j5"%YD'848ZPdZq$S"35l!fPIm"+p@kT"RiH"6IMj2+
+%15!"MB$VQa+-BX4ZBaVTfTKMkZ`Ia&#$8`NAdj&F`CZq9f%F#NiaYq$0q9m#6Fb
+F@#1e@ViL9G3*TGI*&!c0UUJ+AR"M'S$*IYeZUF)!%e2cV*2M6((Lq(JA'9b*F02
+QR$Sq((lM+b$6N@ZSmKD'UjLCBH0a(##PE$)&),JSc@p55VLB&'0,j-LAPa#5%Nd
+B@'LCR()B`2$NCkFD$dQ+*X4"@V`DT5PN[H0&C"Dcd55%0MH9k9JqaeUFQBMH*TG
+Q20BQFQKR'FU#K1jI3p&LjGc8*%4%FhNchX#A3`&KriRY!#CeV",B#%0[0a&,%r#
+P-(&aXpQd%q-)0!MX2*VE0-B'f95dQ,%`HmiFMlf(2+#8159'$j6,BYdJLaNq%0&
+`T9!63Y&8,*r9mP2!`"+6"-L)4-b!$-B"jqC3VU,J*G#8mP$,+'H&l1pLq6`R3C,
+*jf--jJ3jQdQKcmGX2S`S4UI4F+8$d%**IPqXmhB,Ud3mkpKQeD)Uib3`F@5&Fdr
+%hSCEB-VBm36QD3a+B*+J`90-F-kaX4Z#XKm$L3+'44"5JS#-jcNH530Z@MERaM%
+N!ajRi%k8SeFAUbCBMNK%-E4fBKL#RCQ28M%03Z+!'rj1+Sj1'%-L`-0GY0&eXRJ
+da$%4,aBc+5`,B2j#ZZK1d9JJKERE%9DfQ'c0`2$4pp'PqBqCM4Y(f5`Q-10"08p
+JTX3LcK8C0h'LjMa@3K,BFR%5D48Mcj&(6$Z*Pc9V*M!VU+J1K5DMmU2936k`HZ8
+`NBScrjcSk3Q-mC%YAM#lI!CRS%)UMHBFA3H5YC!!KATZ%+8FA-)FH!!NjUBDLeJ
+q8&"UBUTA-HUkcBNS,%M))1kBS$251J@AMH+#X5ZSSFaL+B$46RS+GBF2ZBZK'5E
+4)))@(kPNke*'2Ji&Mf0$Ub6"CbEbaII446fM8A#+SqP&`S-A4!%%qKX85mL1+B%
+l'BPM)pZa-@'V()88P,),U6eLAE"E#`0kmUQ1'IG!9#3fP9&jSPM%dDbC!Q!X@5!
+%I-["YTY`dXGK'JkLYLjYf*!!-*5(4bFl3I*adieBer&!`3eCST`@)5F5UKr6"M*
+"0r"9&h-%B&&!j)L*4'3)D'Qj3&F(rZ9BmZ(X5#SK2i4(kA66&DCM#d1$Q%'BjlZ
+`)-'dJ4&0aabEXQFmcNCDF%Z3!&Y-"IGM%H5Y0Zd9khcd`Z3Daj!!Va(6DU32@ae
+80CrZL8BZc'E)PL9a0"M6AD@$94+(kb*BQH#f8T!!P4%9KEYC)*HHE1U&bQ*bA5Q
+KDf$0B6C4+`cec&i6C816M58D(8EPSaNi84mBJL`QY'*55j[5aSe%T"l#JJbk"qi
+CB*DP)S893E1e8FQVR1U"1*LAeD$[b5))e,e+H',#Nd)cNl`p96Kf3D@1lKBQCMb
++EU@"#aID&X@b-C3k9[$S4*1JIXlBX9#'%CJ@ZG@SXLBD`e1cCXBNX6RbJBXjSXA
+'6r*5[V$m[KAJHA3F9!Gl&@Ua!+Q,Y(1BPLLJ54B1!*8"DSNl`43U*@-QijCJ"d$
+hA#JR5SEQLSP[m&fDq38ZlR(B9B-aFi%9`'J#@LG`Nieq"4c9K(ULa[cm5fLJK88
+QSfZ$(2(#Lm)EjC5M%*fS#FP#KKd6U!Bj''K(UacQ((Jk6V3@5Fd5`DB8@HPJaBE
+T,T!!`XXAc*GT-18b9-[N#bDZH5H4+(#*SD30YQ"3GqhS!J`,YB"SE!j&cLmZd)M
+5Q&MPTFbK+DSaX,69d(S@2B8GN8N8N[GF+S11Ai[4-p'UjC@bi3)TQ#"X4c4VFPi
+XDkQAPjJ8@5dB*QQ9d5@5bRb'L-KNV#@3!'0"X`3j6ZfCp*LFQNJ1QEQ0k%4V(-$
+Bd"96,,-eaeU6*mY`+TGJ-aHGa-l9868pfIcX`BiL3R2jc'8PIE$AJb6LG*CYL1D
+(KQ$+E0)2K$0D0VeBNpY-RM`ke65l9LLTB*!!MQd")Cc-@hbAT`'E2+61,1Dh&K@
+P`S9&TJi)JV&f8bC@T6%jLT)caj[C)(@i$&)E3dDi$Z5#S&TC6Q"Y"CN%*G*q1jI
+3h,5MMI!c34d`"@i15QVL6%#Mb(a0Cl"(N!"#kZ8Ll1%!8Dk4ARCVLH%ibNNdBLQ
+61Z9T1#C9LY%C@U2""f8*VRa-5`A*!L,29#hP)HPJkS59825J0CSUUL(5mFSLFih
+p'TH0M-XA!R-&,(PTeBl4LEdReYCmcNpLV'LJSpBq!CQN09'l'fB2TPlFFF(19Lb
+1YBiJ0FBJ!C!!A-"0S+p!Ij22&H-*"mQ4b@S`CLaHF"fk+3a`%kbe6L(ZS,8*B#l
+KT-)BcKF6@(SUTJ,TJP1*4%*#!6CXF`k$i5H)*&"!3552m3kh%H'V`)$"cR-0a8(
+PDQ#qJLCPTl)*e(Hh"Td"PiiFD-4LDC%+0TDL%pM6&@-Te$K-#+S5@DfF4DH1qF,
+XJ)mZ0(,9#51#FUi&%MZ1!Y,*L@%KKAXVk&iDY"XY&"bN$Z1,@EBd+-eQka$ElRY
+hkjU)SqXN!65&l&6Bh&8!!R1eI$33bfN3pc@1bh#e$8Q%5&4Y,("JJKM&[PXDSdb
+*"Q-k33MVSLk-E26i(1E443V("5+NQ1lmBQd4$'X`Xd0RUa%aYU`a!@)P`E@+F0@
+LS+eH0*XlMKf4PS`X"P,JhQ4`5#B$fDKSP#diK'%BP)KDf*f+BT05eeLiq)!Yrpr
+CV6XU"h9e"*JBD@*E"$YRf5Lf)6$MV#B4r(5FJPQAKR--+lUP`ZA$*"GC-1E-SDa
+K)bD,fTA8*4BEFc+XL+"q8$p#F5d`UmXYT[["(0*dLjQAdFU$pJ%&4"+T'QBj"c,
+GJrZ(G#FHDblmBedQpC,ZDUF18J[Za1Yi'!-lhC%@b$FKMrD*1bmSblU*khqF3QT
+'Nq9"TC-ebQ)I36X,@r0-(DK"c!$p-LUU,ZimUl-%qG4ZE,BN[D8Cm&FHe,k3!+l
+8Q4fQikPUPFBEAqY@lhjXpf2a2ChDTeQ%dSSZefE,Y"m5lY(-JpaQd`C,iU5%JK9
+!95j'GC%q%5Y'AqBNL"Q!)DjQ,SPMPQM'3l,JHIR$9+@CLf0Gj$P`bL0l+X`Jr49
+Nm$GecSGIAQAP1)9Pl89UNdTrL`,riJZkY2-#1GRb!jUk&Rc36+606Je$i5&$,L6
+C)-F0SZmTEpZXNH"A3,a1c5(5Af$5,2ri2@NF'pYlCYEIYU'P0b#BZ"I)a-1Up`&
+,bbdBFQ,hUE6qAT!!ihf`9lF0Z0(LllCi+ca&EjF)dd0-*!V)Kq,VQ`Uf6(jpXB%
+bPCGP"*00ZHmIBHImkaX1!C5#dKbZH!,L,JdSAqe&iSG,05!,XkpJ%Y,aGT%-4pU
+[H+XiM10U5K,k#5S1fK0QCC,Sd-cX,AQm6BCadLrRI%"j2+FNmb`'$-HH3HT,5'[
+dHF$#Q&Q*53UAVC`4aa8NN!$-qclRdHH@b@Lbr4lZfB[,dbDa2X2+`%b3!06pZ+f
+0UdEdrqka(+lL`2S8VX484Elhlcb3!)(K$p6'Dhql&RY$Z,-5rpS22"9rkVkRV%X
+QjmAUb-[kfYQ6Cdmq0X22RAclX4U)qlrVMRe!N!$jGqb0Df"mqqUAX212@ha`pB#
+id"&ECq*LMG!YiZpJ,TVPPTRH!SI5LbL$4%6kZ"aQ#hI9'%&XY'U)%(F%Pj'KXL[
++8akh$0$S4kY$3R5KaQ2Rc6+B2N2FDZ35Qd`2M$0$,r004ZB%NcK9L2IpKFJ'%3(
+Paedjm%0EMa"51%bC6!mDbJT6"!c9+H+f2[)J-2pNaMqC@U6([`QPEF,ckX-1M@V
+T3C%'JmM-+%@!!!,*[mc+Tk-bi)SN&Ce5D-LSU3+VF!BmV(l2cG`i,(%4dCl%[!h
+,Bf'bVAJ)hIc(HCC&mYQ8dIdijTA4`b4ILH3iec*D@I`5!2q'!M85&hG$lIQR"&#
+cc'LF`f[kMeH9`jTi-'AYMp!NTUN(EdT[rU"TLJkP-#@*eH!`16)D3iAD)rqQYSd
+p#!Gr8kp,-L2(%25DaQMHNAj%0-4BQGl8eak2Ckdb5TRr)B(pD[HU`XrmQm,N4pc
+$#LZ1+HP[#'`iqH+mQF!N"fTq'#('B(,SDii8Xm2k&Nb(mjUfre9LY2hM+IAIka8
+44J[TQ#$(#UM9e-A'aD6HGDH[&ZZ5q0[C1V,&B52Q9d#MQ2%C6E"GSGM1k*r+Pp3
+fe50AkZE+C!PQj2'V#lXP,&4lIJTlZ1NL#81'c+Q'hf*STT2m@'qR3Tld,Bm,qdr
+F[!GqZ-21r5Elip-CkkF("Q&UieBq82bXje@FaUq$fhlm(jAIKrA8X6&krj1hD,Z
+!h+(!6!$XYEZi5Y$9klIH[UA8-)p#[)$8`YbX$,0k(+CF,db$brTJDS6ADire&'a
+Br2#a2S+p"Zeb'G%E'1)q8fSafY@1eEp58D[aUjIqX)Nj+XeKU#29F,`)Pk*8JKk
+Q$+YfKGC4EdT59U@%0p'VY*jaL,HRI8PKdl#m3AMG&N8LJNIj8*(d8qG0fNIEZB,
+A$KjKI0-@%c$@4C9lJd-L9CMX1P5j#CJ[0@4qHm'N'Xm3Mqi'*VAIGacKqhUDqQK
+Q9['[bDb6$m)Up8j66dT6!`0R1JHr%*@9B-CS&q'(Pc8h68HjIY'[8%Vcf"fM`@-
+(f%L[kUA95rdl-aY`XhIT)Zj2i2VqShGUHREJErrIVq%!CRVIF3I$b3LkNcZQ[U`
+4VB0cCFiTeb(LZEN[5b-LQ[$fJhAK%B`4V0eIm8-L-Q)a*&J1DE1'aB4i9*TN-+J
+K9R"NMiQ`*$`XehN4aaq3!2UQJ)3(*G)dk-bTXjfJ1j`dB5'T`fAakdIQ1X'41qU
+D%$EjJ03e6G'`C,+e06Jbpj5kI5DUK9(@b2Uj69k88YJi&M@hEY"MjM!X1,,aF&M
+Vkf&Z8qhJ'fKe`k0KTc"-KDJEJEcP-%qHF()dUZi8,bUB4A+Fkd8&XrYNdJ'TEE*
+XDd3k20%UpjSJFA"jrL1q[RX0[Qb5MH("C&+$@KdMHZ[JTX%QPhR6&%c1EA8p[Gc
+Rh1&`9TS'hGCGY[XA$+YkAJ*06$Fk`VkM*HJjVV0+$JrXZL!FiHHa-eZj6qdkD2C
+rkmrEd5)el4T'rYY5%F6PZ0CHp%$Vd#Q%-,-iT3@1PTbLK2(%J#"4DZI!-GG$U3&
++VBGb1P(`P!T&Q9U$PBml8-'U#&1,d0S@N!!#c'Q%`HAe#M1&-$24!Ne"I`-8rGG
+Nj@d%`AX@#"*U!DN`#,F!!k9$-DCQCBBMCi3MiDepAjacfpDl4PTNifeERfPb$Ra
+liae*A2Pa3[L,QGVeFqDfVYpi'eJS@V*QqjHrIF1&hpiCDC%A,YaHHr1@QrGYDEP
+jaff$*`4hE0M5XRIle*BA,Kcfd0C2hIh@,EYEXRXM,GEff8$EHI2fR5ep@rS'hhE
+RPTYhYZcF2AAfpYNqfTbTZi0!DpNh@%*lC"4YpL'd8jU!jVDdl"ifD,0fhM`m9p%
+fIC9S`deMD(96`m%Y)bdYhaQCSQK0Y6F2le@dH3EYeM+D'hklKrELb05*4*YCkbY
+Kd%C'P3$DPPA"hqKVQI,i51f8ai#fD8[ZNCeIZ[R$IB1222FEI9YDpZpqEmYM[K*
+0ZhC[hEaqcXDkVF-STVI[HhE6pK8MlP6FerI)F`HbQjSfcYQdCH2'fdGXQBMl!eU
+(X933(&ah3,eYKlb$[VF'Ha1Y'-#(Kl1i%1JB!#h9f!q2GIJ'Ckr($+"c&JT2dT(
+DqN"!)XPAXN'-"1C,'fV9I&611l0&UE$`I!ICR*ITZ,RAUN)R(UL@MZUUHVbQ3ZD
+Mi1&T(`&Tmi%'mc,$P6-XHHl4brpJrhBjYESU)[-kKZHrjp&,6QMChQ"YPlE[[Zd
+ZH@j`H[[0MjeG)*TV[EhaY%80EjP'Y1YNhNFLmeHf,ra%qrb'`$5CehMD`RL$6'm
+If[b1-YV#KNC&J`U0NIRYl3ZhY4QdKJ@2ilUNp[E"cG-1Sd9`Vjc-Hm[)r2Ej@lH
+e',6Nqbka'S#fVS3@pY'FUT2!6B!f9"mbD&Cl'j4`fUXmY$1XDKqY[X&6BPl9YR(
+G0LmD)YVCMP3PRr[UirAl6af-1#-R$FjV'*l62LpFhc*[Ur@A6)RYNKcHI0kkk`(
+@L)9%T*68Sd-Ba!$3fQ0#3Qe@24S,h*`V$AYN)RCTJS-bJJPUlCjr,`*SY%00+!"
+)BJQ"B08qHFX"UDlI6"(35(NaE2RU0dpVqFjA2e69[RKUqlU4PJheTK1XMjr@2[q
+d44ppS(eDq`IUmI-D@Q[CR2QKKAFME2S'+B90XTDechZ8BA2VKdBfqQ'0-Y6HGYV
+#MclD(TNq90rQKc8JE2jT#iG#MaTZ-ch+fiEQc2VUd&h""92EehqhCId6@(JmaN#
+P2IVMMH5$Qc#*`V$!m[pEmGq'LF$RfX4kD26rZ6EEfKB2@2F%,1[Zd($mlR"NhYd
+ER![[VKSqqHk3!*amchIPj'fR$TjmcmLQhlaR4'lI&N(-L&Mm`fGp'[BB6rl*(4V
+8B(4bYI`*RJJbU$HmRlEdh@Y@`,BZARV4aIT5#qJKm8XA,(jEf3Xl2'r*NNAQ3[A
+`NYl1'c4BcYCRYZM"8P$"QP3rlhSm6'6dG4`-Y@Ei),h+aFGl0R4aepT1mm!4[2Y
+%r'H0A)'G51r&)U@(R5`4UEpUGFqYN3@pR5[a0*5ZMV9pH*@'akeQ`GSH2+EMh9h
+G+hYZPAHM&&djJ&H(A1Qr&%1IYq'aG[9&)U(PJ%)QH!5##m$l2F"Gd,0Z!eiU)K9
+JMTH-a1"CJ*Gki+dXhU-d[#GPq'ImURNP5)"dkF"C8C!$$U!Ihk[a0Jlp)m#RZ`U
+(%FD["a'ZkmHI5i!Uar(m`$mA)AimqH&+BrLT4iQrTjL*pd0'ichrQ)$'2DVhi4c
+`9%pja`[!A3Lm`3KqA$@R@8'409i46"*iN!#Mm349IdV$iB,RariMH'8qp+X)C6`
+!8-a$mD0m'$q+j`RSkh-S"9!AmF32RU3qF3!&+qRDI*,#,VHKbGK0RYh3Y(2[RKf
+lNUrB)j(Q2E#"'UKce4mjKrE1lkVIhE&clclBa!8aq)P[r,$0Nd4fqEa,'X"69i-
+$AHTfZF2$GP,UAQQ`m634f+mNKiGhUEr1VN-maTCem0Fee56VM(pAd[KVDY32Q[3
+hf%RAmbYH!jB2k(F0Rh)LY'eb"Ud[@SpD6eTrpCf(6rcFpSI$$pf9Z2@"ZS6eJ29
+ReLCR%aBaIh`fX5GTfc650[1ATPmrjmE3p5ZAhBe[jE*3l1$52iipZI6J0D&0pUD
+46FP0@GJrqPL6M[h3@r(r8k@2EA"-EfIKf5FfjLL9q&IJ(aUX6iED'UT#NFD$i@6
+MhHL5p9pEhhL`SEkKURPE`cVmfrL([kd@Il6-r0r4ZUdK-'YE`aeRiAmDI,6TCac
+L(I63D-M'rRKb5T,mQb!&I2aMlZX1icpLBSq&m1FdbDY0r[(VXhrUNZET+[lCGG4
+[#Qh*[kZK35ZlldIpeSTFmYZlrY@[q&r6"mQ8q6dE#!4)%riQ"(iYL6IFm"8Yp0-
+-Z!E!mqpcGaJ!pHpbpe2frAMHM"HIM*!!!0U,%VkH1[9M04N!TAJmQ-,HX@[rSAJ
+`42)BI2A[a2XX%1,MkGQjVaa[![BHmR[kMLB3r'!aj[rRI2bCrdLqX`D-&J%[kpN
+JmG5CFP!hl*eGjJP8jIJG#S"iP#l'le#!ZTSkL+Ma#P!hc#aQ[+&B9r0+8RXSED-
+d(Rk2iPLmDr[aLSp@bSXhr**Z%QdDij&&`)BIlCR'+lZaH-1YK'rBPrLCq$*rAae
+I(fCT%L+l2MpQ+AT)YSRPq#51MiqX4G-SIMc`MXBI`6r#Ej3r3dIe+4m6Aclr%Rq
+N2mH1a-pDTL0cQb-(#18KcQ[RAq*(F(i52i+K4m@2!"!r8N(mdGR-dAK32-C"I*N
+rGUX2cB81kBG("CLd146[kip`MUHUUNS!AVc[&Ek$CJaJ2"i[XX!$*M3H-kl$m4K
+jZ9AFc#`2bD$61$kSFFI4i#[!%Ii!+)@2aI13!$!H)9-+(ihASi+BKaMa[)'IaRf
+fhY%RiE`DMjZrc2(bl!LrmP')er$(%!TMm@p8Q&&q2ilhc[qTImFfL(qc[QX2m%B
+AF+M1qj2,dMN%m&Um'@Rq*(i-312,`d362`V!1!ir5q0,M5m$)-c-IdX!Ke3dmE$
+,"%T6brm9l`pZIm6I6%I(imIddl48d2(id@(U$q2,X[`XrNIm4l8pUYqKq+2krlG
+i2HANHderIlkY0HI(q'BTr#IaZ[$mBhj[iVr*rlrSpd2p5kJrM(rp(%-KrLF0!%i
+3lbM!S0bm"5k#ccrPei1&-$MeRV`hHNb%McMZ2IE$T2HB%&Y%20JQp$,0XZA!l4A
+Rm(9P+cmBq,"JLjJI"Y"B$`*U44Yf`E!0aXR0N@(0ka0D[j-fTr@S[paXUlqeSH(
+!Q*qcYA(rJGCrp5[qHGUVPrPGJINSDF,IK-$cG%,Vq@RUK"B!R[pDpe`$S2l@mS6
+@Lbp0D%[ihS4@qEN(!&#+aqcX`,QYhS6@M`G$RG#@r1IM48`)mI(dR(pY1Gi%,$r
+Npr3G65$i`@,-rmrjq$2rd3QYpGH,Bqic#hIA6@PTPTUjc9+lX0Ze(qb2`*SjAGS
+A$XpSF`r#FjPkXZZ#VI,JAHZUBAd`dLe9phDGh1CqAceRdSSXQE(3I5'b@TCSj!r
+!`hJ4E6`cPVKlm2LjNpD)e9M6*X&ZX5Bmd6Ec!UPFM%9*E$69BTpGVX1pNqFdbk3
+(llqX[3H[Y3+h59!KX(#B20ia(6SpmRH$ll5@AF6)1I93lCN(2i6B2CFQemR#l3X
+IMB5IH0mPb5UCXFK0cVm%I)E@B@F4M+YAKEk`irUcCPBmF8QVc'afRhRLBUMjd8M
+0YXqkb9@0jc5lB0!UdfSqdZhZEl8HI2mAGUaB!ZbTa,kK$9c18bCiE3AHm@FmXkm
+rIZ(fCqk+K*rIqXaJrD6HQGZXAQQ8CqCjZ"FSjmHTa4GfV"6hPXZDCFUUqSAVUe[
+@iC@-$ekV@Mr3fZbQ(l`,9TlCCI+P[YRp`Edh-VIJqIkp0blD1bAT2VEiQXLe9q"
+DJ-92I'hHTBYCRV4L(cGKI0r[3L35(SP91DYjj[@cCTeMc,-M$d9QcCjpEQ4jml,
+Qb,b"[[kZlV-M[FfhG[6hpA5h$I4hVZrSDqjF13!#NmF*B0f`Ce9["pm$1!%EHRc
+SRARXh5&[,GEqPXL,eN2*fZA,Cr,'LQRH`r-'m&Dp$mL6TEFY6X$fm4TVf9$J'Pj
+Qm45ZcZ5j(qm'r)+eSS4b[r`FRL'fFIc0LpAJHUC-(`jJ$Xlc9Vbem8*VrG"C5ma
+MrV#AL$F+EZJCk-9$%mhV$bpYRpM4[E,dmN,cCX4lmIV(,eNhQ0e*UdlZYTUXGhR
+[9E`#9H!kqH63F@8'"P4Z3Z3GH&9AYEm8@BUl4fkAVjI`lj&VV4AUR5)AbF9@&@l
+"`#8HjP#jGFJ1D`mfJrfQeMc%Ef`daX6fQfArrJmLI@,342f`P5ipa-rkf!1i8&!
+lCl,%C3PqUqJpm%XIiXIfIE6amcQT(IM1Dlr+2AS$dJ5mDX1eFAXJpZTjAmcq!0k
+A%m"Qqa3E9mD!'RqiiMlJ1[Jcm#3E6rRc!S(+)$m8Q'1K&YiaBmJF2aDS9q)SimD
+aX,cU8@P,eXA0%p6)VF)p-XpEZ&STM*4l(L*Ar3"m,8$pa1%,Lf5"-,ajCp49$Ji
+"c)+V%8V)2MF%QTDPpbMbkSQpN!!0H'aQ',&AElUKKcrV,UPikl,9RISFbBJqZl'
+V,p,GdaqjT@0YemVQ[MGL"lUlEKlSa%-@Ik&R!1pHh""ChA&,Cq5QRPimQK),ZT'
+HlXj)ad$rkTlHVPr@TdY'eREHdVN@J&j&['&JlGS0NCX(`2''$DBbPNJfAlHNXrH
+QVViqiUlZ`2XC1cZl)eMZlH,,'l&&h!p*HN%$iG"MS(Y0GmqYh@9ZH1TSImF+!q-
+pP"'2Jm6c0V[kq['3!-UHhZEh8Y3Z&199I$aMT1H'FD`5CEbQF9e[$j6SA2Nrf*e
+r98p[liDcMDTqJDG5AGdV%0QjSVr-TVph3k4M&9ipb3FiV[6Q56ZXjELcCZYSBl*
+96V*1(TT8IKEQk,+c3C`)a%['(eSj(EKrEYh[,@*lR05l*EaJGGH+MP9SCIrh3C2
+TcEq-BKAMdHEaPqDB4jUDBpU&Scif*00PZMA*HY*r%b61qrdZBrbKUr&IHprTfa!
+b0GJSNpS[AEB)MFA$lBZZZ%3UVH1AA,TJ'HlqZI(5"9FX"[+@HBZ@,N1,mkRjLpZ
+j%[jjXmYZIH9G&beH$Ta[G+hSDi%r$rXmX3+0X,(G(MM,E,N(jRHY@-ZiUf%$*p#
+lSQX&(Z%Cq1#LG[#3!-$(cBjmi$km3,-2mCqpkY+V,i,pf&A,PVi0FFqd,lS%[@M
+Jqq9YH*`l06p`23c1qp!U#PqRKr-V[%2*ZNCpQl'0,i&ekS[,K8LdGfL6KRG%SNa
+SIjI%q!3qM")d9ck%'pcdpAM!jTUkZDIT6MCJ&@XmVZq&6jpR#DjBA+ri6BrI,m1
+(&rCT%iLXkc6D["q29*8Zh+1(-dLZ&@BR$Qm%%*R(IYc6S"-DqaLAi39m[Zpbl1Z
+A0*Xq'RIYU1qZ-UI,G5EVaARDU-pSX*Qq4G$@B%4N%3DF"L-LlrTS13i[Hb[&AF(
+mmZ+Zq24S(&kkjmFY1D-FGf@d(,IdR(,F-[-Z3Bf,rA`jlZS,bTTGdfTmJPki3er
+ZarBf)LY`6c8,QISqEkULq[5eHkEKAHP992@G9-kE9DD"IMppAFUeBYlDcYlqFLZ
+`8Kp0'ZR%h3AP)2119`d+AkiYb-V3Z`"6SGF`U1Yr-KJ&0hFce*I3qVY@V1RXlhX
+ei2m$$3d*Df0[EQCTCbkeCA*c!*!6(!`!N"%@!*!)rj!%68e38Ne03d-"!+`mF81
+XG+fS!!!)p`!"+@J!!!*j!!!Ve3NTU#`!N!B@C50%$L)Ur4&4#5Sc[J00hITKF$j
+mQVkBTLENT1p2RH5NcXj`GfGR)!!2qfhq&8l(Hf6CTJ!jCU@)bRjY%6!!jADLBP4
+Q20hhkSFQAJf+b3'(96T2d$Jk-E1@kq#m&)Pf6dGrT'Kk,PF`a-f`-,@&$E!`DTb
+E+6$Q#PZ&BPYY`a4V+qMcj,5dRk1L!l4KJkc+TL`TmQEqliIJpqr'$BBTkHEr3eV
+5Vq&k@PBPmlrDalF6LIlT*H1PKX2@Z)Z90"'Yhrrr#ZkI(b1F5pK%afk(dhRZ8Ei
+[&IfG+QZa-V%V0#@GQLV&Y$q1'%qe91liSR0iT(H()(V#&bkQaE&-E$N((S@#mMf
+mqfqdfKJUYZ8CGkF8@khh,PVFpiHBCCID[%raqC-V$dXZ*BXkFMP!XE2+S3U)FHR
+5TE)D8l*a[V42lefie$0'm!&@,[FZMHP$'90EUKP,aapMc)N[I)m5r`kPQ"Y,*ak
+Mc0"MmqFY(AH-*-[5(!S0eGHiG-)4bSbB&%[aT5FFiC6SZUC[-+9H"5EP[#Lc91I
+mQ2j0I!K#L5*b"kHkGfRP%B)cC)TADBBmH-a(YCd$qTKVbXV5M+iPC)9ESd-**HE
+5LS*JB6bp9!bFDQ4+@C`$a"14daQ&-crRQAm$B50kU(LHB#C!+eDbr6dTcJ4Y)"4
+K!H[q$9mJcf+"rkZPh(9pXF,4pIXEqeqHmj3L0-XjcRP5d6`"*AdBTpb6!U'((IC
+3(8Fq1f2ri2Kc32'8F'1c!Q0R@jM+`Y!lL&1Xh-*i#eYQB8S,Zmr#e!,MlB0@Bf%
+'#pXM-1Aa&UD`X!'MFm(FBGPVXM*S&TJKV'XEHFaNb0JUDqVl!!liBjf[IGrE1#R
+r[&LA&XY"ChCfANjbkd"qRThml&HfjU#6Vj-irZUlcYiZFpLCR4IV&drha%j22XP
+IH+qG@I'cceriSQq,&Lqf"plL`)pYEcN(D9)JJ%&(!5Tm,&0(RCFIpaDf)BHF`JR
+K#cPi%Ni!#!5J"e"B!%"0c"f*""9&8I&rEd8GpUDL(V`l[PAMrrEiGkQbZc)#hiB
+jJ[ikcDAj[IVKbr!pHdBSrC4K1e9VARFNe1J2HMe9*hKG(Urf90Y6r4jiNCmB$fm
+IS%HD0,GhqB4VFqrVar3S(qI@&MG')q-LqU-PASA"#hR'[-mEr4l2ipAIilNeGiN
+hN!$cfTjmT9I[mR%"V@l-1*FH2VbA9mPiEVI,hH!YmRDdH10m#21fc[MQ[*eL2$h
+Um8G+2+qQ464Re&8Ap1TG2+kh6r0krj[H!HpL2'kEhSaAe0["H9VGZr&DaRJ4I8Y
+m9c"HBd6h,rUVhYV@q"idVLRU$ijVe#*%ka`2qEjb#SR8UVNd8S[['c!Zi2+%aLd
+[jM2bIeMlplED6Y#ZUe$'I*[b&29Uj4[RI8FT0hklrrl+UK&,P99(28drlrE`"[T
+lCFShm4@8YMEmpJj&E@YliSRVVmFEfbKR1r,9je1f*lG4Sj6qq#dj!hLm$ebaJYl
+,DQVShE'#(Q8)IrDUScE`pbjPle8FEI`SUikm'Yp[fTqI2l%([1lcq5,iliZ3!&m
+V0af%6fmSfbRU"1Kkl&@1Q5lhl$Q(S4EVM)'9$dF288NYaf1&8LF0R6KVc[5UBD2
+p"eG01Zb)X5FH0U1$[r,K'B-&G6Y+rG,3QDjS!dJ!8[EEe1BTJVSpS4khrD!jdfI
+Ae,lc5Njpj+S$",8rrT5DZ`GTBBr6(3Rl)NhK`cE93b[AA4m8e!(i8fTZkBpDlKf
+DF9UVRPdYU!-CY3*89NYeXPY$mhmVU'@-kJ#e2YMN6EiAe!f#kX"VPCUES0$SR%,
+I&G4b4S9#Sh-+r9T3+aJ9#Sh1+@44+k'X8R0ZKE[1lA3(p+C3kUd[#ZSJ4Lehkdj
+[1+SY6Mc@TJjQe%UI2qcA'j`SSMCc3If&S!jTTcU4(c,8R`[U$S`kd1H%XZRB!h@
+pS1l)U!j3dl&!U6m9e*h-YhVGG9e[YDK$H3cjR)eSU%3c-I3c3GfC8FY!c3VEfVM
+L*N(GaG494phRbHKUaG#ZTN+XmNjJNC92&G6GH%C"N!"(R9SbA!PeJD$ZcURJC69
+#TVa,82IJZ5(XE8&Zb'D8P`4e6dj&9H[fkVScd%[GLe-e9pJ6#DAH#Pe2&p5p19@
+2D[j`rFL-3Lm,kMimmPUmVN$UTI5YC`MU4e"[+$9kIr55ZUU0d2`I#qUqT2+YL95
+b8S08AdQ&rP&3UaM9J6kA-r0H8(mNU2X*DUCUXkRlFkVQDR'#R+'q)+J(S#*5jXe
+hN!$H9ee6TkL%UYH1&052-ZSJ3X9Mh4(2jNUUYHUj)`Ae3)[U$DHSCaeYjEb$',@
+F8ZZpd@3&82AF8B,k-8BG3UQ"P%DYSGS*JMUXJjV8#05*JRS`SeC3DXJ95&59+pI
+G8#'SKm5SIMf4(@cUahN-N3C90[*#YC-%p9#,QSQm$ZT`e,h+2+h-lDjckDP5Q5J
+d@9!2Bp3+Yp[MpEQDJSQ!"GAUL(b#8FXT0G+BVU*Le"'8ZVM#jdCG(S`N43,e4%%
+pR&%V#6Ac@P"R#1V)'"@95U*'fII2[a,88BaD6UMScbCe4IBk39"(@e6GHeBk'Lb
+&aJL&kVeKP(X*KGlF49#2L&'MB9GR3BqhcK68)dANe6HLDNY&RN8G+h3PP@mk'UB
+,kP(LV5(AiVT%P,F11kY58-H*YiDlBQL@S"l0U!j#6DHK128Bm9B0ma[TYmi@e2&
+#9mfV"jZ6AD9D+cFF'k0'Y54e`HSl"28i%H@k,qLU6q8m5k%*3PFpi'p-keSYU"-
+YDPIN@G6MKDjk0++PFlP&R55S,@J3TDNR#HTN5Vfq3ZqT'qB,kK4'V568lVV"SNk
+0890e!kLeJMU08FX*YEYZU"(8%baU1[*Dh6GE[DMT3U&-h3#&6K(86mDSfEV"STi
+S)UqlEV#S-i5ZhAA$2%'G+GkDV4Y#YCm8e&RLVGeeJa9$XaR93DMGGB0&V4C[lDi
+E,1T*3YIZZX(5pH3B09-h225JS-i48GjG0eJpQlP#eqkk`D,@@05Zb$Y081F*AE[
+V"SXkAe#lk`DV6eQ,RViblhX16113!+bFlV%&AB*k#U1b$PBD#kT68%rP90SKpNB
+c(4'2S#lJe)#(G(UbEedSU+FC90SIfNSphD!fMmQ'Jad0Cf$#3CRh1(Vc,SmR&8*
+%ec-&eFQS&Bb+IR3UALhU3NC&Epl9L+5Ab8-@eG9"cH3KLeV(U*@JiU@NbjE-P!&
+"GEG6Qk)0(PI89D*kfU-"9!bAT+,"SRTMEh@k%eLEkM1M`Gf3!"RhX+ReCT5lYI3
+S"D&DXdS0M%SQ5d$09P%@e@rU5UKCA5hUQ4h86,aDe)!CH3!k!jjdecBNU-%B04T
+)akY&$CR43#Fl-p&J8F0Q[%)GTjE*H4BedN(0j,b`S$DD-B6aLlTJa"e)aT!!46h
+,T!CG1UCI%KR@TQUQ3SfZ9*lF50A0'#,0KY3%"UJ43BfDf3[84+(m0VA*e*93XaR
+&SMDh8eXmcQ`&B&&Ec)a#U+PL'G4'39eNkUUlI&dGIBZkf+4'hFR8p6EeE$2b#$@
+EbbhU1@Bd41ZMkGS"e,-%G8Nl04#Pe8f*HLkC2ChhfX"!&$9PHKB)9'Y+l$a',3Y
+%ZkBLd(fa1X6R-fT&)0Se&@&6Pc*UC5$Udc)cK&"SZD"H`+MPJDMQ$8@DNaVCe![
+j@dNI#JP&DrBR*TaUV3laTbMeG3F8)T9jZL05Hl+JAX5SL!C8Aehped@#qQP'*G'
+3!1frfQqp@&#pB8pbJXKqkb9#SAS5HUPiR51SPiUheM[4%Zd8&QpG,+LA-5VLeHF
+-HaHPZTXGEleF4&kQi`MUA%'p3LL8b3kJ@RhP+f082C*S1GV8Ud3-kATUG!Y8Uf[
+l'4%0C+`q(3e@PrfcJYU5$JHEHVA3Y5AG5JA9kXer$R1cb[c"&D36K8(X8+,%4T4
+r69#[BG4+5SeSm2K)jJD,qRRVVEVQlLaXiY3[-'Sjkr0%%NefSUXe'ANYIfYGd*1
+YP[(@E`MUG9aA4R8QmaHSAaI8,r+hSUINM'*B0"'`k1LI,kM,'(83#6SAk4bi0`F
+XU"F)k[9F)34#FdCB4)29Ilh"T$BZTNh(91IlQi*kSkN3S8BEh0(0B3lUY`6eEia
+SS04Nq4URIXP5+$f+E91r(+1QfQ`fp5C,SA6laDBZjhQ)8V-6ZMIF)UKIX44+akY
+0rDUP805ID%A&U9mchYT)p-Rf$LhUecQ9$@#QfS#JVK68El46b43aHK8PkXfFbXB
+fYlleQqh8l&Z4+5m@e'pa+R''F@TS(k6UeeC"[B96kpe1RiDCli4#H1ZPJVULRGV
+XGk@DSU"H*UJV$DSh6,THi861Dp8[FJKUUd9YUN[0PeFpGlQJhXSc#LVAE$mDe#X
+%p6EcV9(-+U9eE@`lA&"[jjQ56RZiSi[5&CYE81rJEfA[G+)PPDaXkJ6ecJiU'SM
+*D2L-S(klJkSRr3!kU(Ga+ZdUBb`LR4Xq*kKhmmM$2!SCYIIATh,jlB*k$k-k3S'
+ZS31mp4T"r9XHHD"Qfq`fpGlfYfCEa-K$H`VUGaLe$06d0!TpkaF%pEX@0GQCTp4
+V"I9l22)B09@A3k&p"I@qGPfc,@+mpBZ#ZST4"m+M)p-599V2[+@IS0l2hpU)PQ1
+UjU9[[8&3(q#kdX)`hAj"EV!m-&DE9'Fd!QN6$9K3[bfS$h+&0%b9C$0+U0DD`9V
+$-`USfBb#YpiYU!qe[l8VSh5mpIXm0i$DP9&#Y9j"r6Z,fT94[LbS$r-BBP6L2T!
+!c19@[rb4GPfl-NU(3QZ0'%+,*j-Fm0D[#1UMR+UMdGY0rDUJ2LDS'$Y)p3iA2'P
+&hZ-m'R5YfFQF`T,4B(AQIX#M!G-0UIB`b`hI%G3R1,8Th*9K@dpIG,@J2XN9DR%
+&831NURNSC(@`RS+rMc,I8qj#R4Ga"M1p`b@#q[H-bP`IdXUf,VMP@%&pQP2"*21
+[`D5[8Y9cY`RU2a$IXYT9r5I21MRVi,*br@N0J[T$pPE@ffM!((CRCaQ4CrPJ2@0
+48BifT,TP&[9CJpS8$$VpQ&G+pASYkR-mmY#P52FE0dEHZRDUXc'L*DF(l,Fqcb1
+28,9d[)*U632r)pH9p$CS-+4k0RF+kSm-DLMU$!@LrX4M3E9UVaHi3RKN9fi)eCi
+VU$pQe%'dMa+"kdjR+m@QrK0r+c3P$RlqT*IBY2il#1U,"TA-p'4bAY9cp`MU6aM
+9%@M#N!"0*0'PT!UG*kMrc,cI+M"Mj`UQ"fIKl[1'S+lRN8HSdDlHiIF&pDGF9e!
+$6K)2UFLcH[-rilU'A'ip13K)U2UjB`AejcalSGrJbm`$YqlqS&8GrS*6`mK$QER
+je[%9eYcm5eaA3Xh-I,H1Vla58&rQEihSf9B8LA,,RHjIH$53!)`m-M8!6b,[B8(
+p*AmVRF%+kFQhJ[U)S2l+SLDlH95Kq`6eec`DD'je`U`VPEdXkQpi4L'e-XV$6%C
+C+kL[F)Adm-MX'#BbbP*"IC8V4#U'L-rM5S`2Y%B[YZEBAZ-+0B@$fI5&YeiSU,p
+PqE@X58r9*j4keM&(#qS'VK$0*ZQ!463m*ULrJaHH-[qD-P446Ildi'(Vq%%r&06
+A'C9iT,NaH1K1plfH&03hq&Y"p65Pqd1J2L@SrfT3&q["5$),NDcmd1m%pGrJeUI
+-Acj3)cf!VRR+GB,kHdCeD'jRGU!5m@T0$rbKR8V'HVC3rmLSCD"kI-R*-NUeCJl
+qC1VU6&D'QkMrcVS83drdDR8Sp(6Qkk`IeZKZk-KH&ai[U(qQcU#15RLA'X$08Il
+pAeNejCZ%1Rj*a8cr)UpR*R(hLVh4T&kljN(UAXh1AaKei0c&MI#,fdbNe2[DYKI
+8YaKek+4)f112qL0K9a"L3H#1&kbmmkI`acBrYh'&*NkCAAHQeieji+*#UX+SC6-
+aUBMCek4%0TAk[ijIiTJpT`EcJbPPE5VeIi9#*c9KGXJ$&leHKDMrkrJP3dcUA0*
+ShdLfUG6r&ET1DFCND6VdE'Tr4Kd`TETk8MTFip3"aPY*+rSrhMV3L0I'aU"h,KU
+)[G&3aM2+9&4GfBc53A8`DL9NR3Z(pEV)SXeSQeV1&DTQrT6*ppV8#NBG4(90Kjp
+0V@68`E-L8Er2Mei+dYiQV%dGa+N6Te5lh!'@p`V8`6`D*Nijf9[[Thj4a@JB`UJ
+l6Ta5JlE5A+m@fTc9EHS12&01$2T4HQh0P$YD-66(VINEhj%e6Yf*8I[2RM-aNlc
+Le+%m'LCKcL-56Q9,QlScSjD6C$`&98VL`6Ce&klVT%J`SP8MRf0%Yk$VVMb'j[[
+KH0Ub0BCfi`UKLSTUN954BP0hjrPeTMIFY#frlX%9QZahSCT2+h6IAciTU([bbQE
+56",RUD4R[h8[VQXefMa4H,QqUq[HR(Um+aL-4$!-h%[Gap$9fqa(#E!PmMl#hcV
+CV`HQ%bqahVIZbkLlNXU'CYD*BFmNY-jJ1'8ph+C@FB@Q4S+dP(pASIf-+JUjB9Z
+8lmrI1JdHFf5m+4APEbd@e!2i@fHJdYMfeSrbQR*'T!@PqGDDmN"HXCd-"`'b[m+
+l&GY"4NC"$H@U6i@j6IdBcel9-qC36q'T6@(h*[3YMmkeU-0i0+#SF6Aq4c3Fc#0
+[MVGq4J60k(HMr""H(Fk*`LVCTAP)CRQR1VccCc@#qR(MV969V4RP8"jjT"l+p%4
+XkR!HjHN5MfF8aqQ#HKL2[1RKD$!6kICE2f%SK!E!0S9''2R9[iJBm'q*KX10[KH
+#I&[1'mRkH@5VJ"-e'2d(1URSj`RI6A88f3bMjYLb`*MK+)K5Md82@hM!Uk1*3XI
+FJ+kYKl45Np396`ba&"V$U!-A0l[5A5rSHYH&M`VU%GLB3+QC5V`LQ+pe*lJeq,h
+pK8*(-Pd(%-Hi6$RIfRLMk,qUBlP#')X-4p*Bk(UI81JSUY$TC@`#)ae$SINALEH
+1DimKV)#3!)fKeH+Y4jY8NPr61@r05`X%p4K'(8"R"p,4J,HZ%G6a2"VSJKHCH(e
+ifKZ#HLb,erj`q-[f84!0`J0$2Bj4(D!k2A@TNJh1mIX*kJ5qci'QZiB6*r)N0EE
+2J6U4j3E-pG*p+0,8S*KP9irRl[[%p6b6+[(@R`MU*,l2!90SG)Ek'd'Gc0lD(fr
+0aC!!pGBTFDIr4#8DFrTATf+[!'AqDJFQPDP*BNUK@M&RSdjVceiZ,Cf(9M`aY,r
+)$5F`UJ0'Q&NXmY$cJMUG1H+A`D&qq+L4kCbhlRVKjDaqdRD16pCHkfi3VXcULCb
++ZS'!-e6K4+l1i0%3p)ImQ6B&G,eIk$TcNd[p*M6H@LEH1L[Z0jq-mKZ%`i3kHj1
+hr5B`TUR%p*YD[G%j[V2UMAR!UbGYpVEI51j`U9G2hZJhAhVVR-f1q1qm98baU0c
+rY6rF9EYk[6'RC*Al[a*2eZ'S(E$4a@BfhLVF`9AQrlUi2abJFfm9([$UI&jlqH$
+i%Xc8AVI[H*[)+,AYEY-jKDD*Yjl#DbpM-M*C!HMR[LUSTc*[+[M-CBXSSUZBd9F
+Aa*fI%Y9mc2P*2Be(JcZ+eQBQ'Qi+RL+LiA6f9Z``%Fe'3iG,KhV'YSk)H+Z6[GA
+K$RTGB3bbTHZ'Qm9E&r+kS3QVG%46M6N5jImXhZVL-`HmNcVPV+E5c%'G15HD$3C
+l6P4eGdbNCD,m18(ef$0ck@Ki4P#pX6QfG*4h[0A(HaZ)SFkj(#1'V[LPL)Ck6N8
+%T@-Fe,Y2Q#'S$6`2`IFYfdKCqF922#+SIPle0N9e1S@GM)E,GVBbbTNm$r%Cae3
+HURUf8P!$,*GMhaIhh%R9Q%S*4F+E*Qe@VPYfViLK)+-1V*PFAAem0[+@V4,8%+2
+Z-*%j(YF'1dF`3,e98-1-1QLD0cTcmI4U!ZqXHTH*#8)eXUfI*k+K%CZ@+20I,#H
+GRQi(D+[6FaDM9P"Uehcj!i+U@G5d#6bS`V&!e4Q9E$&#9dK*$*L#+LEJe5LM$UC
+8c0V5Z(ZEfcVXSPF%YFP5+'@hSE6@RLTmSp9QZcq8R'4ehlLcS,B`kK#fme%)k3'
+c%CXheE#k5S[i@c%!hqdqFU2`1e3AFbTh)Yp#2G[+$HP+$`UY%G4ciKNP5BePP#9
+-SCh4(4UZqa[VKK-61-eIhp$aDLJNYJT3cfA83@*[TXkHc6UVCh-HSm+T+qU&FdD
+bCV2IHMkI(JKdQ3LJ"h#Km#"8Pc*U*CXY)h-4RGPVf[2#hdZp`(jVXYm`lCNr#1U
+&M$V%S#D+@,LU#!pGp90F)B2DM$'RGk+KJhV4flTZVV$AReB[U*qfhkV"$h0cT[`
+UCS"0kX@-5PcF'PfkRV4(D*hfFq'jT9l#ULMiESCJaj6Tp-`A2L,UTEc13fQBVI0
+D&llk5d'pM-qMq+&VEKj&8#rR$K04V-#NTl0bKmq"HJ@M$TjF8jfe%ZR`pP#[a*B
+lbVb$bNNd3+58*e$d8VqJAX@SF$b&+@!dl4F9UYe08$r638fkD)1kZk"qeU+5"@K
+591((KXfRBY6-@rF5e-maDKQKDTfl8V#kiGRA"I8D)iD#X0a$GC2f`0KE8$r2U!j
+B&UC-baKe(d(p!PF)MBhkK-mXThj%8+rP#Q(f*@ZU!1U"JRSGRdG"014Q+B4VNIT
+&SdE*jQ4DHePqKmU6bp4GqP9Mr`&9H![3,rPYVcTS1&1a,BH+IZlDjJhd2cX,PE9
+R9m9ipe3d`!GZl5fMmIpTCHfS"l&q`5[i0PCCqrA*G2FhZ*@&fCeq'l-%[jl3eUD
+qMM(kK@V9bQZ9Y5h9'"G$K`8Ebpa68EAL,3bY''I`r8ZK`rE+)b2[D(p$bahJSH1
+*$8c!8bj6"j!!-HD)9ZDMHZ$h$&5fAPPl*IN2$DqD!*Z&YjLH,HYMr![8lFN`UDR
+RDrGJVl!p$QdGAhD!-V#e5PPVVN@'Ybbp!pqVB[b,mIj&X1R9cfmMr*F@R0qQcL6
+66,K2"[qeZrm'#ciphcTqi2RU&2UHK6(q8V9XKLYFhi3H"H%2K[q1m#5VqZaPH-G
+*VH`qXA8Bq-YMr#[8X[NZ,8`Q(JNr&MpV@bD`q"R4f2kE44hkAkikZ%e!4'2aJiK
+HI,@kFpYEr@CejT2m(Q$QS6Z8pHB6G$D3!#rBqdQq`#`"0N3LqT!!$@+`I4$0*qf
+r*rQ#r9lN%q2hmUemNYrec$`NUVIP%ir)&q4-`1r*0jT2D,iK[ehEBQL*@-,[VAc
+#ILrMUNpb'mHC"p8j,90QpCY9c#H,*'RjT!(E&KPeUj&2FMj9j[PhIQqMmdp`ZH(
+h`I`qK0phi2F+IYq4h`Ibqplm[LHrlm,[3pPGHBXk5-%TKIrZ0$Tp"YF2rRd2kPF
+#2`rq[6qr$q$hlIPp2ThKJcF4rli[[irJGr4Rk(drIYqI1Q6!ai"r2i$I2mV[E1i
+,ALaFTcIjpdTqhiRI9AirL0mr4VdQi(E%[qr&lqAmhSrIYq2h!rPp',m2Tci,F*[
+Jh`qKcK#BY+)c9*JQTh2LF)MJ[pqCh`rPpf2Sp$QF&[Mh`lPqIk(qATL9Se0`Q2H
+LNebBa5*69LY@U(ib0iAlVS5(qaML(i#p$Ip-2-K@V+$jT"jK`HX-)jrNZr3Ql02
+m2SZm6kdLq84j@1-e#C,8`jG9dGr4I+*@+AG9MUAID6l"RHB6h'Nq`ChQ%paT2X'
+GjK0`D6l"GjT2F$q6j"2FD6l"RHB6h'Nq`ChQ%paT2X'GjK2F255Ii%lc#HidRq"
+1m`RZ0*rJ6[-*lM5Ii%lc#HidRq"1m`RZV+pIaI)*G*U&'Z[1kpDESA6RE6[%kK2
+mA[h1QdE0YPlplY#U@(eblkK(j4le#G@I",kG6r,c'bEXBRiI5C`i8,qp4I'lapq
+6Rm3aBHIcqeML5S&iQ%CQlR'Rq4EhFIMGDYb2*Ti3Z0-mLrX*Z$q2qb9N4J6h)iL
+$"Zj6b8`@lU2)K#[Z&j!!14cF,b3c-VKrLYq2"IF#h)mMRJbi(dPQlh$RZUT(iIF
+A3CH*C"B+ph2)2AbeHMEHY`EhLr#1qTPql2Z`R2BD0qTILLEDUIr[qKZkAdFkrN*
+r3hGE4qc[4(E8h'jMrC!!QhNbB8XliThTrXGUl'&!HJD$cAkDdBI,E8pT([L"aR6
+2alX4hdCFpmE[XKf-q-8H!Q6Rc5&a[I+1[qC"l5Bjd1X8-TqqHQa(hPNpeY50aiZ
+K@hlI622!B85Z%'IU"(cI!0dH`&3(U8PXhI)EEjU(Pccr3lIMmIkI5!(d5m4GI[G
+1mm$,40)3GiCZ21j&[ZMDrY-mm#U4,1Jf#Gpr)r+&V9Yqre$cm2eDC3RjSRA$4[d
+5FCIIK03mm!'4)F6GQ[8ThGTE$#cZFVZBQSG-f8J8iZljYqXj@lIm0UMQ`@jPFJR
+Gm[ZSQJHE1-N8G([P`C*ZfBeBcF2hd*8`k2B)YTBJ1lADZZ9hFM82kDVpEpdQFpd
+-rDB3hkSq(88I)+&MINYBmf!Z@@kKBhj[@I2!19d5SD04VmEVMp`QYHD"9i`N3%I
+T3"cQGlSe$jPQNN$%iC`4b6M-EjPV(VK0b"cLF&j9*SpdlEYV(Xb8rjGqra9rd#r
+C2mKYhQZHhH3+GH(ZCMmrT9YZpercN!$0e+85ZZ@h$cE2(Y)*hA,l$jYR6qQ%EVN
+0M-fcPea"Ych0[Q4+Yp`1b1EC@kkJfcj2pr6eFPXSQfFIkB0Z[1p[k*EIJpNm(rP
+!YqR%0r6rk[B8YX3KA4AHpcIc4'i6Cr2Xqk&Z(mBGkf0MET,12qccY&P2fhVQGi3
+f$jrmNbhS1@UT'BpCr8Sc2r[*&I*IZfiEjdrLqZAfTME2rV)'rFaqQ,QR2GFYYlQ
+eH3k`GCZ"qre&r6j*((cr1Xpa)RL6-RfpGGJLL(3AE4hcZf5Ejk-IkMJ6pc,FCq(
+ZN!!Rk*VHZGSm"hkSkfcL,Bal0EjA5!9d0HS[@pIm2YlQ1HK$AH8$FISbYZ`KA99
+EcrbQi1EjQ(3Jrja%I*Ta2eNk%,FrJEF&kB)RG1l*5-6Y3`k3!)rQ30rMC3Tj+Eq
+&ZAN1rP"IbB#H,da)eRIjrG$0FmJ(HNS'mXk[Uj*j*lqaZRNq,Lh)Vj)!I4r,k9Z
+Xm`k9@q69Y52-ZANqlfRSQpm#hMc$2qL2[0FAHEcDl)XNp-V[(fqH`q3)HXdIXE&
+rCZZ9hhcH2*q3!#2S0E,4l*[9%,ppc%22*@lpbhB`ka3q9f['@fi(Hr2!L5QQ(rA
+RqDZ1YG"M'ZlcS-H*rcNAhIC38XIm9[MQ19cZS11YbjQ1V4Yb1UEf66I25,Q$MSr
+bH,aeH9,(r1EmjKNPKp$ad93mjRIj0mpSDB514RrPREb5f4,H2'1N$6T5Rj)VRQC
+kiM[9miURZr*NCRpjma`KGiM,ahMpQ0D4ePqCMHV0Fk3F3XI(4R6PbFb1pqBC+ih
+3-C%RD6aQYXihce&bKccjIPaQpZ%hccJj4&c#9bUKSi2S@'bc+%G,-I*NC[G"ma$
+R6UQ&MM42TPG[EMrM*4Nk4V@mMXI+,R5NpE$Z#lT5Hj!!mR1F&#-rkS(dkSh'JBZ
+X$%2(BYde8BU4(h9BqZEViH1P'$TQYXFdcb4TK)l'[!(hNc*ea*Bp[IhkbED1NS*
+jJk2jR#[ZG0i!GcT[F265T(k94,p5Rhk+j%+r3RpqUUa#[h+LAkN[2deZS9qaVMT
+"DT%r5RhikC),r3TpGhKmbbRdSr96UGpqSY3LrjAkl2!@PeM%AkQr2P0U%AqPI[S
+X@B9q$U*IUBmq@fS4IkAq1Gq%39+4rdTpmj-N&rS9qZ8R5bhUee+II)l8)[q9qZ0
+cj4Ek&HXRl-JJXFKrTAli2+Q&IU8qq(cTJhl'2JRFPpLXAmRf4TPpZma$YK-J82l
+Hj(ZB(dla3GKK)rBH`lmJrKkqE9G2JAfU(#'q-%pVq"FNpFGQNI#r+1LrB%Xm-6q
+0`RY1frUHjM'p!BmG1cE(*rH(0Yi$(pVL8JBiCdJAiM1K9`A6#dk@1FQFXJLpi#r
+VDN5$S+FqA5LEd+ZR(RA*)[5UK&k)VY61@qEK@qA))I6#6SXH9p69V4IrX4`Lhd)
+[@2hR%S*(-K&I6Za$f5fB9b+4Epd0*@0jRba#,p5,EUeSpieGDL34HK(IIZK9k1r
+c,B'N%2Q,k&A)AhlCK&ippGHC%SPk"P+P&[j[2h`[BQQ%AY&![[i+5L6b,Ge$X5I
+IKL35p4GbJ92VkFq%C40kpI4R)K+*qJ"QiRABrLE3V4MIXNJ+S9I3T@1MJR`(l#b
+*4$jSG"@k5BUL556U!c*X@[!(jqYA5L(k(G!V2pb&`lBdNd2N,k*AS4j[NNRSeH*
+a&M*BXd5L(LGk&3Df@L35q8YhqBTqThb91#Q%AP&h6l-$"lZY552U'D*ASEpiYN3
+LhdEVSm8HlMNb#Ef`2LRTkAIVY86DS"II@mI3Df!JL[QNiLB5jmSLp-*HeZrk)Cm
+RLp#V)K"pe`mj[ZqDY%'[5ZbpVC8fC6,f2j-qk&8H`2*dS8Kc6dDi3"S4Am6l!1@
+ieZc[9Za#kB*HaRi@I"mNXej%2L!6M$d*pe25!Ve1*CZ@rdrGN!"h-HP4p0Q#"lY
+F3MH5Ih[pYBcp$H85ZRR$RTl0*)`p!H85HD+H&$bj2('*P#,HkV[@b@ER8YQ%EUM
+AI-k`Ge&2aq`bfB4ZY!iUqHjF,UA)%k8+q3T*K@jk*'qdFk@8STl3pF+#*PG*'h3
+cI%AHbF[BrljlkdHFcdJ6G+-qfBmYYrI!@0j99l38%r4RT44jVU9S+(@eY%%hSir
+&pfXcmaaaYF"#Pk(m)1,RT!@k[DmAGJf(AK%01pCf#hD0,%)[&PrBi68h4U"mAVU
+JPj((E,h+QB["jRhpBqF,lqZe!,j#CdJ"G$2URRLFe38p[40qepUkpHfM+Lh3Vj,
+TjqcTU&`RIG![QHIJ*Z(%bXIB`,ilrZ,lX%SEmY`J8[+ib,bYZlYJ@bBpd)[@adr
+bI5Z-q[M*Tj1k95)e0jF5hI8F5[FqaM[P$h@E1p+iQ&SSj4,%$E+)ZJhjJHJ9EA"
+(Z`[0'k84G5E6UfGF6F&Q`j+)1TlU99aYmNZ5#Ed+PLjIPN[NJq+!rNfb#,h+U9l
+&rHr)0XB5LAa3V-1q)TI)"e&rhJj$qDSm)ViD56BSq"&p64UK&e[0UQ$`mh@CK&j
+N!d"-1AIVp3eTK&jX0Da#I0dXNp#V0lkq+Bh3biIGaBd0aV0kI8ZkS&Hb$eE[G[S
+dl'HCc`HhI+$AkCLRZ&e@S&Zche8`ePSKEG!YQ4q`+`0a(`RRqc8VT4(jM1V990I
+68@L94Y6RQ$6VG3bm95)4Ae(X[e$)BlI*)[4b4#-qRejBYe#9&mapp[A$U(qe1lS
+S,pMYdSKm`(+"%lBHhBS4ZP4#,jJUGHYeTfa#,cfr4qfhT4&k8EG!'#6Rkr1lT"(
+e&rc5b6+Xr[TF`VeEZU#AX8G2[*i*"Giea,h(eZX-VX0SI(r`ImhY1G&IZ&NU81G
+!aelMcVq9,X4GBNk2a&f[-GqplqZ9M$2T32qT$2S9AH%95[prqNN+G1Ya(e@8lmS
+QG+YNZKAQ1VmREG!YNqGk$IcZ5p3AdSHkBL#f0#rCLbQVT!Ye45*21"TK+&@BhP1
+8qlISG5Ed)2YZbJrUI$S#9633H%!@8HG$,fFdJY5@0h*E,BfSmc9iXTIUI*,&*3j
+e2[EEc0Ijd,'hcPmM4iLlj3YlkKrSe9[R2b4RU(q-26`cp6,dkkhc[bpAU$ZhkPD
+Xmrp10U&E*G10E'MEVGh$dJEG-RQZYmjr42U3!1H-rD!heK8`F#J9cQYYrITm-q)
+k6X9hmSlhI"l@V1r`H9Lc2U@V$K1qNUkNDT4!k2V3L!jG(fVIJrFGA@%&h12[p*J
+FS3iXjR9GDhCUETHl)CFL(qG35B,IKY!Y0Hp86hC$+q6e(dJAiLbT9e2ihBlG%p+
+)[0$L#U+c@jLAII)$[Il2(1FQhBEDqGH&1D+)-pMMlr58p#'IfEUaIC5,'Hh[T3h
+j,+iAe#,lN3Ac#lD3!1eAj3TkICNkD&6'pHSrHGE*a@kjS[`$K`jBHHdDdPFXirF
+UIYprjAe[,FEGaEmVr+lbqi(mrJPq2jcIirXLfIU`qI3'l(ZBFcEmS5`LrTPH'#T
+Vb&@kcdJAp$,k3"[eDJS'RAlXG*(Vd$iV2G$,k#I8B8p[c2*Xl#XNp#[([(I4A8T
+4RT-qk*HXbk#IXc'Lp3`SVj-Hk%Ge3llBNMF`YajfDX@kl(PC4Gc41ADDTR144lT
+dFSCkq!bkSGAfEqX@LMT$JDJr(hJriP"$*d-ASpj+aM8#SVGqI8'D%"Ij2U1Yhq$
+*0G9BrX89c'dCTXS,r*,IVaF(dARrL0icm[pMkB*HLEa*jU9prU$A(mRPKhqbpHV
+Eir8ph3TjJHha8+aAAV4d8hr"p-+GkS8le3YhUKIZ9#rFU9ki8le`ThVK6[A#RHU
+&qjDmi!JdBFQ%50ke5m&HrC+)[&"*NQkdk01dATT3$fl0#p!Yi#3C,4GT2j8Za0R
+[P6rLYY['[""bZI@HjBC`IXDKqr!qQk'EdCIE1KmB@VPZfDe#cc#qhp-AMp!e!1k
+pErFAe%YE&llk5pb$q$fCb8hfH6#Al#YYM[Gc18*qH@4#ClrKN3NTrF,S0j6fj[b
+&0+&ZLZda$MecqP83r8Tl+liNIG![NHI,)hU[cBIbXR3KcbILc8&kJL-,DfBUrb*
+pb(I*[LEGNb5Npm3EFVmN3EqiEXNm3AAVF3G5P&r*)ZVZ#YUVFhSLqAlGVcP8[Y$
+(01EEird#-Jq)JD5HIX&[T![e"-ec4ViSe%APHRKNli*CVdJ6iZrpI&G"1XN4RmH
+90q"p9EU3!1q5mc90i@"[`qBekB*H,p0+CTHiAQ90HU&A6mj[EEf-ZDRK+qpcR2l
+AISdaAaA[fr6P$pU[f9E[9G$H3,(Jfb"YU2H-r8ChYZ-6Fb"0rZ)#6ErMd2LmQ[f
+H5NbUZE(JNM[[Lr+kY#'Ia[@(ATkQSPr%'p)&[C,aULr@Jj'HVS+Lr+XGVdEHfUA
+M23-e-PpDH)lbEl)&r98hjS#IHlapAa*E0iIQG[BZ8[9l1B*Z,pc"G-2G!pfHHH'
+1V'jNPB8HhIiJEG$Y+6UCZe0FYc,Sj[(eE0HLd+kpTGY@[`aTJ(iXEq$hAR*[hB$
+j%$*aXI1Q[1IXQH%KjdqfRNEr*F,eN!!8e'raZK0hUQplAQ6klM$@V"0flG#h[&'
+,d08JFa+VaKk)4Te`-Gfib"&r6`9p6k(YS2EYD@MSIJlAq@ciF"![T#iG#JZSUhh
+l&mCd@,@8kE"U+IE&)C[,P-GeJ*m@G#KB0kM'AS9pIDrhif)`e30eGp6IYF1+fVF
+hiIYa`H+cB!qK'[X3bJ2LiMUkX8J&*SBkkLdiY"A6S+,'paf-qmNB1KMq-HHf9Ud
+ELrYP[0pdhXTe0a)G$Af@N!$[L*1%,N1S+CJcK-@+AI@C@&(MH`hQG6&mE!ap0ZZ
+bk'VXedNbri#0mB)aPj*rLKVIAl$V[3$jk-D[r6HqPqmVhI0HBrp!3hIM[I&i-qV
+AhHekL1aYMF)llrqKa[Ca8LjLp4lZp0fidlb%1idlh'PH`[dke'Y,F,m%ph0aTh8
+IlV6Z`jh@IEM6ZJph@[IK6[A$29EhV4l,kVjqHjPpGeY2l!1%*3#L2EjEDYqH6P4
+(h+Q18S(jRS4qqEdTeEjpR53,qV88iUp[AbITJRipmGHhYj-d3EmbSTr@dY2!8I[
+fGrT2h@MqrS%pGrZ$GYq1MI9)%#EXU*Acp8MI2Nr5K2KcB-'%JTNSB(hl2FN(p$0
+mjZ,j!dhdq[`Z933@hrFTlc-Apjmek[+iRReqFe[LXKcc$+8'XaVI"dUq%*FirBj
+B$9HGrYKFT1D&kUP"fLR$Eq"dYJ$E16kjV(U'cVY9j23R'k6dUjlMV@pV-hqd0hj
+h+IN08Irr!iUP!!!"!*!$!43!N!-8!*!$-J#3"!acC@jNG'pIDf4M,Q-!N!m,Df0
+[EQCTCbjcDA3#!!)!8dP84&0*9#%!N!J#!&0*9%46593K!*!BV(5`-!!!Am8!!!&
+'V(5'hArr!6kXE9H"Irm"2k`Je#&rr`%hV(#EL(rr!6+XG)+`Irm"@DacIHerr`&
+LV#$9ZFC!!6QXE9H%aN!"3DaYE'2'3!#q!-!!N!-3!"-!N!N"!*!%#R0Z-R"bD@j
+M,Q-!N"`3!#X!"3%B!J#3"`-!N!-"!*!$!43!N!-8!*!$-J*&AGJ6'J#3!a`!-J!
+!8f9dC`#3!`S!!2rr!*!%!N@Q%$T`:
diff --git a/src/mac/kconfig/kconfig.vers b/src/mac/kconfig/kconfig.vers
new file mode 100644 (file)
index 0000000..8c02042
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+#define beta_v
+
+#ifdef beta_v
+#define SHORTVERS "1.0b11"             /* vvv b */
+#define BETAPART     0x11              /* vvv b */
+#define RELE beta
+#endif
+
+/*
+ * the release version
+ */
+#ifndef SHORTVERS
+#define SHORTVERS "1.0"                        /* vvv */
+#endif
+
+#ifndef RELE
+#define RELE release
+#endif
+
+#ifndef BETAPART
+#define BETAPART 0                             /* vvv */
+#endif
+
+#define LONGVERS  SHORTVERS ", \251 1993 U.T. Austin, r.watson@utexas.edu"
+
+#define VERSION 0x01                   /* vvv */
+#define VERSION2 0x00                  /* vvv */
+
+#define KCONFIG_CREATOR 'RWkc'
diff --git a/src/mac/kconfig/kpasswd.c b/src/mac/kconfig/kpasswd.c
new file mode 100644 (file)
index 0000000..f3687f4
--- /dev/null
@@ -0,0 +1,216 @@
+/*+*************************************************************************
+** 
+** k5passwd
+** 
+** Changes your password in the Kerberos V5. This should have been
+** part of the kadm stuff but we're forced to build a nicer API on top
+** of the calls they provide.
+** 
+***************************************************************************/
+#ifdef KRB5
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "krb5.h"
+#include "com_err.h"
+#include "adm.h"
+#include "adm_proto.h"
+
+static const char *kadm_replies[] = {
+       "Operation successful",                 /* KRB5_ADM_SUCCESS */
+       "Command not recognized",               /* KRB5_ADM_CMD_UNKNOWN */
+       "Password unacceptable to server",      /* KRB5_ADM_PW_UNACCEPT */
+       "Old password incorrect",               /* KRB5_ADM_BAD_PW */
+       "Invalid ticket (TKT_FLAG_INITIAL not set)",/* KRB5_ADM_NOT_IN_TKT */
+       "Server refused password change",       /* KRB5_ADM_CANT_CHANGE */
+       "Language not supported",                               /* KRB5_ADM_LANG_NOT_SUPPORTED */
+};
+static const char *kadm_replies_unknown = "UNKNOWN ERROR";
+static char errbuf[1024];                                      /* For response from kadm */
+
+/*+*************************************************************************
+** 
+** get_admin_response
+** 
+** Builds into a static buffer the replies sent back by the admin server.
+** 
+***************************************************************************/
+static char *
+get_admin_response (
+       krb5_int32              status,                                         // Type of error
+       krb5_int32              nreplies,                                       // Size of reply
+       krb5_data *             reply)                                          // Buffer of messages
+{
+       char *ptr;                                                                      // For building the response
+       char *end = errbuf + sizeof (errbuf);           // So we don't overflow
+       int i;                                                                          // Index
+       int n;                                                                          // Length
+
+       if (status <= KRB5_ADM_LANG_NOT_SUPPORTED)      // Is it of a known type???
+               strcpy (errbuf, kadm_replies[status]);
+       else
+               strcpy (errbuf, kadm_replies_unknown);  // Unknown error type
+       ptr = errbuf + strlen (errbuf);                         // Point at the end
+
+       if (nreplies > 0) {                                                     // Are there more message?
+               *ptr++ = ':';
+               *ptr = '\0';
+       }
+
+       for (i = 0; i < nreplies; ++i) {                        // Append additional messages
+               *ptr++ = '\n';
+
+               n = reply[i].length;                                    // Easier to work with
+               if (ptr + n + 2 >= errbuf)                              // Check for overflow
+                       break;
+               memcpy (ptr, reply[i].data, n);                 // Add the message
+               ptr += n;                                                               // Point to the end
+               *ptr = '\0';
+       }
+
+       return errbuf;
+}
+/*+*************************************************************************
+** 
+** keyadmin_send_recieve
+** 
+** Sends a command to the key admin and reads the reply.
+** 
+***************************************************************************/
+static krb5_error_code
+keyadmin_send_receive (
+       krb5_context            k5context,
+       int *                           conn_socket,
+       krb5_auth_context       auth_context,
+       krb5_int32                      nargs,
+       krb5_data *                     arglist,
+       krb5_int32 *            cmd_stat,
+       krb5_int32 *            nreplies,
+       krb5_data **            reply)
+{
+       krb5_error_code kret;
+
+       kret = krb5_send_adm_cmd (k5context, conn_socket, auth_context,
+               nargs,  arglist);
+
+       if (! kret)
+               kret = krb5_read_adm_reply (k5context, conn_socket, auth_context,
+                       cmd_stat, nreplies, reply);
+
+       return kret;
+}
+/*+*************************************************************************
+** 
+** k5_change_password
+** 
+** Bundles all the crude needed to change the password into one file.
+** 
+***************************************************************************/
+krb5_error_code
+k5_change_password (
+    krb5_context k5context,
+       char *user,
+       char *realm,
+       char *opasswd,
+       char *npasswd,
+    char **text)
+{
+       krb5_error_code         kret, kret2;
+       krb5_auth_context  auth_context;
+       krb5_ccache                     ccache;
+       int                                     conn_socket;                    /* Socket for talking over */
+       krb5_int32                      nreplies;
+       krb5_data                       data[3];
+       krb5_data *             reply;
+       krb5_int32                      status;
+       char *                          name;
+
+       *text = NULL;                                                           /* Be safe */
+       name = malloc (strlen (user) + strlen (realm) + 2);
+       if (name == NULL)
+               return ENOMEM;
+       sprintf (name, "%s@%s", user, realm);
+       ccache = (krb5_ccache) NULL;
+
+/*
+** Establish the connection.
+*/
+       kret = krb5_adm_connect (k5context, name,       NULL, opasswd, &conn_socket,
+                                                       &auth_context, &ccache, NULL, 0);
+       if (kret)
+               goto done;
+/*
+** Check to see if it's an acceptable password
+*/
+       data[0].data = KRB5_ADM_CHECKPW_CMD;
+       data[0].length = strlen (data[0].data);
+       data[1].data = npasswd;
+       data[1].length = strlen (npasswd);
+
+       kret = keyadmin_send_receive (k5context, &conn_socket, auth_context,
+               2, data, &status, &nreplies, &reply);
+       if (kret)                                                                       /* Some external error */
+               goto cleanup;
+
+       if (status != KRB5_ADM_SUCCESS) {                       /* Some problem??? */
+               kret = status;
+               *text = get_admin_response (status, nreplies, reply);
+               krb5_free_adm_data (k5context, nreplies, reply);
+
+               goto quit;
+       }
+       krb5_free_adm_data (k5context, nreplies, reply);
+
+/*
+** The new password is ok, so now actually change the password
+*/
+       data[0].data = KRB5_ADM_CHANGEPW_CMD;
+       data[0].length = strlen (data[0].data);
+       data[1].data = opasswd;
+       data[1].length = strlen (opasswd);
+       data[2].data = npasswd;
+       data[2].length = strlen (npasswd);
+
+       kret = keyadmin_send_receive (k5context, &conn_socket, auth_context,
+               3, data, &status, &nreplies, &reply);
+       if (kret)
+               goto cleanup;
+
+       if (status != KRB5_ADM_SUCCESS) {
+               kret = status;
+               *text = get_admin_response (status, nreplies, reply);
+               krb5_free_adm_data (k5context, nreplies, reply);
+
+               goto quit;
+       }
+
+       krb5_free_adm_data (k5context, nreplies, reply);
+/*+
+** Need to send quit command.
+*/
+ quit:
+       data[0].data = KRB5_ADM_QUIT_CMD;
+       data[0].length = strlen (data[0].data);
+
+       kret2 = keyadmin_send_receive (k5context, &conn_socket, auth_context,
+               1, data, &status, &nreplies, &reply);
+       if (kret2) {
+               if (! kret)
+                       kret = kret2;
+       } else if (status != KRB5_ADM_SUCCESS) {
+               if (! kret)
+                       kret = status;
+               if (*text == NULL)
+                       *text = get_admin_response (status, nreplies, reply);
+       }
+       krb5_free_adm_data (k5context, nreplies, reply);
+
+ cleanup:
+       krb5_adm_disconnect (k5context, &conn_socket, auth_context, ccache);
+ done:
+       free (name);
+
+       return kret;
+}
+
+#endif /* KRB5 */
diff --git a/src/mac/kconfig/ldef.c b/src/mac/kconfig/ldef.c
new file mode 100644 (file)
index 0000000..2b3569b
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright 1991-1994 by The University of Texas at Austin
+ * All rights reserved.
+ *
+ * For infomation contact:
+ * Rick Watson
+ * University of Texas
+ * Computation Center, COM 1
+ * Austin, TX 78712
+ * r.watson@utexas.edu
+ * 512-471-3241
+ */
+
+/*
+ * LDEF to draw text with tabs to specific offsets
+ *
+ * The offset is set when a tab (9) is encountered.
+ * The format is <tab>nnn; where nnn is the decimal offset 
+ * from the beginning of the line.
+ */
+#include <Controls.h>
+#include <Errors.h>
+#include <Fonts.h>
+#include <Lists.h>
+#include <OSEvents.h>
+#include <OSUtils.h>
+#include <Packages.h>
+#include <QuickDraw.h>
+#include <String.h>
+#include <Strings.h>
+#include <SysEqu.h>
+#include <Traps.h>
+#include <ToolUtils.h>
+
+/* constants for spacing */
+
+#define kLeftOffset    2
+#define kTopOffset     0
+#define kIconSpace     2
+
+/* prototypes */
+
+void DrawSICN(Ptr theSICN,short left,short top,GrafPtr drawPort);
+
+/* main LDEF entry point */
+
+pascal void    main(short lMessage, Boolean lSelect, Rect *lRect, Cell lCell,
+                            short lDataOffset, short lDataLen, ListHandle lHandle)
+{
+       FontInfo fontInfo;                                              /* font information (ascent/descent/etc) */
+       ListPtr listPtr;                                                /* pointer to store dereferenced list */
+       SignedByte hStateList, hStateCells;             /* state variables for HGetState/SetState */
+       Ptr cellData;                                                   /* points to start of cell data for list */
+       short leftDraw,topDraw;                                 /* left/top offsets from topleft of cell */
+       unsigned char *cp, *cp1, *lim;
+       unsigned short w; 
+       int savefont, savesize;
+       GrafPtr current;
+       
+       #pragma unused (lCell)
+       
+       /* lock and dereference list mgr handles */
+       
+       GetPort(&current);
+       savefont = current->txFont;
+       savesize = current->txSize;
+       TextFont(geneva);
+       TextSize(9);
+
+       hStateList = HGetState((Handle)lHandle);
+       HLock((Handle)lHandle);
+       listPtr = *lHandle;
+       hStateCells = HGetState(listPtr->cells);
+       HLock(listPtr->cells);
+       cellData = *(listPtr->cells);
+       
+       switch (lMessage) {
+         case lInitMsg:
+               /* we don't need any initialization */
+               break;
+
+         case lDrawMsg:
+               EraseRect(lRect);
+               
+               if (lDataLen > 0) {
+               
+                       /* determine starting point for drawing */
+                       
+                       leftDraw =      lRect->left+listPtr->indent.h+kLeftOffset;
+                       /* topDraw =    lRect->top+listPtr->indent.v+kTopOffset; */
+                       topDraw =       lRect->top+kTopOffset;
+                                               
+                       GetFontInfo(&fontInfo);
+
+                       /*
+                        * break text at tabs, setting offset when a tab is encountered.
+                        */
+                       cp = &cellData[lDataOffset];
+                       lim = &cellData[lDataOffset + lDataLen];
+                       cp1 = cp;
+                       w = 0;
+                       while (cp <= lim) {
+                               if ((*cp == 9) || (cp >= lim)) {                        /* draw previous */
+                                       MoveTo(leftDraw + w, topDraw + fontInfo.ascent);
+                                       if (cp - cp1)
+                                               DrawText(cp1, 0, cp - cp1);
+                               }
+                               if (cp >= lim)
+                                       break;
+                               if (*cp++ == 9) {
+                                       /*
+                                        * Decode offset
+                                        */
+                                       w = 0;
+                                       while (cp < lim) {
+                                               if ((*cp >= '0') && (*cp <= '9')) {
+                                                       w *= 10;
+                                                       w += (*cp - '0');
+                                               }
+                                               if (*cp++ == ';')
+                                                       break;
+                                       }
+                                       cp1 = cp;
+                               }
+                       }
+               }
+
+               if (!lSelect)
+                       break;
+               
+         case lHiliteMsg:
+               /* do hilite color */
+               BitClr((Ptr)HiliteMode,pHiliteBit);
+               InvertRect(lRect);
+               break;
+
+         case lCloseMsg:
+               break;
+       }
+       
+       TextFont(savefont);
+       TextSize(savesize);
+
+       HSetState(listPtr->cells, hStateCells);
+       HSetState((Handle)lHandle, hStateList);
+}
+
+#ifdef notdef
+/* this procedure draws a small icon using CopyBits */
+
+void DrawSICN(Ptr theSICN,short left,short top,GrafPtr drawPort)
+{
+       BitMap iconMap;
+       Rect destRect;
+
+       iconMap.baseAddr = theSICN;
+       iconMap.rowBytes = 2;
+       SetRect(&iconMap.bounds,0,0,16,16);
+       SetRect(&destRect,0,0,16,16);
+       OffsetRect(&destRect,left,top);
+       CopyBits(&iconMap,&drawPort->portBits,&iconMap.bounds,&destRect,
+                       srcCopy,nil);
+}
+#endif
diff --git a/src/mac/krb5-Worksheet b/src/mac/krb5-Worksheet
deleted file mode 100644 (file)
index bb99f6f..0000000
+++ /dev/null
@@ -1,667 +0,0 @@
-#
-# Extracted from old kerberos worksheet
-# Just the facts...
-# ¥ Makefiles for MPW tools are broken, MPW version 3.4 changed the libraries to link against
-# the error table compiler will not be built (.et), the files will be built on the unix side before bringover
-# 
-
-
-alias c MWC68K -w off
-alias C C
-
-directory gnu:k5mac:src:lib:
-
-# Clean a directory hierarchy of .o files
-directory gnu:k5mac:src:lib:crypto:crc32:
-set exit 0
-for i in `files -d -r` ; ¶
-       echo delete {i}"Å.o" ; ¶
-end
-set exit 1
-
-
-
-#
-# ::::util:et:libcom_err.a
-#
-cd gnu:k5mac:src:util:et:
-lib -o libcom_err.a com_err.c.o init_et.c.o error_message.c.o et_name.c.o
-
-
-#
-# util:et
-#
-directory gnu:k5mac:src:util:et:
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c com_err.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o com_err.c.o
-#JFM can't build
-#c compile_et.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o compile_et.c.o
-c error_message.c -d HAS_STRERROR -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o error_message.c.o
-c et_name.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o et_name.c.o
-c init_et.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_et.c.o
-#JFM can't build
-#c test_et.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o test_et.c.o
-#c vfprintf.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o vfprintf.c.o
-
-
-
-#
-# Notes on hacks to get things to work
-# ¥ Our precious mpw C compiler isn't really ansi as far as the libraries are concerned,
-#   we're missing <malloc.c>, so I'll create a dump which really includes <stdlib.h> where malloc is
-#   defined.  Lame.  Metrowerks doesn't have it either.
-#
-
-
-directory gnu:k5mac:src:lib:krb5
-open MakeFile
-
-buildprogram all
-
-# asn.1
-directory gnu:k5mac:src:lib:krb5:asn.1
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c asn1_decode.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_decode.c.c.o
-c asn1_encode.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_encode.c.c.o
-c asn1_get.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_get.c.c.o
-c asn1_k_decode.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_k_decode.c.c.o
-c asn1_k_encode.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_k_encode.c.c.o
-c asn1_make.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_make.c.c.o
-c asn1_misc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1_misc.c.c.o
-c asn1buf.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o asn1buf.c.c.o
-#JFM looks out of date, the initialization isn't correct for anyone
-#c glue2.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o glue2.c.c.o
-c krb5_decode.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krb5_decode.c.c.o
-c krb5_encode.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krb5_encode.c.c.o
-
-# ccache
-directory gnu:k5mac:src:lib:krb5:ccache
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c ccbase.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ccbase.c.c.o
-c ccdefault.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ccdefault.c.c.o
-c ccdefops.c -d _MACINTOSH -i :stdio: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ccdefops.c.c.o
-
-
-
-# ccache:stdio
-# none of this works
-directory gnu:k5mac:src:lib:krb5:ccache:stdio
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c scc_close.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_close.c.o
-c scc_defops.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_defops.c.o
-c scc_destry.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_destry.c.o
-c scc_errs.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_errs.c.o
-c scc_eseq.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_eseq.c.o
-c scc_gennew.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_gennew.c.o
-c scc_getnam.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_getnam.c.o
-c scc_gprin.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_gprin.c.o
-c scc_init.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_init.c.o
-c scc_maybe.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_maybe.c.o
-c scc_nseq.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_nseq.c.o
-c scc_ops.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_ops.c.o
-c scc_read.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_read.c.o
-c scc_reslv.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_reslv.c.o
-c scc_retrv.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_retrv.c.o
-c scc_sflags.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_sflags.c.o
-c scc_skip.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_skip.c.o
-c scc_sseq.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_sseq.c.o
-c scc_store.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_store.c.o
-#c scc_test.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_test.c.o
-c scc_write.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o scc_write.c.o
-
-
-
-# ccache:file
-# none of this works
-directory gnu:k5mac:src:lib:krb5:ccache:file
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i :::::include -i :::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c fcc_close.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_close.c.c.o
-c fcc_defops.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_defops.c.c.o
-c fcc_destry.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_destry.c.c.o
-c fcc_errs.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_errs.c.c.o
-c fcc_eseq.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_eseq.c.c.o
-c fcc_gennew.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_gennew.c.c.o
-c fcc_getnam.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_getnam.c.c.o
-c fcc_gprin.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_gprin.c.c.o
-c fcc_init.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_init.c.c.o
-c fcc_maybe.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_maybe.c.c.o
-c fcc_nseq.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_nseq.c.c.o
-c fcc_ops.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_ops.c.c.o
-c fcc_read.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_read.c.c.o
-c fcc_reslv.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_reslv.c.c.o
-c fcc_retrv.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_retrv.c.c.o
-c fcc_sflags.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_sflags.c.c.o
-c fcc_skip.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_skip.c.c.o
-c fcc_sseq.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_sseq.c.c.o
-c fcc_store.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_store.c.c.o
-#JFM doesn't compile, bad initializations
-#c fcc_test.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_test.c.c.o
-c fcc_write.c -d _MACINTOSH -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fcc_write.c.c.o
-
-
-
-
-# keytab
-# buildprogram all -e
-       directory gnu:k5mac:src:lib:krb5:keytab
-       c ktadd.c  -i ::::include -i ::::include:krb5 -i {CIncludes} -o tkadd.c.o
-       c ktbase.c  -i ::::include -i ::::include:krb5 -i {CIncludes} -o tkbase.c.o
-       c ktdefault.c  -i ::::include -i ::::include:krb5 -i {CIncludes} -o tkdefault.c.o
-       c ktfr_entry.c  -i ::::include -i ::::include:krb5 -i {CIncludes} -o tkfr_entry.c.o
-       c ktremove.c  -i ::::include -i ::::include:krb5 -i {CIncludes} -o tkremove.c.o
-       c read_servi.c  -i ::::include -i ::::include:krb5 -i {CIncludes} -o read_servi.c.o
-
-# keytab:file
-# buildprogram all -e
-       directory gnu:k5mac:src:lib:krb5:keytab:file
-       c ktf_add.c   -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_add.c.o
-       c ktf_close.c   -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_close.c.o
-       c ktf_defops.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_defops.c.o
-       c ktf_endget.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_endget.c.o
-       c ktf_g_ent.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_g_ent.c.o
-       c ktf_g_name.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_g_name.c.o
-       c ktf_next.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_next.c.o
-       c ktf_ops.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_ops.c.o
-       c ktf_remove.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_remove.c.o
-       c ktf_resolv.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_resolv.c.o
-       c ktf_ssget.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_ssget.c.o
-       c ktf_util.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_util.c.o
-       c ktf_wops.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_wops.c.o
-       c ktf_wreslv.c  -i :::::include -i :::::include:krb5 -i {CIncludes} -o ktf_wreslv.c.o
-
-files Å.c
-
-# krb
-#buildprogram all -e
-       directory gnu:k5mac:src:lib:krb5:krb
-
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c addr_comp.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o addr_comp.c.c.o
-c addr_order.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o addr_order.c.c.o
-c addr_srch.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o addr_srch.c.c.o
-c auth_con.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o auth_con.c.c.o
-c bld_pr_ext.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o bld_pr_ext.c.c.o
-c bld_princ.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o bld_princ.c.c.o
-c chk_trans.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o chk_trans.c.c.o
-c compat_recv.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o compat_recv.c.c.o
-c conv_princ.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o conv_princ.c.c.o
-c copy_addrs.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_addrs.c.c.o
-c copy_athctr.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_athctr.c.c.o
-c copy_auth.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_auth.c.c.o
-c copy_cksum.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_cksum.c.c.o
-c copy_creds.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_creds.c.c.o
-c copy_data.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_data.c.c.o
-c copy_key.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_key.c.c.o
-c copy_princ.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_princ.c.c.o
-c copy_tick.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o copy_tick.c.c.o
-c cp_key_cnt.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o cp_key_cnt.c.c.o
-c decode_kdc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o decode_kdc.c.c.o
-c decrypt_tk.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o decrypt_tk.c.c.o
-c encode_kdc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o encode_kdc.c.c.o
-c encrypt_tk.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o encrypt_tk.c.c.o
-c faddr_ordr.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o faddr_ordr.c.c.o
-c free_rtree.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o free_rtree.c.c.o
-c gc_frm_kdc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gc_frm_kdc.c.c.o
-c gc_via_tkt.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gc_via_tkt.c.c.o
-c gen_seqnum.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gen_seqnum.c.c.o
-c gen_subkey.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gen_subkey.c.c.o
-c get_creds.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o get_creds.c.c.o
-c get_in_tkt.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o get_in_tkt.c.c.o
-c in_tkt_ktb.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o in_tkt_ktb.c.c.o
-c in_tkt_pwd.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o in_tkt_pwd.c.c.o
-c in_tkt_sky.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o in_tkt_sky.c.c.o
-c init_ctx.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_ctx.c.c.o
-c kdc_rep_dc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o kdc_rep_dc.c.c.o
-c krbconfig.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krbconfig.c.c.o
-c mk_cred.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_cred.c.c.o
-c mk_error.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_error.c.c.o
-c mk_priv.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_priv.c.c.o
-c mk_rep.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_rep.c.c.o
-c mk_req.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_req.c.c.o
-c mk_req_ext.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_req_ext.c.c.o
-c mk_safe.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_safe.c.c.o
-c parse.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o parse.c.c.o
-c pr_to_salt.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o pr_to_salt.c.c.o
-c preauth.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o preauth.c.c.o
-c princ_comp.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o princ_comp.c.c.o
-c rd_cred.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_cred.c.c.o
-c rd_error.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_error.c.c.o
-c rd_priv.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_priv.c.c.o
-c rd_rep.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_rep.c.c.o
-c rd_req.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_req.c.c.o
-c rd_req_dec.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_req_dec.c.c.o
-c rd_safe.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rd_safe.c.c.o
-c recvauth.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o recvauth.c.c.o
-c send_tgs.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o send_tgs.c.c.o
-c sendauth.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o sendauth.c.c.o
-c srv_rcache.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o srv_rcache.c.c.o
-#jfm test driver
-#c t_kerb.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_kerb.c.c.o
-c t_walk_rtree.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_walk_rtree.c.c.o
-c tgtname.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o tgtname.c.c.o
-c unparse.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o unparse.c.c.o
-c walk_rtree.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o walk_rtree.c.c.o
-
-
-
-
-
-
-#buildprogram all -e
-#JFM using a posix open function, need a posix library (Hacked system header for that)
-directory gnu:k5mac:src:lib:krb5:rcache
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c rc_base.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rc_base.c.c.o
-c rc_conv.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rc_conv.c.c.o
-c rc_dfl.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rc_dfl.c.c.o
-c rc_io.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rc_io.c.c.o
-c rcdef.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rcdef.c.c.o
-
-
-
-
-
-#buildprogram all -e
-directory gnu:k5mac:src:lib:krb5:free
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c f_addr.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_addr.c.c.o
-c f_address.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_address.c.c.o
-c f_ap_rep.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_ap_rep.c.c.o
-c f_ap_req.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_ap_req.c.c.o
-c f_arep_enc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_arep_enc.c.c.o
-c f_auth_cnt.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_auth_cnt.c.c.o
-c f_authdata.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_authdata.c.c.o
-c f_authent.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_authent.c.c.o
-c f_chksum.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_chksum.c.c.o
-c f_cred.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cred.c.c.o
-c f_cred_cnt.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cred_cnt.c.c.o
-c f_cred_enc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cred_enc.c.c.o
-c f_creds.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_creds.c.c.o
-c f_enc_kdc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_enc_kdc.c.c.o
-c f_enc_tkt.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_enc_tkt.c.c.o
-c f_error.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_error.c.c.o
-c f_kdc_rp.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_kdc_rp.c.c.o
-c f_kdc_rq.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_kdc_rq.c.c.o
-c f_keyblock.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_keyblock.c.c.o
-c f_last_req.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_last_req.c.c.o
-c f_padata.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_padata.c.c.o
-c f_princ.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_princ.c.c.o
-c f_priv.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_priv.c.c.o
-c f_priv_enc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_priv_enc.c.c.o
-c f_pwd_data.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_pwd_data.c.c.o
-c f_pwd_seq.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_pwd_seq.c.c.o
-c f_safe.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_safe.c.c.o
-c f_tckt.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tckt.c.c.o
-c f_tckts.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tckts.c.c.o
-c f_tgt_cred.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tgt_cred.c.c.o
-c f_tkt_auth.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tkt_auth.c.c.o
-
-#JFM using a posix open function, need a posix library to continue
-#buildprogram all -e
-directory gnu:k5mac:src:lib:krb5:os
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c an_to_ln.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o an_to_ln.c.c.o
-c ccdefname.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ccdefname.c.c.o
-c def_realm.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o def_realm.c.c.o
-c DNR.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o DNR.c.c.o
-c free_hstrl.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o free_hstrl.c.c.o
-c free_krbhs.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o free_krbhs.c.c.o
-c full_ipadr.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o full_ipadr.c.c.o
-c gen_port.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gen_port.c.c.o
-c gen_rname.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gen_rname.c.c.o
-c genaddrs.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o genaddrs.c.c.o
-c get_krbhst.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o get_krbhst.c.c.o
-c gmt_mktime.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o gmt_mktime.c.c.o
-c hst_realm.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o hst_realm.c.c.o
-c init_os_ctx.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_os_ctx.c.c.o
-c krbfileio.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krbfileio.c.c.o
-c ktdefname.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ktdefname.c.c.o
-c kuserok.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o kuserok.c.c.o
-c localaddr.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o localaddr.c.c.o
-c locate_kdc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o locate_kdc.c.c.o
-c lock_file.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o lock_file.c.c.o
-c macsock.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o macsock.c.c.o
-c mk_faddr.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o mk_faddr.c.c.o
-c net_read.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o net_read.c.c.o
-c net_write.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o net_write.c.c.o
-c osconfig.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o osconfig.c.c.o
-c port2ip.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o port2ip.c.c.o
-c read_msg.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o read_msg.c.c.o
-c read_pwd.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o read_pwd.c.c.o
-c realm_dom.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o realm_dom.c.c.o
-c sendto_kdc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o sendto_kdc.c.c.o
-c sn2princ.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o sn2princ.c.c.o
-#JFM Test program
-#c t_std_conf.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_std_conf.c.c.o
-c timeofday.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o timeofday.c.c.o
-c unlck_file.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o unlck_file.c.c.o
-c ustime.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o ustime.c.c.o
-c write_msg.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o write_msg.c.c.o
-
-
-directory gnu:k5mac:src:lib:krb5:posix
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-#JFM fork
-#c daemon.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o daemon.c.c.o
-c getuid.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o getuid.c.c.o
-c memmove.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o memmove.c.c.o
-c strcasecmp.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o strcasecmp.c.c.o
-c strdup.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o strdup.c.c.o
-c strerror.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o strerror.c.c.o
-c syslog.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o syslog.c.c.o
-#JFM not needed, I think
-#c vfprintf.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o vfprintf.c.c.o
-#c vsprintf.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o vsprintf.c.c.o
-
-
-#
-# error tables
-#
-directory gnu:k5mac:src:lib:krb5:error_tables
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c init_ets.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_ets.c.o
-c krb5_err.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o krb5_err.c.o
-
-
-#
-# profile
-#
-directory gnu:k5mac:src:util:profile
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i : -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c prof_file.c -d _MACINTOSH -i : -i :::::include -i :::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_file.c.o
-c prof_init.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_init.c.o
-c prof_parse.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_parse.c.o
-c prof_section.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_section.c.o
-c prof_tree.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o prof_tree.c.o
-c test_parse.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o test_parse.c.o
-c test_profile.c -d HAVE_STDARG_H -d _MACINTOSH -i : -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o test_profile.c.o
-
-       files ::util:profile:Å.o
-
-
-
-#
-# Build the libkrb5.a
-#
-cd gnu:k5mac:src:lib:
-delete libkrb5.a
-lib -o libkrb5.a ¶
-       ::util:profile:prof_file.c.o ¶
-       ::util:profile:prof_init.c.o ¶
-       ::util:profile:prof_parse.c.o ¶
-       ::util:profile:prof_section.c.o ¶
-       ::util:profile:prof_tree.c.o ¶
-       `files :krb5:ccache:stdio:Å.o` ¶
-       `files :krb5:os:Å.o` ¶
-       `files :krb5:rcache:Å.o` ¶
-       `files :krb5:free:Å.o` ¶
-       `files :krb5:error_tables:Å.o` ¶
-       `files :krb5:asn.1:Å.o` ¶
-       `files :krb5:ccache:Å.o` ¶
-       `files :krb5:ccache:file:Å.o` ¶
-       `files :krb5:keytab:Å.o` ¶
-       `files :krb5:keytab:file:Å.o` ¶
-       :krb5:krb:addr_comp.c.c.o ¶
-       :krb5:krb:addr_order.c.c.o ¶
-       :krb5:krb:addr_srch.c.c.o ¶
-       :krb5:krb:auth_con.c.c.o ¶
-       :krb5:krb:bld_pr_ext.c.c.o ¶
-       :krb5:krb:bld_princ.c.c.o ¶
-       :krb5:krb:chk_trans.c.c.o ¶
-       :krb5:krb:compat_recv.c.c.o ¶
-       :krb5:krb:conv_princ.c.c.o ¶
-       :krb5:krb:copy_addrs.c.c.o ¶
-       :krb5:krb:copy_athctr.c.c.o ¶
-       :krb5:krb:copy_auth.c.c.o ¶
-       :krb5:krb:copy_cksum.c.c.o ¶
-       :krb5:krb:copy_creds.c.c.o ¶
-       :krb5:krb:copy_data.c.c.o ¶
-       :krb5:krb:copy_key.c.c.o ¶
-       :krb5:krb:copy_princ.c.c.o ¶
-       :krb5:krb:copy_tick.c.c.o ¶
-       :krb5:krb:cp_key_cnt.c.c.o ¶
-       :krb5:krb:decode_kdc.c.c.o ¶
-       :krb5:krb:decrypt_tk.c.c.o ¶
-       :krb5:krb:encode_kdc.c.c.o ¶
-       :krb5:krb:encrypt_tk.c.c.o ¶
-       :krb5:krb:faddr_ordr.c.c.o ¶
-       :krb5:krb:free_rtree.c.c.o ¶
-       :krb5:krb:gc_frm_kdc.c.c.o ¶
-       :krb5:krb:gc_via_tkt.c.c.o ¶
-       :krb5:krb:gen_seqnum.c.c.o ¶
-       :krb5:krb:gen_subkey.c.c.o ¶
-       :krb5:krb:get_creds.c.c.o ¶
-       :krb5:krb:get_in_tkt.c.c.o ¶
-       :krb5:krb:in_tkt_ktb.c.c.o ¶
-       :krb5:krb:in_tkt_pwd.c.c.o ¶
-       :krb5:krb:in_tkt_sky.c.c.o ¶
-       :krb5:krb:init_ctx.c.c.o ¶
-       :krb5:krb:kdc_rep_dc.c.c.o ¶
-       :krb5:krb:krbconfig.c.c.o ¶
-       :krb5:krb:mk_cred.c.c.o ¶
-       :krb5:krb:mk_error.c.c.o ¶
-       :krb5:krb:mk_priv.c.c.o ¶
-       :krb5:krb:mk_rep.c.c.o ¶
-       :krb5:krb:mk_req.c.c.o ¶
-       :krb5:krb:mk_req_ext.c.c.o ¶
-       :krb5:krb:mk_safe.c.c.o ¶
-       :krb5:krb:parse.c.c.o ¶
-       :krb5:krb:pr_to_salt.c.c.o ¶
-       :krb5:krb:preauth.c.c.o ¶
-       :krb5:krb:princ_comp.c.c.o ¶
-       :krb5:krb:rd_cred.c.c.o ¶
-       :krb5:krb:rd_error.c.c.o ¶
-       :krb5:krb:rd_priv.c.c.o ¶
-       :krb5:krb:rd_rep.c.c.o ¶
-       :krb5:krb:rd_req.c.c.o ¶
-       :krb5:krb:rd_req_dec.c.c.o ¶
-       :krb5:krb:rd_safe.c.c.o ¶
-       :krb5:krb:recvauth.c.c.o ¶
-       :krb5:krb:send_tgs.c.c.o ¶
-       :krb5:krb:sendauth.c.c.o ¶
-       :krb5:krb:srv_rcache.c.c.o ¶
-       :krb5:krb:tgtname.c.c.o ¶
-       :krb5:krb:unparse.c.c.o ¶
-       :krb5:krb:walk_rtree.c.c.o ¶
-       :krb5:posix:getuid.c.c.o ¶
-       :krb5:posix:strcasecmp.c.c.o ¶
-       :krb5:posix:strdup.c.c.o ¶
-       :krb5:posix:syslog.c.c.o
-
-#jfm not sure what to do with this yet
-#      
-
-
-
-#
-# crypto
-#
-directory gnu:k5mac:src:lib:crypto
-delete Å.c.o
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c cryptoconf.c -d _MACINTOSH -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o cryptoconf.c.o
-c des_crc.c -d _MACINTOSH -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o des_crc.c.o
-c des_md5.c -d _MACINTOSH -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o des_md5.c.o
-c raw_des.c -d _MACINTOSH -i :des -i :md5 -i :md4 -i :crc32 -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o raw_des.c.o
-
-
-#
-# crc32
-#
-directory gnu:k5mac:src:lib:crypto:crc32:
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c crc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o crc.c.o
-c crctest.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o crctest.c.o
-
-
-#
-# des
-#
-directory gnu:k5mac:src:lib:crypto:des:
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c cbc_cksum.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o cbc_cksum.c.o
-c cs_entry.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o cs_entry.c.o
-c destest.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o destest.c.o
-c f_cbc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cbc.c.o
-c f_cksum.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_cksum.c.o
-c f_ecb.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_ecb.c.o
-c f_parity.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_parity.c.o
-c f_pcbc.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_pcbc.c.o
-c f_sched.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_sched.c.o
-c f_tables.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o f_tables.c.o
-c fin_rndkey.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o fin_rndkey.c.o
-c finish_key.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o finish_key.c.o
-c init_rkey.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o init_rkey.c.o
-c key_sched.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o key_sched.c.o
-c new_rn_key.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o new_rn_key.c.o
-c process_ky.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o process_ky.c.o
-c random_key.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o random_key.c.o
-c string2key.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o string2key.c.o
-c verify.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o verify.c.o
-c weak_key.c -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o weak_key.c.o
-
-#
-# md4
-#
-directory gnu:k5mac:src:lib:crypto:md4:
-delete Å.o
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::des -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c md4.c -d _MACINTOSH -i ::des -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md4.c.o
-c md4crypto.c -d _MACINTOSH -i ::des -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md4crypto.c.o
-c md4driver.c -d _MACINTOSH -i ::des -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md4driver.c.o
-c md4glue.c -d _MACINTOSH -i ::des -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md4glue.c.o
-
-
-#
-# md5 stuff
-#
-directory gnu:k5mac:src:lib:crypto:md5:
-delete Å.o
-for i in `files Å.c` ; ¶
-       echo c {i} -d _MACINTOSH -i ::des: -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c md5.c -d _MACINTOSH -i ::des: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md5.c.o
-c md5crypto.c -d _MACINTOSH -i ::des: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md5crypto.c.o
-c md5glue.c -d _MACINTOSH -i ::des: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o md5glue.c.o
-c t_mddriver.c -d _MACINTOSH -i ::des: -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o t_mddriver.c.o
-
-
-
-#
-# os, done
-#
-directory gnu:k5mac:src:lib:crypto:os:
-delete Å.o
-for i in `files Å.c` ; ¶
-       echo c {i} -d HAVE_SRAND -d _MACINTOSH -i ::::include -i ::::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-c rnd_confoun.c -d HAVE_SRAND -d _MACINTOSH -i ::::include -i ::::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o rnd_confoun.c.o
-
-
-#
-# libcrypto
-#
-cd gnu:k5mac:src:lib:
-lib -o libcrypto.a ¶
-       `files :crypto:Å.o` ¶
-       :crypto:crc32:crc.c.o ¶
-       :crypto:des:cbc_cksum.c.o ¶
-       :crypto:des:weak_key.c.o ¶
-       :crypto:des:cs_entry.c.o ¶
-       :crypto:des:f_cbc.c.o ¶
-       :crypto:des:f_cksum.c.o ¶
-       :crypto:des:f_ecb.c.o ¶
-       :crypto:des:f_pcbc.c.o ¶
-       :crypto:des:f_sched.c.o ¶
-       :crypto:des:f_tables.c.o ¶
-       :crypto:des:f_parity.c.o ¶
-       :crypto:des:fin_rndkey.c.o ¶
-       :crypto:des:finish_key.c.o ¶
-       :crypto:des:init_rkey.c.o ¶
-       :crypto:des:key_sched.c.o ¶
-       :crypto:des:process_ky.c.o ¶
-       :crypto:des:random_key.c.o ¶
-       :crypto:des:new_rn_key.c.o ¶
-       :crypto:des:string2key.c.o ¶
-       :crypto:md4:md4.c.o ¶
-       :crypto:md4:md4crypto.c.o ¶
-       :crypto:md4:md4glue.c.o ¶
-       :crypto:md5:md5.c.o ¶
-       :crypto:md5:md5crypto.c.o ¶
-       :crypto:md5:md5glue.c.o ¶
-       `files :crypto:os:Å.o`
-
-==========================================
-# Error code compiler
-# for the ".et" files
-# punt on building the error compiler
-cd gnu:k5mac:src:util:et:
-files
-
-
-==========================================
-# kinit compilation
-#
-cd gnu:k5mac:src:clients:kinit:
-delete Å.o
-for i in `files Å.c` ; ¶
-       echo c {i} -d HAVE_SRAND -d _MACINTOSH -i :::include -i :::include:krb5 -i {CIncludes} -o {i}.o ;¶
-end
-
-       c kinit.c -d HAVE_SRAND -d _MACINTOSH -i :::include -i :::include:krb5 -i gnu:MPW:Interfaces:CIncludes: -o kinit.c.o
-       Link     -t MPST -c "MPS " -sym on ¶
-               :::lib:libkrb5.a :::lib:libcrypto.a :::util:et:libcom_err.a ¶
-               {CLibraries}"StdClib."o ¶
-               {Libraries}"Runtime."o¶
-               {Libraries}"Interface."o¶
-               -o kinit  kinit.c.o
diff --git a/src/mac/libraries/KerberosHeaders.pch b/src/mac/libraries/KerberosHeaders.pch
new file mode 100644 (file)
index 0000000..4d15b16
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ *     KerberosHeaders.pch
+ *
+ *     Script to generate the 'MacHeaders<xxx>' precompiled header for Metrowerks C/C++.
+ *  Copyright © 1993 metrowerks inc.  All rights reserved.
+ * Modified for Kerberos5 Mac port to include compile options
+ */
+
+/*
+ * Add the compile flag switches for kerberos compile
+ */
+#define _MWERKS
+#define _MACINTOSH
+#define SIZEOF_INT 4
+#define SIZEOF_SHORT 2
+#define HAVE_SRAND
+#define NO_PASSWORD
+#define HAS_LABS
+#define ENOMEM -1
+#define ANSI_STDIO
+typedef unsigned int size_t;
+#define _SIZET
+#include <unix.h>
+#include <ctype.h>
+
+#define PROVIDE_RSA_MD4
+#define PROVIDE_RSA_MD5
+#define PROVIDE_SNEFRU
+#define PROVIDE_DES_CBC_CKSUM
+#define PROVIDE_DES_CBC_CRC
+#define PROVIDE_DES_CBC_MD5
+#define PROVIDE_RAW_DES_CBC
+
+typedef int datum;
+
+//jfm need to reimplement
+#define mktemp(a)
+
+enum {
+ENOENT,
+EPERM,
+EACCES,
+EISDIR,
+ENOTDIR,
+ELOOP,
+ETXTBSY,
+EBUSY,
+EROFS,
+EINVAL,
+EEXIST,
+EFAULT,
+EBADF,
+ENAMETOOLONG,
+EWOULDBLOCK,
+EDQUOT,
+ENOSPC,
+EIO,
+ENFILE,
+EMFILE,
+ENXIO
+};
+
+/*
+ *     Support for automatically naming the precompiled header file ...
+ */
+
+#ifdef __cplusplus
+ #ifdef powerc
+  #pragma precompile_target "MacKrbPPC++"
+ #else
+  #pragma precompile_target "MacKrb68K++"
+ #endif
+#else
+ #ifdef powerc
+  #pragma precompile_target "MacKrbPPC"
+ #else
+  #pragma precompile_target "MacKrb68K"
+ #endif
+#endif
+
+/*
+ *     Now just include the "MacHeaders.c" source file ...
+ */
+
+#include "MacHeaders.c"
+
diff --git a/src/mac/libraries/libraries.sit.hqx b/src/mac/libraries/libraries.sit.hqx
new file mode 100644 (file)
index 0000000..908e826
--- /dev/null
@@ -0,0 +1,947 @@
+(This file must be converted with BinHex 4.0)
+
+:$@aTBR*KFQPPFbjcDA3!8dP84&0*9#%"!*!$Vl)!!!&'!D*6593K!!3!!+qbFNa
+KG3,-!*!$&J*9$3d*BfCYT@GcFbkeC@&NCA*c,R"MD!#3$0lc!*!8,q3!N!6rN!4
+069"568e$3`%!V$aa3kadVFX!!!Vh!!&)(J!!!U%!!#bpaPYYPJ#3"LL5)d31)R*
+rKkJ-PCR5JDCZr6!i(cj0,*'q-fNB[MpeNT-k1m2GRCf"!$bXXrPA1"h[N@@E!Z4
+SQd*8rQZ,J!%SYa-9Sc,MkEjA2c6aDP"-$MLXdRQ#aY'*QE9F"qHP5,4l1[SM4G0
+cZB)KESD&U5eXJ)AYYl#"!Q1ZX&8SYY8f6,'fJMj26N[l15Sk3"Xfb+TXbT)LEqE
+rIJKqrflFB*L5E[irT#Ap'UkRC98brkYpI$Z4k*pH-PjU1'b0ZeK*%p(krIq[i2l
+j-F+jK%edl(BiRHFHjIY5dGqTXS,&2)0G`4iMmReklm*r!b%d$dF[%e1Y+HR89#Q
+QrA&amP4,jBi[1SG(qXk(Ki5d(m,&$R5F#,DF!ip#3INHh[dh@Qd-&G[bM,Y6LUh
+@HaFYl[Z(#&#DbQZ2lL&rFZ9KbD9N88FZ"bKfeJUS!Q*FZR5TV-D8E*`[&HXVd60
+'m!&@,[FZMHP$'90EUKP,aapMc)N[I)m5r`kPQ"Y,*akMc0"MmqFY(AH-*-[5(!S
+0eGHiG-)4bSbB&%[aT5FFiC6SZUC[-+9H"5EP[#Lc91ImQ2j0I!K#L5*b"kHkGfR
+P%B)cC)TADBBmH-a(YCd$qTKVbXV5M+iPC)9ESd-**HE5ir+#F*i@CZ5P5DjbABk
+0q*!!D031MU0UC)CCR)$%%j(6'B8c2qHCIkYP%AZ#Q3$YdG2j5B'UmMmmrKp,VN2
+lprp9rX12(A3Hd%NI*MUV9#$dQ-FHUZ2($MYMrq$iFd!a1FEPrkXB4[kV(-Rr9cR
+jIrZ[SKhlVd)2,Xjf6rqaF-pD'#X`DE"8&KC['k5BfF*i#jYUB8S,QfeKDS%ThV3
+`MF#8pZq"23*6Hba-B@'p4QH%ZF1bef4Pm*,!$'&GfmKM*N2H9PP6h`F!N!-1Ufc
+V1q*qAQqAHC4r!bpMej[AQGQP1FQFb"fNI'!Vae0meq2j1Q,iV,i'ZXdFj1@j"qD
+NpaSi8MlU[1+CqER`lp*I2$[GNrKPpLkqAGThJM[0%`KJd&'!k1&Mq@U$cXZ[h'`
+Ri8+bG)3,Ei15I3!%!K#+,baJQjJ@Li9p2Tq#[h[iP*QhiqpMq+d4IhI!Rr0mShd
+(iEIpGQSdJPSX%YI$`8$$X8%e%$3H@rIBS#mpb4mBeU1mQNQDX6*ZaLE&%Pm4rr[
+b'm4iY4B[%TM`+QrmAhL"B1)[2-h3+VbKR,IZd9m-k&dc+@3d6jLN*U)($r$U'%r
+69+dY@1D0F(L6@T!!YZYkmTAcGZVL*Fb!(U[`JSB4-rbQfK`1*RTjA1m@)aMm,le
+$`C8)EU[HM&I@ZjVcM1E0q9V&H,(%+rPGbhMa@%*Im@HpM5hjA6mTDHVK5A%M4V5
+Zk%Gj3E0AM%kHcaHX`rI9kqirCacplClaAr6jQUl@lfSkaII`L)C8[4mmU6@4Q23
+edMH8iKXNi[['*-5#hqjkJI3K9e2'!hFq,hJqC@pm2akkf[HiHI4c2Pm9MEPfhkG
+p$e`iarI!48dqhpJhESVeFI1dN!"#qKMPkll(feIjMKKd"riqk(YFq3k,Kr`fk#(
+I-rMp'Ic[-rMp'Icq)rcf)r+rjQS@L,,DpphG9rYUR0K#Ur(rAkHr$EQQJIjrGqb
+hpZI#P[Fkp'H$b3re4M6Jef,4PPJb1RC$Al*QlH9KKI4b9Zi-)Cq$d90YT&Q[Sq&
+Ep`VUkaLe&P6@dr5`1b*,IL@S1c"U0DLYi@63LaI8j`9eX'mS9fKm3D'l"(8)Sd+
+Km3@&ILkS3aN9#Sd[+143UfLpmG9UcCTI#b@5N8bX6`TU0D2@D!Pr-'SD+p2"ZY3
+D4UeVdD0kSXf2CQB6&p3I#fTY*p@2qT!!Srj)81XBG@L,(mTQF`r8T`@eRP'V3Fh
+Q!UAq8&"hY'-0DXfpX6V8B6b(@[aaeG$0A!ip)kM$'E8+e,b`(I%EVa,8%EDZ#I4
+IJCbZ6JlYC#[%1Z!d&PAj*%%Gb5X+NYcd'ekk%ZV*JMU+8m(,Di4+q9P"hCRAKQK
+`1@T$[U,m4&"hi94dPeS`NI#("ULlFUUK4J1a5#C@k,T88%GcDX)dp'MVZ*a#c`V
+UEMccPJI98#C5'ZZTJVSlkM,HB-adHVZ0b*,[#qVV@GpAaeS0dRej#Re(82GJe'V
+-QrbjH%(pVU#q39"cACY,hC06$A@j(q3FpAZ#ZKFk"d)P-kMQC)qSK(T8j#1#fX#
+SpB5+B,9BB&-ReG(`a''#ZVG$$8Bce'9(1$9[(dDYSG6@S1Pe!!e2(#kSqc,U-%S
+0C66UL$3G,DK[l+Ck'S%k49$Ia+LeP"T43qQZFXhD+fS&pFeG9$f4VJiZp5dmKmL
+J+*pjNDDTJVUI3mePAMGeIr5(H&@DeU`Q-Udb8@LDS,k98@Xe,4"X8C2KG-+#1Pe
+3$f$8'NU0aE0G9"IeE6c@&JepH6MQL36UE%%G`kKeK*U,&Y3jJMUfLiT1*GfMl2A
+#c`6e3+iVS@*1kZQ+kR@XS"lN8"2"CGPXF"3k@#M8'SbLh8XVp-HG"A9F&p@-UMd
+02@+G+kL(L-aVMD0Vbf5H3ad[G#@GEcBECJRU""&V4&hCR-lbM[f@e3RUS5,@D'm
+1c428`aLeQP#cC5K&R5KL0E!ANBee[U!H,R3eJSP`ZcG9DR*U`k3ZUQPie*2[[99
+3Ma"CRQJ*UkfCQZFS0&RSQJMTmDbZMB*kT%2Yc6b(HT630@('M'`YGkK[&p6P'""
+PUFF,kY'FQZM['jB)kK5H3i6DecFie'1kU*Qq!G3Q3Ch+FiK3qrU'aB)kcD&Q-kp
+$ZpDC48dA#ZAk"LKdSU$1k+,Qq`D(1P0NAPrIi&#2&EVfp3dR#1SX%@ZqEiJd(5H
+SaiPBqrS'*iGQmlk"82[k"SFk4m6DecFie,P#elkq`G&eAKFeecGmq6j"R5qb[+p
+[F'BfM8,A[Vl"S4l[8(Xcla4"A5"dlHXE(1T#3HhV'j`jj5,-[NQ@Ui%)UFVC'9Y
+B&G6&M-SQ@&NXU(j"2B&6kB3iD1BQ)J&"AF+TS3#Cp14M28e3Qb`UR3pYSCjS8GX
+Rj02"cBD6X!Q!KpQm'JKN8SMSHVUJRXbSYBb+HA3QAahU+Bb+fE`D4p(,e5'(ZV5
+EQUY$$[984Ud$&C'5+CYA+81#kZqN*XffJ'UU&HTTRGN!+TC,-YRJ80@Z@2eD'ZY
+5QqeXd0TbkaiZ9E1cA$1bUa5%kZ`U"4L9E*D!QZqL('V3eT93mlSke*CZDLjI(@U
+VRAN!qN1"l03f)UKYA93cP-eAKkVEf8!h,(2Ci&"2Yr-9k[L0A-ecU+&ZDUlQ438
+eE1F3eLqD`c%Yj1@3!%10f05`QX$f5lV#ZY5SV9"FcG6*pG5BR80Nf*!!fF!!05D
+SFEYkJCTZP&qQ,V0e*G4m4A'S4LGeHF#Il`!FDX+Z+)5DDCC"M3ZUDHZD8&Yk*rS
+10@P66FdVA5p6fqh-)p4m,AHSbqeX-&[0E1m!kM*"AG&*$CQdZkP39f+l$'pSb%4
+2QGd&!YAC%MZ$8DY#CZp@"+B[cS6i(BaD'c*lYb*FkMXCY5jNYKLj(8)SG,@J[SY
+4Dd+Q%Bc%fMf0A1UlHDaN$S@#BV6Vk3fR*QG#I#DM9N-KdTPR*b*0#`4ePCd0k,j
+kjkmV"28pRGQ3!*qrZV'H*DM"D-$E)(*MIDp3U*@NALCI&`VUf5,@9Mp'SMh#)YD
+9J[Sq1epEr0(JLXadXc[@Fd6Qj5D1S#i5e(1&3VRU!+Sc9ck[LjU)T8H1,[9mN81
+*4'Ce#e4RD[YqN3eNA6fE$Fk8r3*"ACj0"jGkSG"eHAD8#UScQrm!pNZ*VQ35K8A
+X5,V&4TCr@P![BY3k5SdCm-l`DS0$[GL*0@&S2Be0LVUD8@[BR#H@(V)6ACh0b!r
+b@*[$JAbhM&L[%G32F9dCeHr9,e!r)kJIjV&LTZ3hX5bD6PK-p-m8e)m`DMe*1T9
+-$V40#3[UH`6e%Ui3%U%p*bbb`CQrIY5QaPI5S@0QmRfGS&jU+d5SCTYQENTc8+m
+Ae-ZXE+"8Vhe085ph&-UZBV[8+lUSQ6'E5lh585JlIR'T(q0eL&,c'lTAh##S(hF
+8bZDV5rf%Sj!!UDG(85RU99DXFD*2IRES8+rQ9,D!Q4N$JVT'8$rC559Ea*K99+L
+IiP5fYVNPeNph8[1aSP+H)kLIi96Ld1)h-$l)p+mGJRS0TlCUrKB$1ppTK4$VHB*
+kE5HeA9Fc3e&3caI8kbaU-%UQAY&dcA1Tec[8C(0Q[lcKLIF,kJfmSU"ccFqM3Ee
+!8'qdBc@aUj690ElZB%&G`bXPhIE3c"ACMNd6e!iH+i[6Mj'8epNd#qT0h93-%,e
+XZ%K3EqkQ*M`rJ'lU,Ca+TmTBLmM@KJm+kUdmml#23PEYpGC-,Ep&8'pMe1T)U(I
+T!,&q5&"[jjN(DRl-lP)rfaPVIN3-kSF&pA1-@J9UGKZ&8TeYqcXFUMHCTp4,"29
+1RRQ-QZR,1p6k,`MUjcYecBq)%HZPJ[S2M$S8(KfjNDL[ir3E"JRUA6c@1%D1QCk
+AaRU&S(k"kdSE`qci"EA"mF#ifkEkc4LN63pJ3EeG8,r)&6+`9C+[+*%QC`IV(Pj
+43-eA&-6k18(p8QHX[4@P1pClH@d!YEHL4*U#JRUI3qfY+*m3e2Yj$M%UF4r`DVN
+c,rpbTkkp&D9ES3HX(-+)*eFF%1XR"I8I16@"3@mIp91#qU#JBZdJ-cXmq9%Rmal
+LfC!!-0Vpc,(,b`CR-[F`c`CX0f6'`k`fr)1JIS96Np(H#YZaG-9U3IdU9fLj'NB
+2N!$TjU'3!$2"qLIii*!!E&$4jmAmiGcXm*f#qM9'CDi2@@8l6VlK+%&pK&2"*2Z
+[BFpAUH'*Q`Ae88BG2'hHJVb$#h,)FE4kM&(CE+-0HpJpNf@AqXm1&HeS@fCDjP#
+rEP'6iE"Ialj5CYEV8,r"-`p6LZbmFAhQ2Gj*pFGMKVFpi-Ek6CjjK'TNma98Ca[
+i@eaA-YZJbC!!QGRF*UK2@05)kBq%6$dG,+K1ll@@+i3JHfY$T1PGJ[TY4UfRFj3
+BA(Gk4LNZp6Xm9QK+R24dcdYXjZ$KJ[TGLdTfHR)eVq'*1`6eHiaD(8TLb5D@RP*
+5KGiYU0pRhQqef,&6`pR&@EMlr&C3ri9R(U'D[E2$"`6e5DiVU#%rbBG-jMQcqDH
+iVK&95hL,J)6DI*bclI%$AVd`EfM*l30hM,l2k3kIjY3SkP"ZEllMb&TRErk(A&G
+#cHemGaaCGk'J2X0MM5AbSbL5jBilhBpi0T!!LM`ZX`"2-Zp"3IdaMjAZB%85AUb
+J2L5S2h'ShM52+R5hS$l,Xi(@9Mr-ZM,9bk(q+kmST&G'HjLV+!m,kNqj3SRSZ2`
+D*LV++N(p'9H)G!baPS#DAKm!eGRfq$PA+"N0jmXAU'F*kR1X[PBP%jRqK&+A66j
+#8(r"&D,9**Z`b)D[#ZS[i4P(BN8APG5cLiFG4pBr,UMraUM%)dh$iU'@RAXp+UL
+riV'#'NKQjd1J2LDSce[8PBP`c+Y#T#TrqGH#qQZifZ%00FJ-S(HIFUfJrSC4U`h
+0ReqS4,ikf`1rlD55YCjAU2r1U&@J"PUmc6*+GEB(rX2@eHpeKKZS[b1ZT6$kQad
+dQY(S*CKIFQ*XA'[VVLK(1l2HrqpS5UfEUfS@F&1@2r!cTkIm2D2@cY9A"!0cLEY
+A9i`fpC,llk-Zcqcp*k-1AE3b$Vqi684+[A[G$S,k"dBG168@$HLQ(SZUBBJ&JEX
+M@(2E$rmSU#p`KDC-RppmHP$$2R"&S6mbDY9FE#TLpp@6b+@qb+M9maFZa[jJ4PQ
+AqK*Ak2JNGSF#F0%E8'JGS`kcUB[)S(dpZCZUq,LZdpZa@CT02CHU-1U3!1Q0M91
+ckCUL$V*L*D2S2mAk1LYIir&`F"%'L*9X8(EJ&@8'ZUjm4HQQ$ZBe$l)ZJK0jFfc
+&*V4,(F)9DQ6qP&km,R8SSpC6AE2Tje+V'(A(H6&6Ep%a5d(Cfi"eUG@F1Q9kSkU
+&@0dV8@Yi0NbC[L$BUP1rU()fe$,UL#R6&f1XY#KS4$C9GCGDab[PP,#1eZZ95UR
+81cQd8$2dq%CC8p3G'AA`r)96FX8V44h'Xf%UpMaLd8beG+R$'E@'&12Tk&,5!E[
+8%9cAUE&`c'K%2FH+ENRARAJ1,G(KH,Tm5`k0j!UKLc+0@+C*FDQMH(fG'i`QYpE
+AREP#dh39hAa@SEYI2%j3Gq'GcG5j*-mc4Fq0G9HZDb2'2#DmA$IV1TT6Me($i9J
+-bm!$e0dXAB2Y1PU!9c*[GalV0$d4QN@ma!CLI6fMlN)k'eTCTd3$8c%kJq'8%lK
+,hB-V0#-@TUhmCSAHB(94U!eEXha2(ZY-H-b4pDC-PVqd8P$hiV(13DHa0GB'hP2
+1L5e(DlkPTpbEGf`,i##3!$3b'HY5pl%U#RSSY6@6jLjeAekp'ZFXT*l#-j*4E32
+kKUmXFUK[j0Q!TND0rbNEhX3cEf'`G8i-`qM0@IjQhKdZ0''9V"S"8PNfGSHh2E0
+B80pLa8T9h9*4pZ1C4rUKh%c%THl2XccEi['+8Ve880r+-fp@e!cR-Yf0p3",)3`
+!YLVd0UZqkL[QBYRqP@`BBmfpN!$N@f[H@$E2UmD`DlE4I1M%8!qe)l&!q%BV"j,
+,!iKEc)3aD)Jb`AE%Va3ZfXT"220`JJ-CTAV8'amCjLKd-0GeCEZDRAT"emqHp49
+"(3H[Ie*IX5r(I+el`"hK,q`M&$U%k6U%1-EPfRRS+ZD[bRLZ%0BLSl%X&VVH,45
+D`"5UBKXBf4b+,$PEa(TSC`k&pHCm$YdVBMh-TT,kQUejprrNC%'Gb+K$k1j!0KX
+3krf#HMM2"RTS45jI(jcj@d'Ga,*K-"cqmR-8C)2BLP#1B04U82f"jNc,"ZIi[39
+e-VrR`%LSBiJ6Z8IYZZG!1C,9"ZcedVXNXY5`f'9AMZ,Zqm6e2&FU%HY6J[TfIXm
+"8fKmM[UFS"l0BKf-@!Xjj-3k*HAdRqj%ZjcqP@2J[dm8`UBb08R-+03NpQb8UCh
+95c@bGHM'4dB1&V9K'Zq(B)5Cak)1I9Y3Tc0(r#Sie)mjC&bfjUfpA(Jj+c0FjhL
+[peTlKA"P9QCb+[S'!Xj4K41jFLc2KV!HdA0M#ZKkMp"eeJDAqJeSa&SPBMdZj6I
+[CIN9eB)kHi1hr3B`YUNQ#ZUFpFla29e[P`Hm-RH6YrekFVG,[6*[[Gpm*GEjQac
+a0mCkM+"brpI"F&IYRI9f158Vh2q9H,+13Hq!LbifX4'VF!GAZ2rVB$K!&f)9([$
++3YjlYF$a*CcV[@iCFE1S+)XkhDB,#Xd8X5lQ[CHe'HPe!1UJFB*kJZdcPfqLL+j
+L4epCNR*q5RIcAFj25K22"Xh%D$1A$9H&6a6CF#+,&6G-Q2PXk(ET8%lD1K%4XCl
+-BUh@`N%eLN@fE0p`VBMe&0ih*(&+KjNCc*%Xri')G5QMe[&*k[4PbFV1`DRfRQJ
+q'G`p8FAI[C'@br)R"28dGfFZQ`hI&&5eDimYQqAGX6Ecf3CbU'F[amUK#hiUXN(
+M9'430XG"rGbaF`3e`1X3I0rbJj3ePaliN!#J"RRAQc36G![EbiEc4cdTU#fm$[%
+Gad`GD[K@RD#fXPSq%P2!49-EXC85L88hE0UX@A[Cjd81Y6(Ud-A6'KZ2b@IHC9m
+89*e4KdpKMXG0iCi9$&"[%Y66'E9qCY#FZh*@)i(hG,fAL3e#*E4eRLHb)Bb,4%M
+0)j1H2JGSCp)6BG4D5ZhG,rq5S%BGDYB%(P6K@+$%'*9F-8*25%N[Q))U0Z#91+2
+Z5+RBYD9jpc+hBlqcIb'Sbab&-RBE[SkQNi4[Y'+imb&[Ne@lFT5J*KKe',Zp+),
+bJ0f)6CGU1&-PNmH+"IJqpj%VKGqKNZ48lN6q#VAGU3hC6Jm+h5qSbe-9aD0f9C3
+96+&4Q!k05HMajM(%"-l3@pZkSiC#iUS!C5@MeS[lPATQ0QZGQFdCM!UR,M-)j`b
+[Ch0MI3II(jSbEq'XK[h'krXh6"dlGFEF3bI1(MY(llaYDFdM0`K2"H@GM$TblK,
+'@T!!a&)9mYC"8ZSe6Yr`,YkrBJ-MD,5S@Y$&@G6hcR%UjEZj3Q54!N!@-*A+9HJ
+DCbCk*U-1AcKVrZ+QMBTDe1Z%aibb#YI&i1dFd"0aBZ&%-Kdc5pA%9TZS,TJi#TF
+1j6f-1T*5)qVT50UAQA4Uqi+JRX@SSh#DNKVADD3`23NDHVF,!5U+m%K6hXZS`cP
+e)j((ZNj3cfC8H1L'rCL*YQ3m2LmA2JI+qaLeRP"M1M(Ih94M85N936f(8iP(DLj
+Ba1VX!Cc,GD986Bh'SQfa$5iZ(C0MIa$8maLeKP+c2J*ZV1Fl9!LlQITqRN18DXC
+#`4i()Q5$m"*6,Z!9*@Q'rG&BQiV,LE!&Sm1TXU[,kCJF&mj2bS@i9iI8"PA6JM"
+*4+G(CT!$bLZY)k)*Pd6P!ibkSkSY5qT'd,-'Jd*$"28L6UAHTD#Q'c"N`rX%p@+
+E5Q@"XD9(G44DcA80"-0"'&0iZS*kVU"qN!"4DfPpcAX#G9%ra+MeP,Ua(Y[C-&4
+32mbS`iL6%,%66*m@J9LGrD'2-1S)8F[T`-,PZVAm%Ui3TfiNFS@FLIj(19A(iV'
+4lCGGkU@-1Kc,`'4P&UBJ3@f$Ca4d&9i4bQ@-ZK2YX,eXTE%kXrR,,B@Lbp,!MG3
+V'"Ap+kKC8cY3REf0+aN98pX%r'*bcKQDF0e62XCM$8e)iT51$"G8CfIZil`fN!"
+%p50Tr6fA@N'KBB,k#8EGeETAbDkBh5d%-NqiqbKAFB9)ljA,"TGkYD$Q"LQZ3Tp
+Ne#'p'85T`Q9+qC4&e9Xp,cC1(5QSRqEjfTYhP1T-P6l$U+chbMX+Abim2T9VZUM
+%EVC#[CCh'j5D#(UTje+[ic@28cd$@*Gk2HX1HGr3D,IclZM'lHC[B03U4Xh[(Ei
+SU$GQj`e1"0eAF5KVH*pR+C5H`b*IR9fPMJfGcFB*eZ4`Zk$He$2E5)&"[92-HQr
+HQJf#HNZkBeZIH9dGfkemASi4HhjHhR(D,hmUU,Ial3%GTEq`ebZSYh-IIGKQ`%!
+hH`&9iRKapCI#r9pV3B@VJRj'GSCY#LVhIiA6T1&AHeeq@`@9qlq5@'&%R[(H"V9
+08,Rr+iXejk`@DA+QdGcrP9&c$TU4*R(YKm,pAkP#[IHa0BPE1K6,rj95-mP!U1+
+L#iAl[e+&JXd`TXNS*1kP8,Mr+m[bM"%jSBTV*"6ZrdTec4QAJ@Td8Q(MYNUC1+J
+49hmF)jb#k#p&0bMlrBjr[d#UeCRVP'VqAF1rDrPh(ImHbVrVqIIVq2GSrVd,ral
+"[iHaEpmIL%m6IKr*rkq*l(MKHcIqqml%&36IZr2I&IipL(r6DSV[K@46$Ymlm0p
+IclrIaVrhi0p[i0pl%Km+I,q9rliArflJZ[b4rck+rrjlrRX9rpk4rpq,r2Gpq2H
+qa0%"hi2jll[blb'Fpa,rAXIrEfrqr8Eq[6pa-m$hQrM[EbEq#rM@b+B5[JmRfpM
+iIJ[rrq(mHcrq2C(XH12l!2ll'"l[Ia)A,Iaq#YNe`hFcfCI#Gi$Z-Q'(L@iR`8f
+'m2"p-0h5KamBFIV#pmh`a#Bhe0%1Tl1H&'m"l+EKFccdZ9[SH#Kq[aIIKj'0GU(
+I1,,[Mqm$b4iH[LH4IA*m(d%fa2&p#2l[2(b2*Ai(q*k!rcrlm0A+N@3c!i(H#8p
+SFVdGlH-k&5KH)@JrVV-m35pP-Rjr2MiD,Xc)2P4p9lIL(B6fipcrSGY4L2mT+B"
+qkE`VAQ4S2lS&*QA)1dXh(VqS&ldh)GU2ZMG+&A4l1hjr6Y3,9lIL9BVfSri+8SC
+kBHQAcV[LIBcfSqi,8SDmXh6MH@rRAH&#4rY4*`FC3pjjZK9[K,3IG@U3!%RS9Va
+5dRlmDNkjK'lj1bRY4pd2T!bk2362Gh+4T+YEm9*,qe'IJ[r@l@LZQkAI&1*QXNe
+(a%ee4*e1keLm(G0qp-)XQB@1a@Xfl8I[%j*#k'MeUkRqSh"ITrhSV&`+S+0d)!q
+,PhlDMmjcC4Cj@,`pe(l8Dd,UN!#(f6V5H`@TrDLrp&reqh[qHI1$`MfQpU01'M+
+*IVCi%DVpk(Dp9+)2,pbNDMqkFbq9d+e`&D[pk-k89%+h`PfZpU0E@e)*h3UA`GT
+[Y'a#Yq*YX[EE6IUJ'jp$@lS9Vk1ehqk[k6DGZ-Rp9EI(F'-(k5,jr0QZ%iAlE1h
+hqVrT*JQB[e[l$iH[Y[YT9mrLjEMffd2fS'H[IT@GRcI)'ZVIq[f6P(k&DhVYYkH
+dSAjEmc#qcf$V9VMRehjlZESGLqplb[V0),k1IplRQ!RHe0`mCLeZ-,'[BZl8XAK
+KX2hi,H,r@mGCq+l#ph(iVTBRk*Upa0Gqj1VarerAfF4a%Ypcm(ZY9%"AUrpbG5e
+HD@brIIkQUh`J6jr&M5,fTG5GHKE[4lEI[Y+"qM1AZ(ILHjjd)'qI`ZdXpKhC,q[
+FAj(iMHd5J(Sd(rSH)e1S5mAER1hhTVrT+ar3-phI&Dq'YYqEAp06QP"hLRG-fqm
+YdS,k+NR3YpcRi4Cqb89GYIE2qIkKT@ra0QcllIrDI'6lA#5Y9r%UEIZp9EUJPc8
+rFr8UhX0Y[`0N#hSTaa-Aj[KSTC&i1)XqKHpjf[P@Z-cEIQpcpE2m*,ESZ!Kkc-6
+h!ZJaHjZZd$%e6h0e,0i+EVmaNJ`G-eG)ffqX(%,(E&dThP0Z[`0P&rPB[2$FIJG
+*)h5djLXEkdVZGQcl(5aYd(%aF9G(rd,ea1p86qaGj1YNlUTYqif6AG5AiRhZpMY
+%LP%RFjGrffqm0+*[5GI*iJhcpTXJGkL6L2ZrmM*h*ERp$T9Ge*IL[IIf1db+85G
+c&l(CEk)8Sfr*hECZ[m-P'6TQVQfhhb6CKBkd(mlGrfkr)k34r9Hq2ZBZNVIIC#P
+'RFrG5'qr)k8Bp6&hYEhpMT*Ge"@UBqkQ32ZpA4U4MpDq!IFhXR8Npr"Aj[9(ZcT
++#[B0*UjLHZ'ElK[JQqiE6&cPk9G(p+[-kDG),[3VcHH2N9AS9d2dUmcPTmSYp#[
+h9G1N&[@M-SHI,VR3Vc4hRb'Vd)rf6j9jqdbT4IfVc0Q2P9VNAf@q2NYUNAq9HIT
+aXJVpUSPqP6RkE+P&rPAQjh1N&[@[-MHI+lR3Vc3[RbHek&mVFr,j8S[k9jQ20mS
+Yp#[h6mG,,HTIC4kq3'UKAf81[P$kS0mm@X%'@6kjG[qU"RU[-,,I)JlPmAVa-$q
+FFN#,hAJXri*822`'Sri'q`3j3Ri*r`*2IpbE"rq,N[j,AXNRjUG4LUGT5ccY%`B
+5rX4dIR*rBLXHq0$QEUd3lb6T3RkQpDTPHX(*XL$CbE))[H![UmCl,ehRla6CK&l
+prHK5@B4HGG!,f88FDrS81e8QS4HZ&-NH4@)p[dbLhN)[@2dA#X*TNSRmmZ0+[Ml
+"9)P%[GAD+XEbr%!YqB0Hk"Gc9`H*a`(b"lf)Ecrd+Xhh!a+*qNAd+Y@[S'a#Vrl
+qUd8LdFp!UX`Ck*f[96+K&bl1+ZM&Vl+43Y4EHTeFIlh9*4,p&fU"hqLIcj`ZQp#
+VIcl$Vlf93[3(-"0[*TIjpbN@PNMS&9B6j%Mr3SC&*",e)*ilXDRc4585r8(qS2l
+1&j0&k%AZY$$diR)AAP`L8Eq)AU9qI*P-3UrP!AqTJKN5LAkFk&9Df%T)*1TA3Qd
+TqjfD%JQp6+erf)'AP%Md-d5[dRbaA5*4Eme@Xcc$A5k6d![A&ZBZ1q0[KE4",hi
+RMDAAd*!!LIfNmL85+f84HZ&Dhmeqb'I))[5U$CQErC!!hb',d+X1&pVKl,I5T8c
+[P%AS942#(E#4@(Yr4ALA0#+rL2F"fR'MAHp6l0h5"EfXqbcir8&f[eLifXq'h5i
+Yd1X%FRrcIqX'cFMQCAqMF+CX3MId#pK3+IZ$VC*0k%EkKJ&IX2G)+A3,4J2p&e@
+F*D@S%kfN85[8LIG++I+YYIFiB[C`'i&F3MIdQ5hqD2S!91Hp6dV4"eAmJXk48Y5
+*5QGrVU4#Yd5XD""dRT5LRdJN5SHPR#pYd-hb3pPBPmQYUX8#phjTJQl8hr[m9Gh
+hACbrUVH[@&iZd"G)+HVFmV)4eSA5"YfXq4Zr4mfZFm50Jea%A9bJr)#d3,GApDU
+MHX8-h$,D*pK&XJLp@(iP$+f`rZ#l@,UJPeA(A,dklrJ[e0r9VqUe"(j)TdS"G,2
+kRP5H0BF$!jZ*(h4eQhVM)b-(Pr@EKZp[b`cdUf2kqIXR+Kq52ZMRe6QiB1!%H49
+hm2EPhiGP%A@ZRPl&6ID%YEk'l525!lf+rA'U6U!dYeF+h58FDYeA+hrSfmL"p06
+kU9!J2LU,k0Y3(iKHCTYQpM@DPdSMqNbQ9rqDRHmbD83I6r8URf4jZ@4#Vj)9c49
+bLAT30KDi8KDK9`h9UhbhhXIN%[@Jh)GpA#j4$dbpD12Kqi3m)VrLT"U8I*5ZNNE
+Sa8l++KN6A5f6d)YF,SMYl$kp2LQ0d)ZGY&A+Vdr**23Db+p25b2dDM'#3Eq"jH(
+#IY&RT!YkHA1`9XhIBZ#Zc')pZ1Be[8l%2X8YXJ,GfR@eC!KfVE4"0kmqi-D(h2R
+lRHmkD83pShSPQrXR#YG,)rTcE*S01"hH)*(),a0h1j6Uf)fb#,fBMhAZk([VVC&
+'j"I,,9J0&)iplT!!6HJ&Fk8q[@k56HL9+0j6Hl-d3LrU'JLMj'+rHiXdSTq"EcS
+jLP9[,44F3TFVk'AGdq2U94d*E6E'[Fh9kb5Z`d(iRGcI[fd2lQ6dkpG+"ISFk$K
+Ji#N[m#GjGHq0j0f!3GpRApA,bc2T`$bR#[U9hH&p[Xrp66p*J@lp,U3qhafb#Gh
+UQ'kP2FNlT3fkjHVFJ*(Ijp2pKI5KVaL+DmdV0Q-dDq8+I8@k6P6(B5a9fSEcqHj
+k4Dm@k%(ZhT3Ip2PdTDLmN!$r"9P%R`qpr'B-TDeSk(Dh0+,20q$0AZRc[bLpk21
+Kid#IIimdSXq(AJ0prTHN$rf2ebp$[i%qrelT4*p2G5[hq54Vj4*p2Y10A'VETph
+pdSNq(lS0p2PIPMl81HY1k29p"3`4+Shc!kjqfh`S8MSHJpp*((rh6I"d6F$8VU,
+V2dSVG2Ak3+)V,)(lrC)HP#ldJ9jG6aMYIN06YEC#LAb)3k84rKA9F&dZQI6K25a
+Gb$02Vf4dmm516%RN%(9KZ4V'C,HdIrV9er55"qacMR$VViSpSTJrh1qAp%r5KhV
+QkXEZ8LjAY+p*'qTC5LqS4HiN#aF2EAP%ZU$A5e5Hd5Qp"NqEYk!m,IIj(RAe'V6
+QN[[*I(%(rVd(rpjccGd[VF6h8[DllirmqdAqrh[clk,H"h$1'2iY,FKAYNrHKVX
+5#dk%MmNLkJ[6#dYVEB91qTqP#hTCFkEeHLA$BEq1fc%+%f"b&DlF3#pVAR%UlJ(
+(,XAkZ89D[aVXCjIGS(bqEdJIp22k2ZMRMmH-I[rEak8(qP(GV$Z65h8$HqC4[e(
+ZqliTUmJlZRG1bh3KmliPEHLh6k@A01h`XQi4dam*QASamClJ8%XR5aFHEbD[N4!
+$rI&DD8*H&1HBVRleG$mrPZKIdIqfG+(r5YFKXYrFSSH$HUb3!'pN'ZhSYHhqeVr
+S9XScGRp$ZIjr9aE4PeH(NVLi)&CdVI,j[LH0U!ZiP%F0PdpbqlidSErDdPF4hFb
+b[p+r5"YdmqSCG![j558Zj0Z6dSAkm$[Ilr'ekrTk&P'e42ma4AK2FHKZI%l(GE2
+QIRrD3p6AV,hX*U(RkIMpMQhj#&eE`Ihmbh-'jGD1dhlj8hbhiIr*cU3hlm(qFd[
+P8VdI5"rQ$Tjq8F`G+RGk2Le0k2HklLD(RJApDSPqP6XCIbKpd#pGjfYLL3%l%Gm
+cdS8kRmkhDM)E(&FkDp2h)qP$[I2QQr3ZNdLL2ppq,*[S"jPZr5j%2Yp2T"(c!MU
+cm`GLaERGXa`UAjKR@R[dUAN"f6[%iP2r[1"IT3[p"+ec9VdSp88eLHLiJB1fd10
++%[*[frb$6*4M,3'eD*cl-qP#[I2fE*,4m-$!jZI5"EfHT4QqFdU[UQ5L0,-RllP
+Z[HbpV2hAh&fpp-rc'QXr+c@hf9Brk,aQDlpA5fF$jBE[&p+'IXqkTh3R0cqa$j,
+8b`FlrC*$8rH8Z[(8B@00`d&0@Y&rjGqN$I8dT6rd#L6,[K5rNLlSjH9VBQ8L(1Z
+I+[Kmcl[jDY@YNGha$$A)(QXT(0q[C3[k+hlX'cmKkUfV@l@Kq3F1YrU0A%%hI*m
+'hEjjq1UmEZ3%KAlGILYYd1daZ['i8dUh+ZJ@D1QrLXARqhGAYbfq(0)!r9MG32`
+UqBDH6p'*mUJ0GFrI[hY%hRqiHPVcPa$A3h)`elAk0ha6I6[V)Y1hHB,G*icUeVF
+QEX6S+C)&L4AVlN5V6cL(AT*6RBURPXC6'MXSfqj#Y(4IcR9ZKpm(mD6TeD&dm,U
+blGl$,Kf3!&p8"r3I&p&,6@T51X#h#cU8,#)8kil$EA1[9r0L4kS(qQj6lldp4GP
+fTq'VHF(bXf4$S9Mh&mS$mZ+Mp$+,@NbJZ[XY1-'9bk"25GeAQ2+YXA5`I'T@GM5
+XRBM[frLmkB`eDkmN1PVkV##r)dr5ZJbMjQ2q#!ij9PYcZD+NlLJXkQ,jj9MkE0)
+&I9'8AZ`iC(fqB-fPiY1LT1iPl)dAS"CkSHRJpI(bqkMlilAZ(E4dYq*0j4Z*-i$
+BGZQ1FjFTmaE1DYK[[,jr`p5a8fI-2A6Ll,&cG(j8VK-R[j[10m0hl%cdi-Uj(3f
+qKfGcGbrdNJm[1ZKLiZ'IMR2Nh#8XZJA*+"emEJb5`2LpFq6pccL(,j`eIh&6ANN
+1irHSqH#rH$(T-bIFq)M[SGpBVX($I3qpe,$d*I4p*-lJbh(@cBUD3D0&eB,C'#Q
+-hd1([1Pm$iq`A'T1mcfm'p[Xm[*c,Qj&3BK-8*US2IR*ljMVHK[MY2VqAE[Mh$Q
+J*q,%(T)d"6MFA$@6Qb`8P03pE0[[a,(Um3hSjer%prAiASI['p'rU(rG6lEf5Pa
+p4e*p)qVTD#kbkJ+fr@ifqB#1e[c#eA&8+aUMZ%kc&*B,382[f6"4V$[DV2P&1Lq
+'mhMbX9$Bp[[@T!RjMA[r`[lQC%Y,iAiRCIZpDp)%(HZ*MM'GR#lBfrXTfqpINbI
+S5'i&+bHNX[dH0[Q!MTDrAkSq8Kde04U,YX9bhL#+G4rEpMfZ[q[*jU2(GZqR3C!
+!G(l@8&e,'al+p[[CT!PeKZQ)JPR8FIXpEI)"(DdpJP6r3R8dBk&JRq1EiYlACZr
+Y5bIbFZHN'IC(BfeUSXhIVSCeA!bdDADQE,qh66kJSq@hPZUh98d,iY`@6*!!bAk
++kIR$+kRlfflQqYc8-6PmTa3J6pGJAP)PG,i&hmhilN"mlIp(Gf8bILFl8CD[K+[
+rMUUf,+NE`D+jYC+kidfDSAp'GhV(&h3[$(f9e$e`-K$GDC($58GpZUIZLT0qk$i
+U%!`(XDMDAqG6pmP*2h5[TA24dQD$NVT[6Tl4hqb)@El2Yr[kq46926m*jV$8AA5
+Hl[+"1EKdS3i-)rjhj(#9PV#D0he@8RI@b62UAhUH2N,-df'p0X&6AV(ZYH2aHAP
+8cq2*ad*KeKeedT!!2U*HMa"RQ[j13NRGB5Ipd(fi(JhSe1%X%Y4b(Up+kTilkBI
+Z1p(pY'+h$&MU,M`*5*f,,LY)cQ#Tqr+N(lVMcLASAMT`3dRGU5I2d$dprkd+68M
+!5DPr)9j*hEXRfCMr3TqdrM@K#FPS1318e2emmJhp[EN)DH6pD1VpVH&NIKmjGBq
+Ip+2HliTpG3e,f&D[ikfQ++QlrZ3II3lC[k[d1DRl!18JZTFAh*A8RB(5$pf($(4
+hJ+AZ&C5!k+khpYm@3@#TZ`HP(lTA$A5cJ+AZ*j4qk-lf#dYhN5UT1`aP)EU6NaR
+lG%rGFbMrf1ZKZLH#a8C@5Gf$+2qBch,GL`FP+UPl%Z8CZPYqID2GI)HE[Bipfc1
++HecElPf6"rM6ZRVK[Kc$VjEZ*P6N$IHYjI)-j`EhhcqVE,Y[69UJ&mZcNMqkXZf
+ZYIqPercR0qY9ZUG)5Gfc*LR3+r$d3$dSRaZX5",Z9b[T98he+TdVU@bjAqhrkVA
+beS&k%'`1&`mE8#3*GkZ9p+,j96ih@*%Nh+e@dS[@Vl*4YC+k@de5S0IUJfbpm!B
+GHYr4X%E$K',TpBdc`Y6a$ImcdHI6jX%JIPAMR!4h@b0[-*PF$@TF''aGYmlqTch
+`IqH4rb&Urcm0N!0MCQfPE'PLDh*L05keFR-ZF'0S!*!-H-3!N"%@!!"DaJ#3"2q
+3"%e08&*0680$!3#X2(&$V(5Y``!!#X`!!4VU!!!#M3!!*qA'hKK@!*!'EiXM4!i
+LFYp(9)E+61P!8lGq'*`2RhFXNEj6NA[lp0k&[MpeNT-k1m2GRCf"!(c-SRIal[I
+)XNd"FTci%k,b*bd#"U$F6P5-bSbRqelpd-5V36%ji+j+j`ND4bGQeR)GR*FLdHl
+Tk)m86FrP#SDi'4DQYV!"&VEI`JB+M,R#9U(B9YX`aGS+qM`j,HhRU1J!EGJJUl)
+T5iUmQIrl)IMpZh'$B8UkqIq3!*EdDlLHPPA*r+rfmHe%SRpkbALTiE!elQ)P686
+VprqrJ[[Ra`MR%ME4XG[KG*jlP1p,4AqRbJS@m`af"AZ-b)Y&j!%K0!p(,a06V5R
+Te&3TT[eaFI*85q@1,cU(4rV1KiH%Y"r#a3jdR!LfR!123N(j(Ylp0eTY$"AEmSb
+l8iUYeRXA,HllK`K3QXTVMqiKIh,PBFQPC&&(,JFSGYD08!A%Z(6T8PQ0+GNiAbV
+@9k*RM1!$$1kVa*JqP$'eTCUaG2`aaTci`[FSmHp3LVQaG1)abJ`p0RrHdR((5,)
+XcD(38(f05bFFSFb)5E%8AhV#%8k*VQ[k"P2U9@"5cSXb5hA1MqRIa)FJP#JLGh#
+UHjG@(L%i3kCiP@E)JmGm90XjS)qjTU`XcHKD3PDi06U88')Z&61Q'KP-&RFGm86
+NG%EKc-pjjYpUfDkHB#C!Hr3HIP+JD[%Airqp(&hAmqprP[b((c[S[)U62Nad9UP
+!k)@1296(haTfa[l"mHH!BR+-brmX-Bcm,$Q5rePbm[rfXd3lpV1%AP'FlClq11'
+HY6"@B0*JU5`XhMC)-E1&m4BfeF+8&MEE`Y3#8hc0`M3@GYM#pJK-pD+&+5cXl1L
+--(GBpTUX$&i5Q#'XDaYjc'6)fbTVk[X!N!-1UfbcJC-k,hZ[bcc+,hX[cq[0cf`
+3HaYNRThF3FV2E19ik[IbGF6`@GI91mR-br*XB1GJ1FrV[Fl6lD#hLjpG6KCeAmG
+r13IXYRhmXS'h1((4"JPhTbN3`+!,)(Vif%4YNP+[kcIE6lK`3)l$)`Z"K#m!C!'
+J"e"B!%#0p-9LBBr(Sq$r34lP`![arhTmDm,rSIMAl"RV14EIMYLR53[iBT&i-"c
+`ejm@82d"lBP06`cjdP2mJ'%FbUZCjY2@a2ABY&ML+q+h@mi3aUXeH"(rj*GjNrl
+#m`F5Iq(j00m!E`6REAVmji0ked`,D5f6TkQ*k('$[$V'mrP8AhZJ`KYYmDDe)Q`
+hpFBVjqh6c8[SrQ"XJ"I3Y*MQeG@@F#"4j('p@l9!i-pkK`*Vm,MGHM0H4HpUcY0
+DGX4V&H2&%M[MZjEaiV&%F2@Ip0CfaII)D8Np'*i@ef*%k`(p+#qJ&m9)m6bH3"h
+Z0fjkk2+*p0[pNqlcH*T[$0l6I)jRrHMkG,ihH9qEKYrLfcfr*hA&ME5dH16ZCm6
+lb+Rhl(2-Ljle*ih$rbV2D`!C4Rif8S[k[EjBY$@@M%lBQRIAEV`ZV*!!@X9ibh"
+b(BDDB4[01&hehha!8&r$U,@JXTcGbqk+,2q&S!jPe'T3fm,*J20H8&m3e''H%9b
+K55@&lK(8iB`+K5D9&2UTS)jJ9#JdUD53!%@Y`KpjUkr&jr@&%XP)pUe2#@SeSpE
+i%Yj!90I@C"jV8fXBYDie'!dQfVe)eYZjS2j)8'Y69#rb3jlk3d'YBp34V9iSQiX
+p8*m4e*'-@JeU,KBSpIZ#ZTIjeS#[TIK@LlShMk&@Eec9JRSqKRiJU+-BY3V8JV"
+GmGXq*ULM69d6U#rmH9fY'0V(9)K9H"NXX[,CJMU'Ca3%ZHl9R(!Pe"@#ZLqRJPI
+3#*RbFi+k(mm0d8!RFN-KSc`VU2Yc+USRAb#4m)B'U@-j991MrPJNqeESZP*3ah&
+U3YH#dED*HB@H%p3$H14e"Y43pUAdVHF+kS()bcM$d,-S9KZ4jGm9e0FL,a1&@+P
+"ULp(S5F&p5"'V8BraCYr,kMI&Y6A#@UqDV1T"h1UTRCk3Fj6[b1SKk"b)&65BfP
+*pST+U+G'2L5SpB`kNP$a@&r-[lf5kUVIF)+J(QT4!p%XGG9*9XilM&&V+,8YS$X
+932f'%`AepBbk0k@'XKTe4CUR#qVK294()e"R#1SE',@@8L0U+&09VYeiIDfJ[V'
+E'NaNXS00I412)G))+84HT,P"8)q`U2R)kk%HLIS3TmVRDe%6f9+C+$4,80r-U,8
+qRcr3ULE$QB!&GEDJ(X@S0C3DLqHUU'lUdIbYV6l8jH'B)a+Sm`9e2+2@%@VqYD!
+Z%03*h948+TNDjC!!hrp%8)rKZK)UqS#1VXKHT`RUX4Be%9L9L`C,SH1%3Qf"+-U
+pM%)[lLHS%lZTHP6Y,HMaeNC"29j%APXF99XfmLcU*+%VUAacd6"28#H,YdE805f
+C+1mkBP@GS%i4Eid@BfLKS*l!U0@%QNY$DHT8m9B0IIrF@aF*kSP#9bf3!!Kh1&f
+PCLXh61ZQkTT$AI(!RB*kNSMb4'YBEF[Q2%ZKNi@ZL9!`RY1e59"2XDM&b,1ST`T
+G%hT-bq9bLrS@3He%JbK(2803Th0USVpZ@#kS-hJ-%@TIh@"4ChC6Xh8$U-f#fX"
+ML&$lkSCPJMV,SZBLVmYhLp@,QLd8bYF081JX3Ch665h8$4CeVSLm[VV"STiQG1f
+V'mi8e(RLVB@k)G*mZU#H,YlD9cGB-65Ie`f%fPFh@03&iUepGB0&E45kpY80PUi
+,ZkRjZZ(K"`9eNBMb[VV"kYNd#9hlkJD,HSC&,8EH1B+k@1MD9cGBe#@#fPFh@(h
++THKpNbKAr4'5PA-pYV!UU-XBPA@`FPK3[B*k*UI5$R&!chG%r)+kR&0$IY,T+Ec
+e2%&Y0ULd2l5,HTC"lCKF#!Fl'Xl'*!!1H[1Uhjm0)D,VqB+kJP&V'4Apk'bm@Y4
+c'"@pH6@1T*I23aCeC3meRiFXkVQ-@JFUANUkE%kQ$!QU0d90kZeq99F(U1HPSJ&
+8$*GNSm'LUYe[pISb@*[DBND$VcdrlQ&6I@D8ql6F+!@K@V0+INBPNb@J&USSLaS
+`G5A8JUi@YE@(QSpALpTQ4Kk!hT!!2pHeM3KUHcG9$qALeD)'c@LJ%i6jD,#Sjj[
+a#R@m@MlR@G43$c@Imk+#'MCM#1-A,H'B,q6%N!"&MCM8X*V!p%XQ`pV8U+P3A-h
+QbFh8Q"P$T0Q3!*h!!$8QU(%cHi'D+C5h8&HCZK*U)D0B9#e&lI4l#a@!48fB'B9
+3Xm8bU(&"e8eG%fTVXD0[8C-Q9IFjU@X,YF1-2%)Yj(+,fQP'JpkQjfS(8&F*kZS
+80D66kQD!ZJE6C6JM3MTUbY`X%+M@P0J&M&S9dSY6%HLq@"hLYc*UE8J[6NABe,F
+aDPe)EpAb-i43k%C"I6ZMeS4d,4#*G6JDfG3,q9Y*(`S*4HX)CLDFQUd1m8@-@Jf
+&5'@HkiJd,aE8LmeS3299l,qZ&Y4,8Y&3k,rDEle88!04[c0"C,re(8+K0K*kfAK
+G)ULALEHfHG%5l48@EedMU1mdilA9'`fXcRBhHpjkZBLmI-F4e+@#qLkK8$ilJ'V
+ePDrSTLCLQCDM6Ee5a&!LN4hG!YAUfVjE4!-Camj&Jp9P[dT31h2KB&2I)h6Yc,9
+53E9kmhq&q9+L+qP%B4!lNLQa%H@I%06h-QSGTFBdl)C`FS0&ICreeS6QkbeXdY5
+V'E@'pAPLQ5BldG@DM(`rIfY,f&qSP[(@Q`Ae!eaA4[8kq3[86`VU"rPEd92bkKJ
+@c33X1[SA#HU('(8N#6U9G!jmf`-@e%X%p4UZ%!+K)bmXSX(U[hlBT-EAd+CMY[2
+p+8(pL+N3SHVY2RelQ)2kD8'peSJ'5RA+ec6e1NZKh#Lf6EfqQjTYXpR8'bb&FZd
+AQrVA2!p4DQ&#prTE"I9[,)9bm@T62fSTT!FcVDJdp@2'@q0%Rd,[d+,Hb+PX!$2
+E"J4eVD$HP++5+@,d+JDS(qG80VDjkkfI5&%,Ed@Q[&a32mQTC!1*9d2l)&ZrGJR
+UcCcDj[1fDTMjcLL%YeiKU,HNU"e"0GX8"I9+3If833e%5GFVQXPj0[A6&MACNTd
+[Vpr`EN'pP@F89+k&IM5S9`RUEHCEGF`UjA50EcT180Ib6%QR2AckkPc&jK28,[j
+@pNi[@P*1CG-LU*rTSD+"k%6$H`AepKjU`YN(d%1pJe0T9aPM%ERFm(j"[C0((ZC
+4b+KpX#fEbqm3e,XBY6S5+JiGi+dI%062mXJ$YG"QYkQI5lfed#)'pB1#qRP'V3)
+e0ie#UGDdrGd@eHR-8qSeJ[S&(RQ-QUh,Zp54p`VU&e1k&PV%H1Y("29['A8%GR6
+N@k+HV[0[(5+Spr#haY&bc0Dmp+hA#qUpA&GD'1ED,mJ0eJk-G5E9UmFJEDB"#qT
+R"I8qVT!!KUQ53ND*0&Xc@2IcM!*U)D2JVCmAe#qPhPV-+$e[IB$R"P#,'5A5("$
+8"beU-D0m9&!IiM(%U'6lJ*2,VAlj`bPGLaQP4k&(M"K#LbHI(2$@Q`6elcJeJ8C
+[(rAMJ[TP3FAB3EChZ1*a+r)HjG'3!0!k['`MP4-09QGZ2Bm'6$GNfm-X0rbYS(k
+&8j24BSEY@VRkDN(p+PHS8`fM"XK@me$)kQ$p2IEJN!"S8&(RaEcKI1r`EB,k$ic
++YMlNP1eDFHZTJ[SBTi**jPr$cPkPqJfh#qVMM$TXeX,&K3dZL#&VSp86M-Tk'qf
+B`qlY,0[8Il5S+%IEXpdbLrT2"M8C$RZ$Q&I+pRSYkYGij+&,NHXhESkmVkHShRK
+-FkB(l,GqJdFHS@UjH!A9QJEq*YH9p$CS-'4l0RF*kJD$'Y'pNC!!(X`m&P5VpYV
+)&F)MLlNKd[af3Id@SikNIC3BYZldYP*XkT2mVG#8E)S,1V[%jJiE*DMI0UKNTLH
+ImqShh#fShf(8kP!53cDa6*H5+R5KS(kAlAkVaBbG'Xi0cQ+lckm&pCpjj"'UAZ`
+G2L+S6h&G33ej56aN)mrUc6r0GBfS[S3c#%LS,DGEdalIipN,rBE@r$a`elJ(VHV
+`'8k0)JrPjqDl6UQejZDrch8Pe2c-GpFTGHm4e"r`YmB5K9B8LA*V1pd2H653!)`
+m-6X!6b,[bi,k)rj@1S-956K["I943Ah@SMVG2+V31N&pMNF$cDeH,1[+CLq,qLm
+mSj!!@KRPB6kMV"I8(h1&%Y'*K6&-C*5,"I8RA#&5-F4Dr@TQI!"8DpVMTebKC$4
+F5&qJALUS2f2jY5UCb0BRP,VUj*-%pHGF)CT0FJ',D2LUS$k2RA(NVDLLNX(Fi'(
+A+51r,UMrbUKN4jS2JiHqA0rVF8(p"AmVU2jNVMm%kK1#qS*"AC-)aj`X4,,b`lm
+8e&pLUah1#)hd!)VcP"X&p9H-@Uhj[)@"5X5V06h`ka59M2AXT2k'8DY!pEFkNf@
+8DNd2r*ZTUpHT$,G5ImZfH)kC(p"D81JPf$lJa)5iVldRSdbhHVhrBcUPeM@U2J1
+i2FSIqBP98rk18@XEJkX$rNDbhD[lM5EeQSFHT&Z-fIPh4KfaG%dFqq+f%bPehDD
+KJ[SIM$UQ)4Ee"r9J,+U')4B%lRR"fVZqrk+JrTiV0'2fSTEc!cl-!`mSp#+M9M9
+L8K'cVij%0[82M&UpD-Nbc!pQPE@T,h'&cNKLGXL2,AU$#QeLe,e0kP,5D0p-lU%
+U(UlVl!j-PZC#ckBUM$TmGP063bjFdp3KaPY*+rU2Ehf0%DraH$L`&!h%J@K3K[+
+--JG99b'Mp&#(mC`(@CGLdhC,E29fY%dGcK9UB[XTRIIDe"'-1T,UQJXrQeV&U(X
+YM1R"eL"k+8Kl@l%fYCT6CmaZ8RdKP[I+e"SH$60Q,`kd"HQqU%Sde$,Uk"QcPk'
+YY$5J4ECRGCYDac2PM(!3TGI16+Q-Y'*SL8m,aVI*QUEZaDM$&LfCN8pHDHVH2"S
+D-1F4LfDcT8dGaDJe*"R24T@5HE"0(FeeEBL&BeS6mMP'G-ZklX0MD(N3'dmlGmA
+3'+i3ULKGLf@,&*Zk,mq[MB&SFRGqhBmV0#ZSSTV2+E6Z$kF,k[kmXQPS*('H6AV
+f@mGbAC[3jY'abh@(VZ-iGDBD$XGL'!BHT"jJk"VS#+)%f"Pj"r+hcJSQ3[2),V(
+"Ylk@8IFRP3h0V$1LrJDdcV"`bRUi66f)+c3R&UDPr!k&AQG88FJ0Zk2mB2l@ZGJ
+a4mDEXP(qdKT"2B5rG3%UMGe[VHFejB*B*dVcA6APSEaL@i`0!NNY'l%fp6!MSk#
+'8YZbB@j6Amqc9p1#*A5Rm*aNe,F9IHYAPPV8`hNdS+K4ihq-KMI`b&X5D&X33c0
+k4j5rN9H(5h5X5PBe2mNXfkV$Zhk`6&$IC,b9UVSVSac")ir83rQHL%dpNNGjVX6
+M'D9kTD#qQ8IH[+JHcNHkrGDM$)A3!0LYd0&'IJfZEX5`rFjS''rd[4$NZh2H"0E
+2UdDcDll@-Q9UU*IDP9JS0Y3Uaa#(%'4Ec16a+)LbMqf+hb#fD#[(mXL$a3655R@
+SYcffYkA3F9cA04eUVZX&A6phk9F%G5*frC2mLRNjYYHk&p`9[[F`SG$a60IKC'0
+F[Tb(VU,rUNcL#Q%X-KV,BD(V1U(3C+C3&C[!b-93C2PPiUe68M%8$VB8BZJ"mGB
+66#V*VlQFpp#c+`4e+U-1Tl-$Z@M!@am5e"0j0&!M%IPirI,FA`[U0"B0`l$KVp"
+(365)U3MP*%DY"YAVEmQ@E0JFIkLJRXcp('J*G6cC41j3ZrdF++H`h)#jAZUl)8F
+0LePfj95qICpX2FqR5VceD8&p#rGc`"5DP+Iq6&#RXlF1`eY,-@5pG8CkdhqQ%Zh
+Hp+r-a2jpSK!QPHQ5a+a#c@,14QP)C5p9bq@KfaiE-dcNKPQm(X)Lc!)@HHKEJMU
+EEF5[`SEkmFG2c1@mMGH*AFl+((Yc[&0lEEaHE'9@jR)UkJB#cP2&*R,P0"i0i@!
+NQ'p630IlKDlcYQkThiV'@k[%@dp2ljYhS[ckDN'G[h@hr9B`TUQQ#ZU#cC[MHk[
+HlKh`5Z2fhIDEb6eEkT@&QrI0$laedID0q0[H1P03qIlABGLZ@ZceGQp+9[Mq9l+
+6G6aU"cLkf-l'@m9fF)A[Iaf'$G#PYiSGm-S5ARZeBZ0,1&plh6(kGT&4PUDf6CF
+8QL[HZScAAXCNT&-"U%-Q#ZUCjTkj3K&&G"8cqXVbp1DR6$AI[IP*DHE4i024fXa
+(`mI#CiPS1)Zp&4iQp%)dp'cT8-lHh4%4Eeh"hPVY#`I8+!ECFRA$,H+Yjr#k)3N
+V(AUf-8HLr([LV5XCYBjh8QH[5Jl-(*aVcSN@JX'H%e@m240Tq5MI)+MRf60cZ@M
+iKU#UhA0XZ5M[H@X,lfdJKRVRFS`BZZV()KTmR)S)bX8iU*mrEB'JqRNH`Ykh3L0
+Pl8H1H943!lcU6HS*1SAY4-19qciPU+dm$r%Caf`HU[pQRD#fX9`q"Ph!T3e0Q%U
+*a+*E*fh@EVcfLb+'fKPea,*C68dc#j&hlAf#'Q68862BaZ2QF1m)"ULI%G6c'AA
+Nh)$HZ'CH%i(h9VhALJP#*E5lRbHL)3a()L6RN8j2h`CSUp-6BG4D5Lh1Php*8+-
+@0EF%(P5aX8#*-5Ta-8)YT'3'6%%9%r"+R&(hSP6-fY+ifm,Y1Z+bR`[U+NZKl,S
+06eIcf@*[Y+,Cr5&RNY9h`lk#QQ$8[CQhS!M5!fBMYM[9X,T+1RmV"Z$lYSrF)2B
+G+NP1jC[)Ge)lV0b3!+[dS0"$JYUCcLJ1Y6ZMV'B+lB[Zd2K%-0ibRLb"di*Yl6f
+[KN,#9B#bKP&(#Rp'[6fEM9E2jJ*'aDBZ2B$0'8l0CVreVAaqD-E#*I2UMjJ82,+
+qB8,$R-BT8qG2@""-H6GDqpLYBUH#mMC'(G1iR,%@*c&8KELeN!#8HV090lbGekq
+B`!KSVDS[B1--kMX@@*Rb3Ui3'D3!N!!pQ%TP+h5ce41pL&&(,CQhD&Rc0N80kUI
+%MKRPBPi2SB3Ue%0GjchrBd'pK&H(3I3e5R-EJRSTUm[hQV@XUE!mSfHEKF,h[eC
+MQ"*VeA+q@"*R##mibQ@mQLI8[,dB[&AXQ92HbIXSS'*#,hK"VKl5"I9bFfZ4jP@
+,'q2D"29GUEGLU@9fMb1SlB*kKIA@r*D15,09f9aT8I2EQ#,0BR1mmQkK80&V8E2
+BbkjFaDJdAR2"3+KL1lMb(U&3S!9$cPQ&a1jYKHprCENKZp558-9QDiA[Ik@kjTG
+JJ+UPU&LI9DrX-k3*'q4RLUPcqXAG,'#Hhr,lldPQ['L68Xh[0IaHbqper$k#hdI
+bqf[iI4brlmr[SrPpEhEhr!HCqFIh-IahcD4IL2X"r2YqC-)8p`2jGiAIKr!lcGb
+i,b&G9pb(mZq[jIHMqIdJIRmG[ap-CKTaIc2rIJLreh0GAZ6IpqAIImHr9r(lA[a
+hIq$I$q2hej2T30b(mHpMqAdijlh%lj[il`lPpm2jr8Jb'BIl'rMh0j*C2YapT1Z
+&qiPNXJIh0r(IMq,h)rKp+TNA`[dSrRdmIqqrNid-q(i1k9[LhN*kElMlD9m-r6$
+DkF*N-Z(KIKbGq-*Z#E)eBXBXE(+mNa4%h'@@Q8pFAeNp0&`R3Cpe3XFTq2i!lLH
+3!1NSSGp%-MZ'qc'NTi[l0$+EK2Y*C0S)pq2aZbY`Rd"Qjh#IM0pIYZj"j445jH1
+KAm"q3H)%LYD-+39F4e[Qi6V,%r456XEh&q,MX0%2dBHXEq[QHZSb$qIq6pe1aIZ
+IPJ,SPiNlepfAH@K(8FS3GiCZr2dLAa6pKCQ(EJ+5+ZMf&RcrQFJAYQkZ`c(cd&N
+p+81q-26,a*hVYF`mG**2bK"hKQimlXfi+lNp-`qG#T3aa*fMQqXhc6adkNmQSC[
+VH-dme1H@E%+hJZFfmp"*1LQ$ESpLIbKaYfEVjVTq-`qGHI[IZNhRZKRkc5#6XAY
+da,ZTMXM6'4eG(h,QS@jPC"BkZXlSc%1pENJKG$6UeA6p8I*UCalDBCF#k#JGL%2
+A0CjjD$pACK'(VSmpmp$j#+P$(1Eb50&4RhRSVX,re1qriXrT(j5mrCQ(cSc)%qV
+#IhV'V@GGGi(QSC0D-JRGA(q$jU(c@r)%hCjpS9qhNX0#mq`[9p"Yq+Kqh8SH$md
+c9MUK@mPPSRR'b5CdFhdZQZF!kB0Z[!pYk1BkE662JDrS0TYX*[P2hCl![RC54I,
+qXjNR5PiIcI2D9h9l0HjB(pZBIaJqbUbRE6eG&j,Q18MfS'G4[i'CRpI*'[,Ij[Q
+6Y(iPCjEQ19MDN!#rMAiBRfF`G5Yj`c62)ECZTq&qId@r1@4(d*rQ1HD#ej!!lmG
+Xa$jrdf&T5NIAVDCjZ'rErkIM20bVF$mGpfTjJUij9jIQ1I49AHH6l8@i,m$h@UQ
+!VNEpCH[U1[idcf'[kLSIL02RX1rHG0fDdY2e)QUHedX(mNmMf35&qd,T30`q$4m
+'TLIC,6VhCk6$T3(jD"(dR5P6b%ZZce2c[1&9IH8$HQEU1pH"URRHq)UHdS5mihT
+L0FqET!Aj9C+JEkA1JmpSb89H0HE2qIbKSDrV-pBm4ll5(rQrIC'-AUl$@I1m@EU
+JPp%rXr9b[G@DjbMCJPl+'@5MAhbFdN6f!BSkKFpjQ[&@FRPVRU0YrBap%VYdA!S
+pjZ+q'(V-hk-VG%cA@lD1VZpFmibA3qJ)!ITdc$TD0Fm%fB@1VMGIma`Map!ajj[
+82-5,ZKa#4k1rXLf[j(h)QZFiDB11bmLQ6Y3[9%pmThTLlU+3!#Ic$QR0!`raFS[
+miRSp0Xra8S`mQAH4Djj*dSJk-T-RA6r-jTNXGmL6H2HIic,[Z0Fm8f3AqFAe$Qf
+H%k3BH6,[VXJm8k8BG8[H*l&j6T4Nk*KeEQbHDE),(9d2fZBj5BU4(r2ZPXecXKa
+$adVGGBS8)crQ(8#Eje3TKSjjIeVQHBXd3NGMhS$[0c*e,,NV0mpd@dG*`Ec"lAa
+r"1jdhJ"h1Qp`qc11IUl2Fr2-N!!Mk2I)R8`rh+PqZ&2p(VQcT&qj2cp6MU$INeF
+crA#RqZ&1pA[bDNFrerZkH4VN#2Spcq-2GkSIlP5rjl2ajlT`0mmX1B*q3lKqZ&2
+pF+Ik$HR,(`0pq0Pb"2h'm[b01p82GkVIf,lm2G"hRb1Vd-re5'qHZE)+r9bhpZB
+j6BkJhcLZ(qj82pbTIZ2kiQqJ[cj29U'Ikf$I2+I,%I3lN!$2Iq*1pF1GkSHP,aR
+pA#rpjTN[Up$2GI9[RJ@b#[eSrK[SQcG+,[3VpmXAbLVdSrAV3*pmNG3Lr`hdaj[
+N&[T9kUFcT"EjEk!I[PKUSGp!(hb*p%'rK65$$6(fj*VeUqS[1[S`ce)1jHpehX2
+fi93HY-aqMl'r)2dHlZHM[m!q8ii3AdCrJpCM[IV$Za6fAj6eAlicRYJqMI*lQRH
+pTf2bB-#IPBP2[TrBH!rfd1Dp9SKcYK`K2SrQr@-m0+0A,G-,Qba,NUf3!%ASKIf
+bDVcSQTLIFf36H[AASbYP%AV935p%&pPBdkIBZ6)*[H"5*'H+a$KHQ85qK9jBp9p
++#1G**Z)Vkl(G2+T%)Yr#RAjPX6`h1b0rd![eBX'NGZT`J2a",l+h2qHUA4br4#*
+r%Eh+q5XJQp#V[rjUP8M8-j!!+QXT1(AD*"0k13E[8iHlXT&#j0Z#(IA8#8SNkLr
+U'Vqr2h1qE%+[r[i-G`iTKDJ2X%bmKELmlP-X,*(3+ka5-q#P#)Y)*2)"R*rhGj-
+mRUK%SMiSQ,01RCJX3LrLdb*[P$peiK+*r%Ad+YIMUf35HRAk[H8-TNNNkR'L9hP
+J+b'4b&m*YE@ble5A51LPqrUE(6K*L83p3r3UpaFl*",j9Qr6+chF6TQ%AL'pi1b
+-RpA5"Vfi6aT$Va%K(I0*&5F5Df34HX(jjBjpb"I))[5U$HNlpL'r94DK9aemhF(
+f@pNTdpYN%AV9K1!T-4,Vk-m)EjG'a"ICIB"bA1X)pLPfSA4",m1I"IFIC0D,b!G
+NJV%ri9iN,G$V61,Pp(rTKVb,5Br+RUf,C41kNI`lZ&rV%LQ&ES'S[pqCa+95LMc
+44JUH8TjiKj3LhYU+KMACJFF!ZB4ZU0GD[9%ilRB,LRI+*R5MGG$!hTh,T44jBU"
+#ITHN3VG%c&fdFi@8STj)*-S'6Dk80ZKQl"ACPTIK-$IX*VKh5a0dShZb[G0lI&*
+iTaIVLXj+JVj+5T(R1LX,TGiMRDL(5Kj369KhhDcFah6$RHU'1p80GkSElP3hh+P
+ZZ&2GF+Hki8je`jhUKM[9$AHUfq&0QrY[h)qDQCr*0JiBZSbi!j4r*5f)0lGID1Y
+94r@+DI!bfLIBHf84HV(i5QLqd[L$jhh5"Ef-2'EVPI+%A8TN9lqXeh,L*PX+S*Y
+4VkAMV#AX(ja-I,qY@`0aael4EaEZhj)Ck&I(p22fGi)q)(h3cmPcf))"1mXU22I
+faGm(C4&jEL3TH93b*qcV+c3r*$h3bkhVdhN#UEPM)0&G`k''[eVj3pe'c$E6e8q
+P"2&K@86GK[a!p0,EIATISIN4D85GbI6U(l2cA#Z0U11TAK9,PYG**[3UVk+jALk
+4$bU,"@k3!%AS982eU[M@qfZj4$kSe'&r)jI)"hV3AH2KqDJm)VlL*"Z8pbKp6"U
+K&l1899j-G+0-3LrLA"$6fAekh550d)YCfLV(emGP%RS0aYFRT"&kYF++[PI,'G)
+hcLHP#hSjIE!fRlG9Jkp-0arFr)THCf'HiJjCJ@iG3E@m%1`@DB0Z6Rk!a`Hb05A
+UpQXq*Bh)Ce5[C%Yr4q(6dSMk("0bJjX1Ej9)a*F1h`lP2(DE,%)[YXFkErVH1'Z
+P%I(&BJXMC5@caefb#Ef`A+P2Vmr)*[4+Z(jUEjG'k%@h"Q*4XP[[hL'0U'H`0jf
+BBJffP4)ZSFX9p$,mp0Kk98G#1aEMhQAVG6EAi9Km*rllpmc"V8#pISY8S-k"MS-
+,2$mVABLlc0`ELE[""AfIHeN[*mkN!rfF+ZKAf3l[mAcq9IdN"EVeEb(eH1k@6HK
+@ah3VcdPq3GUJ@cl2$5lbqf+Q[T!!2Y39)q$@I'$0')eDZ8*GNFN6eA%XPLT2`hN
+mpqc8Ua9k%0qEmS-kRii893Eblj9&e2R3bk[(N!$Dh)9Zkk34GEk'hH`$GIjpdSX
+k(cS1e[Rh5b2UI1Je@1Gr5IT3rcMe-[3EV2-IN!"1e2P8YdUG6k*@,P(R-pf)8pX
+ql4k56Y6jd'f`cRpBqT!!j`bId*[V#La%'#LF(l(efl1()UhM6(`RlrL[[3Q1VJN
+Xia[3pHqN&ESkG5$4&5Z"qrFmI9Qk8!FkH6fKGAJeRqTV,kA)4cP8'V'rSKTEPm[
+,"A(@5aILc0%V'Gh4X50G%MP%AZK8`qMXPZG2[rU+A[+!ZFM42EVY0@YC%m`aU1'
+5#ap&AV$Rdidc@kmD&A02-@qiIlr6hdXImUqY'r24A-R!rb"Yb,pT[D!@mA8@GSh
+"2#CGd1XP+XqiY&l$CLeFA1RZHcb2fhS0@A[03k3I1T6I$q,hJpHZHfN0lL[CGmq
+,r2i(r[Y$qGh9qbM1'Fr[dS*iCI2[lI$"@0Viq)3X)Vm`[6"NeekUr2p4ZU#Ad4I
+EV&Fb(2B'iA@Me,%Q,REP"RUarNTF14Iqa6(lBIGCiSjq0CJRVfb[mRLq*NI3lq&
+RH[9lq*PXh3Ip[2'BeVpRq1[5!rfSEMIGb(6$[C3h-"FIp@U9ZZmEXSUiSh2b0%f
+A)ZqEFS9k@m6GZG6jdp!YZN9dEb5N"ph!fm#KKNk',[bpfEK'3!c@aaZP#A&Ka(F
+kVM2eedLk6b#@k&mTm#dj3[dPiMQ6KmJmGQX`(!M'5[&'ZZH@AR[m`[j&Yh+F-Em
+3PIcrEHP#R'AdUJiPX3NijQlCmRLq)ih)#`205h+q+dfSVhE9983h[E)2kTqP$ES
+jq3bkKE`N%jILl5RT3RliVHGhZ)hGR-mLULr4Eri)jfN12B$hkEKZ4Yr[Mh16`E8
+EVrf-d20mI,pl6ca#ecC`[lLPck"Fh(AHmcr'[4fr*c1H6Vm(mpUY!mlk[LGpk$X
+iqNA4GaM`&IU-0+(HScSDH3GkZRdISYq!VmI[baAd-q*2k*I*mc@aa1$k%mm2T!Y
+j2K0[eD3h1,&X`p2c3qP$[R2kQp4(5L64(fmrNLESYl-HC,VeEdhbH*k94[3,D-r
+1kiqjIE[R1&5qd-mdj[l6r3)b*iR"Trjq`Ep)&qS*QZH-I&'ZLfS5dBQ$"Va3idS
+5iQp2ri0dP'1YIY9Gp2X6k8+qFqCXNY(`B-2QTp)&[CkM%EjI@UqUC+,FXbIRCce
+kQA0C4kjG9lhb6rdDBciVhEICNcpS[fCh[9G,H`19JZrRdSCkcr"rZSmGRjJ(53B
+V"U1Hjp#dre2l2A@B@22"!*62h4IcVp+'I*V@(hVjNj8p'Vq3!#lSjF4VBNdL(1[
+[+RJm,pMaDZ5Y-6h['D'41GEbFcbrP#hSVhJa(le"j&YEYfV0jaddQ[8V1B*Z#aj
+NZZ&q(R6laS)(#lS4b`cpZ[eDfU$E%h6LFCqdEPA3cGrDlcl'irQ0VGZZ25,5!2e
+BhX$l9A+rk8E-!C!!M[+q@r1HYhrfL*arXr8dqLmKVSINS+pVe'qi8he6HC(T+qU
+%IA[dVBPV-@UGXL5aB[KN01U%bkPMRqVdHfVTHmTY"f@2Md9$pdkZF`IfNj!!(6T
+&(FS'hC8prK5lG8"m84e3IlbA1NZT5HZ!2@23SEc53M&m*qlTHcPkC1*L,kS(kQi
+p@26+SZcaPIKbA,$i,+r08!brL2+!Z2J`GC*4L`j86lf&cA@901K4dRi3dhYf$"f
+-[6TVZZSh6XAp%Yj[ZQ$YaKZ)MSBqUpPh4jHpkE)dE`6'Np@fI+`SDGq(VLl'IKp
+$RqfkS#k+8SH4`cI(#mCF"[E++'PrKmAh)JjDUD28BC[IbreFplrAm'GSk'kmYrZ
+G!*!!GrVaY[elhVRrM)9,jY8I-5PiC(h$K)BjM91QcTq`)-K0m&V[j$l[2(-mTme
+&$DkmUk[HXhiqhdD'@R,pdQ2I4c`(C0ijTR%jHphLC*3f2VFpNX#i2cYbrXml4bf
+CYfKCFd&*$Z1qhccB&rNq8QG1[Zdack1r-VBFMr)mqP,pbTGiI!Df[,0ZAP32D+f
+U,j!!Hb1&FIpfL*[8@6rDf+TcRQIp!@bbbiR24RKE`41CS$43Hq16qklV2Y[HDI6
+la[DmXiViBY,+GN'9EPpQ8J&I60eqQ1)AEqj2fRV93UqJ'JjHi0C6mJ)rCYhpPZZ
+fl21apF,q,mfVP[ID+hYmQ2hr2AQhEqN$Eidcf-(TpkHLb!YmQ,fX&iZcmMbSdZf
+rE-K%TKIZ9#rFU9ki8le`ThVK6[A#RHU&1p8,GkSAlP3[h+PHMm4hk&AHGkI)#hb
+AGFGA@5qD$bTfF"4jJGqbEVfH20E9LrVpUYK*813&rXUkpITZIee$md'J*H`1FL[
+b!PpPhAUpX-@Af,EiUYM"853*[X5'64r-AjA"2%@5i%Y-k)8cC-S$Q))DLJT`b@q
+DjS4TKf[)P!G2KQPpZ!*pZ,jT3B*hPmJC5LVa)8e,!QfE0TNr1JLrDbHr)@Vr0`#
+3!`d0#'aTBQGcFbke5'9KC'9bFbj`BfJ!N!`DR`#3%#rN!!#)!*!&rj!%68e38Ne
+03d-"!+`mF81XG+fl!!!*&3!"1qS!!!*a!!!U@93lL3%!N!Cr5#0%$L)U+b)U4@A
+'Gk#T@cm-cSG2VFLp5F2`r@Q[Njc8f4RZlZ`-"1!KhZCIiA5m4jCY#T!!ir5I%,N
+R@33-3,QGU"L9'8rh[IUKL9H$BR,!BCA1%c516XbXj6Si,d@LhG24(bQDRXX9$(%
+c,%aYB3-XE,q&$43BFi@Y3V'YYQ'+Y4AdHA*DfXp4d3(DX%&@C91@&(NcrrG$m2Y
+hi`E$P(6crb%YkGG`25fVN[PIlH2EL86rp*,a8X0KDpc&5TU)eZrrI`Ahcim4cL9
+XSQ1h`qNmpbMIPl#(ZKjVX6+a+c3PRCSUaE3rMKK2Y96Zq+*cH+4hKb"k`KFZTX@
+a6'`j"ak&J[)p[2Y[Y0SB+VEP'AHR&&ZYpbjDh2H(Q'@AfVa2mIQ6+`p,,L@,1R)
+j3,'c9N!9%125T8YP0DCNihaTRpklF+PRM1!$$,CaBN`IbTMD8XeB1[iBBdjmiAZ
+8q(FSaGaB1[%BCBBHQcp[kEKM*&Q@jP"SU,l'T4118'E%T&L+,chK#+G%ec9pJbR
+e+M!Tjd@CT6VRar4[iN-35K541cM9[8XVMa#F)91m5M2N`@-qUZdFd-GF8eD@CR3
+Y)5[F'Ke++$'A(TFAK%ZQ-#-[6A+9kh*Xa)G%ShC`(&8M-mcL@##HL*c1+*cj1Fr
+m'`MldN2&m`3c!GUM4pD6iSK8fUIaX2qR*6b-R-H4"i$AlQ@JXmLC,&SQS+32%je
+9HN5TiaF!1f2ri2Kc32'8F)'c!Q0R@jM+`Y!lL&1Xh-*i#eYQB8S,Zmr#e!,MDba
+-Bf&$,'b2`*6f*#SX,'dXl3E,AT193E2!$'&GfmKM*N2'9PP6h`F!$UYXkcYUeLM
+cl*SiL$8`Vi(C`&N$2mV2Xj-2E'9iLZml2&m(a["IPrXFG'EQC@GQClleAZr%P2r
+#1l28rAkAAKrr*Aef1`GHAZmYMV-6lMaI))#mMJ*%$ar,9aYdAQEPCKYZ`PdL"`Q
+A3!NN2!!#!GMK#`[B4LUD&JX%!K,qhcXJ(AXKrPq&haV`rbliVbQ`Hq!`r(E!Z!B
+pV'MaT"S,KbDH&*C$BIha$Bm2qq)6l)&K2iYA-dh41j+Q0Ndc[XVrpX8hM2*UE9i
+m029PhT5rmN*Kikmm49FU[*'-Yq'aA`cTA6-YUMG2R5BELF1(H(@8TbLbdKSHj)e
+eHG-L50X0[IR+H11kHBBC8V8+,kcVQKidjHCBf1MM-EdMHMMm[r51KMX3h(Dp+@p
+3lfV'djZhjQX9j@R'5rPG5hP*c9"ArN9[I9Yqedp,Q@TX@P,AL0CP([kI(AMQkDX
+#`cBd+GrGm,A@@`1252[JVjjj1L(YZeQ2&X1BeK*1K(@eV`!kq84i4-1"r#"[BQ$
+FSFm&(MPf$raI&AJ0qSrKJ8$M[I9k)K48Y%4%5b81f46fQ[AAab65UpLaM!"epA$
+d$*YTpZZFq+d(128eP&S,+UhC[Hc1q0*IFqSZP&S0DNXX&IEM"I8hR$Sm-",8'k(
+3P+*#Rq28%C3+KDB8&ISCTikN9#JdTDL3!%ZY`Vp!i`@e5V-59+*'+Tk0p3P1VDE
+8'X8)KK1QhT%*eU2@8'TG4%fS4QX3aAS,&p3IFfTY&c@)qT!!Trk)8qXSG@3N#'9
+cZ3IU8jaD6kR9S1Cb`D)qcDQMR&M$5R0IV#je0-ZK5$!TkkUCck%IFZSB5Ud#Y5"
+XCr+1'cPeV+1VJIiLP0I9cD&aMN+d`mYJ8CA2iY6aV+)JbFfJlUFVSCl0U4-B&Eb
+#4UL8RqE8A9PY5)6E84X+&H8C6Yf08G%p+@($#%D(U,XcULiR3PSm'bYdAFDTHc#
+UBHTUSQ9bAU&R1A92PRRYB6QDMG5+p9a1h3Ye1G"S$-I-SUrEL#rp(UHq&R8jd+M
+9d9D$G&qq3[r#UAY6DMAQ+F&m[+"qKe0IakRjVXfMlX1SZY`H"$P2r5kRlS[1)E"
+ND6@CX65RHN8Pe12M(q,8LC4D6kJ)9Y&#@cUTcSRVMZ,8r9aU1*'PVMM@VARl8fU
+04@d*Qhi(-((G-CckHNSGE9'M@BdkiddRFZSEHULq4U$1i03h8QUY4Bh,d8aAZ@E
+pUPT1I9-h968beF'M[TRP%"NL&$)[hM5,8`p`UIR-kk%HL2i`X%5[8T4QfFLfbN5
+KfCak%+A@+NSS(*&6X8c#JMU(8`qQe"U,UL9cA93hp5d@YD-fSU![MfQq5+#HbUQ
+6+,@18224JMUI8`rTTU*6bI3SqrlTTjak++A@%#VQJ,kZU&iRFHTK,Y8)VmKPJk[
+3i9`K$+A3lQ88HQjA6ThF6686FQp$MeJAF1S4220DNZMDXTRR8UG`A8RRQmZ'NcP
+e+Sme,RFdCl+mmi!9GCak*)medCG$#cRe+%UY*Y4F'8T6MqDakTMljf)pM912iEV
+UB52@jNq9QYcD-+fEDZSqpH`(rSj6Mq9CEN4LFNZfjVN+6HHk'P%eQG1eJ912FkP
+pQHG5MqHk'UDQjfUj5cf"8pXa)-T46qI8%bhUpEA'30q`P&0R8'SGSIEh$5jeCMF
+efcH!fX5TXbLeKP$lqiC'6ThY8R1CekRFkXkLjR#&mRd$&$U68qGf8`YpJdZGac1
+[[fp`U5GaAI[lKL@FHM+2YG!ha*Y1iG46H+cpIB1E3kG5DM@Kp[F0,R8qMl@rEh#
+T#lLZrAf$Uq[#EQUqErM5Jjak'XrbrVl"RGNdF&hlq`DAHVT,lFZmFcMe$+jVIpr
+J8KGaDRrIi-iT&f2f(9KbIl8FLT1UR*Zaa@41ED481X(+B8%0FZS54V8Qa'%c2a%
+*FHT54Sf'b+5R%1Yb6QfbUGCmD"[e6*[D0V@3!!jH0Tb&6B$!NUpM0Lq(3YN8)VU
+HakPR8fSYT@)HRFeAPhS1T@)f,bG4p2*eb+8Zkk(Qkj!!5cfA8ZY!4D4NbZCAbLL
+R"VZS+E-e**YbKEUm+aY!aA**0KYFUY`GDe$*B$eUXj-05QYqhF1M+Nk@+hTZPB*
+3h9fP%+@5c4*3#ef85`dlZK*U39HA'ZQKj[29TEBiQ3GJ-"V+6@hMR0VD66@MZAa
+eUDU6$GB'B6iEA1Tj6Vj#RD#HVhNZ0GT$cGHm"+I'R"c#qN9c6&1LIJkje,K$MFN
+'YPmb&GDM*Kb&NR+f6QkNDNi1N@&$GJ-$9)e6Ndle!MA6+,p)AH(S5UL&LZ*5p5j
+UHbKBk!"FUZ&8&%,00XZJ*MR9G(3ej%MI40qPTKbUUILPkd9UQj0jK&USj5kehFN
+'XmA-p3kJVZ$8P9h8U'Pe0a9U"lE,!NYq06*USUI-l3+"kQk*[C95Uk*QheB%TLr
+ZK2KYP&SE0IZf)McUqC4D&c8MHRk(%!VGa+NA8'T0e06$FDh0emLMAXKL*A-S&"5
+p6FeX1$@j%q+,,1Ur98-KdTRR*L*0Ch$UfbN9fB$ZUfrqZT*6hd'T*"X+meF[eSX
+j0C`)q4Y%AUc[j!UeN!$8bqEV)NkpK-ID%X4)Y&GBa0V"UHqL914V**J)Vma10hY
+L[C4RARlL#1TL6Rdh9bKI(8"ejmUAG9-0,60bp+LAma`bM1cU&UMZe2Bp2"[)qRB
+Z'p`Tqa@FfTj,"irkAUjVHfk8#USlQhmIpNX$5dI9NNN8&V(MQ4BE@Ij*6Vf58ZX
+XUUEM0S4I'ecUqpeB$9hTE@c5e+XSYBE1HE6-N!#Gk1TZ4Rk!aGSF#a@kCF4k#kG
+HcA5Pe+"I[d#pQ9-rb',&6#PSBPNdNl#Bk&r%U4qLe(U5G$+C(#KE%KE8Gh$U08`
+K*%*EAPKNJcYrrE"$6ACB3mIXj2Xf6Vh@8BK3c9E&h*,QS0l1UGICf@"4rIBe6Eh
+H95LhLZe49h96Xf-fMhU$Ue"Zr1*42m,UN!"&,@cSVPV0U4pe&FVPUdIpQ+Z3!+P
+Q4P&TkSefV%QL6f&fk&*[BP5kJ*NG!i+kKP-rhN8P@m5B995SRf"8ZVDj,GC2GP%
+,XD*5AXUT0c-UZ8!5e$%qb2D[RCak#k1f+-')MTh[M%+)p6*1[E@,fUE+fD%SU*G
+ckQdf0C`J8kp%TZCje0YGDUSjZemqFGel1(8eUbMSA![cD&#[i03lR&K0l#VPG%e
+Z1*a6el"+D@el+1E+A-HQF'SRLjA''F4)bZpXQMRecKiU"SKq0Pc*UAIe8!hr(N!
+2p@j'YDE+@)[)eBB2F1VIXFc$2JTCY9GEXVAmENkpKe+Vip'qT32%HM@RISTP(UL
+&-EY(rA4AV)84-DJIj04l+E8+e0`fLN9eYqdrie,pbEa&[BC6lf1C4kRC[Va6VVq
+I8crET@YK4)aBVqA8[kI8NEM4N4q*"MV2@cf-8cr(BNeLj*MYHDeB9h(Ur8aAUc(
+-M9p3'p`E''XGDY$8)'eQ!![UTcMemd`K(9XPKBS5Eh*hX,l!+JUSKBU#@1rPe#p
+faGTA8ATLIB$9"P$l+NUm+FbT$lV8[SVb-8jpL183TC,V!hiYGqIPAqV5YDqLp#M
+dC6Z(-1,*&`I%qR&1r3G'06$SlDGqJP1r`UPB1mM1$Xpqc-fmKeNf'(TEN!"HT2+
+c`Ch-2F+b!GX0fI%`V3erckPICG48SUr#GLjEH4@RISdTe#l(d!0NZhNSj%k`[Si
+l1)'PS4SCICi@M19RKqGckMp5+VhkN!"6Y[2XeFGckU1-#LECIihjGj8QVVZ,8aq
+Me1'c&jj4Z1##(()[@Me1UA5fdBSpl0l*XNIp*jH+GV3e1becUIr$TUCLXD#+IDA
+XV0HPrM2,2%`TF[2'MCRhM5jU-+RTr[D!&qXh@HB4UTl,9e$GEH"[-9h*E-0+KZc
+-jKj1A@G6ifB`(MA96,#JZVhAHUB3JZbV$I'Q#cMefj4DEme40&cGk4fPH04rBE&
+#8h)T6[9[LFdE2SC6[f06b8j2[ZC0A2FC6[dZT9C(8eLbd6*65NZK#cReHr6f@be
+fl14BER%@eheqakRICjP(U'EIl2$,R2S%daA8D*!!j%-fmpcCr*0-elLX'2iL)+%
+fRq*ZHrb!95r-'b,jIH$124jdZm1R'$@"1T6IQqmmVYEGQhqDk8USqCh[cZ2UhXZ
+T2f5aDNCK&%@bh,e1pb1@$D3L6miZ`*2-q`URrTM&DZeJa3dr9P!IjY4RA+SrcE-
+8@XZTcl*XX'TV%-HkXYA,TIiVUbLN9dClQ+mSMh$U6jK#4Q*bB3d6&HAYR2T6TK$
+T',4)5-kX$i$UER[mM#Q85X3+j3[8LcRejl5q9U@-E(pL89G-2jC6Im%8XUT*,Q'
+4$9rMe&rLCPaJkG99k+*5DQlaX21iqQp`kUmSPGa)8l"iU16QASpakUpCV+#'8VR
+j%+L2FqT[E'U(%G2m+N5UmTGqbkQra9@l`0+E4ZTN"Y#h6lQH8rq08UYe*9KBU%5
+qZYX$[qZLNV@HPkMr6UP9S)BLrQDC4A@h"rl$d6ASGiDEU,mR9cc2($Rqe,$HM%E
+2S2H!M8155QY246R4RIAqca0"2D'kES'Xf-!Y@IlPRlSpj4m)pEMcDaHS+m1K"H5
+k9hH-$[@DKakdVKM6pjq81R*a4a,hiVB3,HVD$EY`kKmTGI`X,4&5699,b$')"B&
+l)PKccp22FHUIQ%)cjTc@I&jB`6j`4D(R+,9U!6B9XI[U5q44RkI8kY-@0@*r-+Z
+X4hf"+A4k#VY$)9c4'e*S!k@1GUL,bD"p)lQ(+J@BVR2DX&QD5cf2+P(UL$N0$E0
+bkCUQ$V0M*D2S2mIk'MYINmPBH$%'L*9XN!"fB49P,VUZ3NATS3kRe$V)ZKLAYTZ
+eP9[3(R8%8kL"hUIdir@S)bQehY)ePhiHYBT54bh86$@LBTD#XVF*ke'V'AA'R!C
+CLG+k9kE@X'bB-HH-F)YUhBXDc)CD5KdlBdiMaNU,`hTm5eAhU(@X8Xk)U@LpAUU
+88VfE3iX8A8eZPM90(8@T`dpE0#0I[0,8d5`ECQ(23dYNUk9((81T0D3Bcd'ANJR
+BSijPZXl5BTVHJ(U1&GfbVZ0B$Le9FI'dI9X1M@F+SBXbG5hET(M8#Dbq,JJR8Y[
+Vkkj-SGQUM'iqTp$DjdrKe0eBCc0V!FRcE0(cBYfGkGU!-Bq*@kjEGGf$8@I+XCL
+QB4PiL,URV@Zi688,m&,QlF9LRDdDdC2*,E'K@&p,UEZ4cXDUV$-5S9NBRH(JP"Z
+i4pfE+64ALeQYr&D&AQGh8DJ0fl0m(aEV20bB)qY0f5arSB06pf@acNHRX6h@LDb
+RR+qeScAIeP2ZacUf-h"")+9R-pDMlQpA&243FNXfc6hUkeReDTLrb,ST2$H98$D
+K9hpeX8Yp!mX'0$9bmXrCm%D@HB[#,I-e$+1hC[QE@(Hib-5TC&N2NFUbZ6ZmjiH
+0R2TQ1eC,e@d9j3#@HD3IbXp%21U",-Yc,4kV+0A,128JPRNR*maB2Y1p@!qf&F)
+!B,Y#El(VUlTb!CEYAmU'5IEF#dQq[HBG3ZGje4KfRDSh(hPdY*IDDFcrE0GN6MU
+81)4S2,iU1R85'U*XX*h*'rJ9EHN`SY$d9CMDKXJSeDIHmHKS9k($+A9N4jZFQhT
+"edpIr&91RBaEri('ZH4@",eVh3[ZM0fr2eIS#+VV#()a,Yr13eFqIj@Q-)@`&TR
+3FPMSZTBV0095D&N9hF$)j9"mk58meL1lFLLQ0KGbk!%Hke%1PG6AA-elk*Qc1I9
+S5KeKl3lNXJ'a2X5Tal"XX)a%j22e+r0qakR6D,i1ai@r`K`&fF#h)U4M+E8De'#
+S1GZbiA,mIT`kRINjd!ej%VP%lP1lr4a)ap(DJ,eHbhG$MKVMZqc5mHck2VPkRLq
+9L29*6Mf"q6QJ#Nh*8hr1U5I5@)FMeQ)1ZE(15&rkch5LhCIqTCQi[apBqN!e0T@
+Y)iPCKCViRSddUkYkbAUZ$Yhak2MK[$E-TY4U(-)XB&'([XfTFqK&r#TFU*pda14
+Fc9Yr2ErP,-he,XIl[GIk9I`UXc528G%h%(#HbLq45bHaE)LTF68rTS#ZAq#kRVc
+T5[dQ0'+YiV'HNVihlfIjUQT12AA6EIY0B'a6(FfTmcGHMZrYHVY[`%X,YYbfhdM
+ZZ9)[,GaiEli5kfPE,Z*[MR8QTl,lVm0aAE9[eYYp+9PLper*6GC*k"hJk'),'l(
+bkq!5[IrD-4`AS)ZamK[`dL,@Hd9`m5@@llhZ(RXAVbL,Zkj0&a@Daf0YC,fA[4R
+TG`$bX-QFZS6HTX+GZ8)64A6P1rV5d[6PTd`hhhhj5@TLfD#B''hQXq('f*Nm'mk
+NXF,$K&R)KTiV(G*CfbFL20DcDDc95L`X*l$)PZXEEZ@aRX2kKK5XG*MC`4c*mKr
+`@*HaR3-f5Cfc)PAC16MAf4-Y*)1h*bS&HcE5mPQqMP1AHcYcZ@ci*UI+hAYXZ5c
+[LE@Cc6D3!%1pHcPf$Pha%ji0#U-LJh)j$ZUp*mhRe"#V3lMl9KLNV,Rfd)Fj0Fb
+khT4T@&[BIMCF2Z%*6Sf`1X4f(,0eD1+hkMLeKGEbmCJ#,Tl9J+f8Z*EBY'QcC[e
+elK5`P9*(0XjZD*KCb,cV2XqT+U@1Q8%[(MI&HPF`3,f68mqMe2TjBA0"amN0"0l
+Ep9l(0`LPk2Cj(Xq''"b*"*Bq88-Q2IdAS0e*6ja5DbeUhhlj&cNei9*c4q""j4F
+,*)e5LBX4bd*+CX%89,i",b8TGC4&aDkYPAF[FMX2Z13AR,V#95KlEL23fA3@[aX
+YkGjmb0pN9@kB`+N'TBkQhS,L+!rBMGML9-1G+TNX9Lc!pemIZB(I1j45M-SZNEp
+%EA0V3kl6Jd)2F@TlZU,ie1k+XT)U0!(6S8Q'QQbH4)l!k@T,Ddr88)Ll#T!!1LL
+eR[XckThCV(GR0QqP9&cU-X1iR1(hE&kXEi1IPN$M%lZ'9#0*MKB4E6'PNdhXFI&
+m`Sb0hk@3!-kRe2%@05kI"jPHC&TcbMpakJ@81J&QJq5NDNA+2!TeBj&$r#UBG#'
+PMQ(8c83@k`C1[BK5F68f&X38-*+pDRNphqbAhNkTpB5UUH6Fl*DUJYSJFHSl'*9
+F"Fd(LeMGbII&6&H,UXJ*,G'UEETEdMPGqb1R[T05DbaUER2HLr85P`TKYe,IaA,
+)STTD00alF`IC`+pR5CHbLT)bBm'%eLV$+a$f2P6FCZbZkjh6Nrc@NI4Z1,3*02j
+qJU`SBC`&4'p$TN4QqMTBCecKG`'PbbKeP+bX5+Pkf$q'"B9'F1VPM'TGk`3edh)
+J'pl&UHpaU*BX11AS8ef&VQ#kKX+a-%iaq,U#qQj1I5qPePVeYA!&Tj[k2NUYYkL
+Ekl'6$5-jp8T+(8eZjj!!!hSC-`f)eGfBH6qPMZ@eh'V42DjAbkpL#M(UCL*6b*e
+KIi"49DcDkVN1dD0H6DPMX2j+PN4a"L1XE,U5"&hjG36TJj3kcZSTr@beBR@Rd4q
+b&8UXb!!h8kqK9(4XS1E1Z)(UELTmQ&)aTc4`)59r+d,KGqDNDeQXdDNTQ-I)FN(
+PlS+NkeKY))ND40)'Hle*3D(4R(SpTHjZ1c4b+QC2#i(-irGXT&9-)G*ljE2"Spl
+!UIR4JDI34bKe4&m'@94q9dRkU%e9@rcVBi`kRP-ra[+e,qmXUMY(ZC&5DHp9Z+&
+l2EpU+Gh8658(9L[8Ml0Z`k)DB6re21SR@-eM92rNU8Ip*(0!eBBQ2Z,Ih8dlDT*
+ZTMdPkcBDR#'!0q,`CJ#h8'S9T4EfmjlRe&Yc8`ShJKlh'0*YV$Zd&FV-+j(PlNl
+2lC[kSFf6RZQa0NjGh6X45B0"[Br241rBRJfFZLE6jfh-[1iqVj20P6'+,Xb91jI
+rmLHFHLIEIeA4-"6hAcRe,VVI-'TfBd2K#*Ph&5c`rHA53F-Di)"LCTIDp*I5C4c
+RrCjpriNSFY%'UCTpel$[@[CGalj(XZpkp[dDpVd(qpk0IBpPhk2TGq#2j'B0IKr
+2rUk*l,[JHdrfqklN3J+qpf+r5qal'2Zf-JEILmM@%,jhBEqrPRfrKAh[cEjIall
+h)6[jq$k)rEi[qjl)G(Q1r6k"rIi(pRX9qal&rZjjp[[ql2[eC,XGhm2CllZcla'
+-p`,lhX$qEMrfr3EfI5$Cl-Eh'pR[Eb+lk2K@b0B'[SmKQkRiIM2lqc(Xq`$fI66
+CGmAh`Hch55cHrb3AKI$l1@6["Yr0C(F%hb&VV`2l(0DQ"LjV%"kq$lFfPR%EL9`
+p`[GGZ!p-r+44Ph4125RjSZZKiA-+p&R,G6`5[cq!lk2)GLrAEc,CIFEhS@3R#Gr
+6b'iY[SmPfl,i2J*rGaQq$b'lhrLHLVqr*2Q8G"bC8L23qh!IPcKC3kef&5JjXR-
+HdeQFS*Fd(Err*[NJ,Y)Lql"hjHP@mS6R2-Ep,pf14ra2#J(dbq4GbCfHml!4)fM
+)1eXh&Mq[&hhqq*b(5hD#"Ge1`1mrjrA#dkhNd-pjf$8A003,@lp-hT@m!MS2QqL
+#KVbcG@0jlq4GdDfJmc!T%M2NRDpEb5qKml#e,TE3VH6Bd(R`D5HHd+hJ'G&jf!3
+A01Mf-1jI%hH'RQiPeiV1`mlfrp(Y4+DEVGm-FYPKKik)fp)4G6UMBmP(Sr2JYNP
+XS@2*fD2ci09'%+'MhDqQqiqLedMRB6pI%+#MF#!25kiRRBH0HV&&(TCm@$S2FfR
+"3alQkNLI)dcRiGEZrp2[ErRRc`q+hM5GKkX#BSPqYZ51dhRB0"C-p1&&Ijl1`rk
+aB%+hSN03jf%[4M#K@p'MU21`Q51Bd+hSNY4jHiJQG#[j0(AHRX)(hGJFfYDYj"6
+9HAZpSYXFFPRV[h9l((iM5"I*jXp1R5Kk9AAHDer964!`IhIf(jjbqQP2cj+,9ZI
+Y,AV3XdqrbXl2kd30p@rMrNPD[k+c@1F4amaLK[TYcm2B2S1M@p(EV21B`fG(Yj2
+`rB9"rHD5'hGrfHHB"pkXr$aQ2IaS-)I!VSiPYlA1QrLUMLIMZ`VITq#l@TbJDmk
+9V22fHeAA8mRe2Ac2aqqe3J&GlIl,dlAN@0GjqlqUUhJJ6jq&A`[Q'YR9Xq5PehQ
+[&`l8R`ANNL'q&`S(m[C*q!KKRTShkca3NGiJ$+K(Td(IQ5+&ZP6b+Hbm0lkUVhK
+!cdar9h*3l,`h[D+R-+(ZP$`G1qr0`S,k+NM3Gl$2)clFa4CeeGirCrZ(YViPRmc
+11r#9qFKIjb*96#m%QY'Vj0$CH3F*&r5bjfHHAL9[d-il@,5JPh3kZ8LEI&"U)2G
+XHCr#pMbGI#ZkP(EH@ccpl(X5fh4F$$hQiIX-k((UImh6(YcBEhNkPRa61fq5'%*
+(#0#[BpD4XI-1%9hNBmPEY[-1&@2SQ22pklc$K"&eaCk[E+iVH4r0cMYFf+"M)lN
+dMIl&dK1r@hUL@5r8bEc$CqG0&N2NC8l(NPGajadKZZKE5Zl*R6G&'&([-h@bj1I
+FH92&$RAbjIiPlaMEH8H+)I)5GjJb1TDmVc[[+#&'2jPh"qDmSd8A1TEm`6[['%'
+'MPRRiFkE*VV3XH5KhRR(#M(UBpkGZI1Q#c(kiEaIG1FG*m5SMhN(kmilASLKBpj
+IRI01%%E8&A[IJ0dhFR3NhZ!VmrS624d&"IX'cb5TA[LfpJh`EHdE2*2dpE-mfeI
+Qp$-%&rU9jr-c44Ak@6lf+h2j@@),r3ElUYP#LrT4QF22%9cS9jklca99k'Ie6j9
+jqcbK4IfVc0P2%PVNAf@qIV,3)[mUmr464"Ak942p+R2d8i8@q9HCRmmA@Y5rbYa
+mJH"#[r+mI+(3SRqYc-P2%eV8[mTm[%&XSGpJrh5kd+,q9HEKC`JYp+[-`4F*(r4
+ED&@`BIDGA+GrP80pMR5FYjK"@Eaq223HcQ"!M9imp[f#G$c-Mmj!Jle%M*!!Ara
+qJDmr[,IKrN9Crk8[j41pTe'1TfPE2'e6Ka,qc%aqX[[%GMbi3jYhp-[I@F+&r-c
+S98[e`LA,SQ4RLb,d`ReC1GRRqTZpFd36HJhdSmY%%AV935pN&lPBdkrBZ5)*[H$
+k$!D!j(kpJL+*HJZpF1Ur@"#@#bEb+`M(F2f#b3+*HUZd9Jl,0iXLp%+r@$"Chr8
+B32bJ&lRE$lh+mrf3!%#LIK'pb[8V,*V3Dk$rLJJNqKP)PEA%hI9D""0k`BY885r
+QbNB)8@mYTfB$p9B9524IU!9"I@!qFjjS3Uq"q3ac[LU%k!p`6,bCZ*6[9b`QN!$
+3+bCEC[D,'4BA505$T&bH*J8##B&%Ie!`&pre0&'%AX5RKDk@PV[`NJ+*qNAd+[I
+M+d35HV@(JZ8+TJXNqR'L9hPKba")e#p$MJcH1c8&%RUCbX#`!bmPN!$SCiKHjIP
+LQd#LhTSYjZ!-YedNS4Gmq*'CIVpH+i80HM'I0,CH)k-QpT-'R8KdL#,dJR2CVIH
+3!0mULY#V0QTZ[BIm0P'%AR9`KUYAR$+G,iV3UbB+6k4aV@fJ)P`JM-J[F[X!lEM
+HT[BVGU&`35rER`Ac(q6dLkJ(C)0aS1"H*#c3D`Ra)[brG82GaDE(i*fYYiXQG#2
+eGqLqeMZ%&,U&%k%"Ca)A#bRU4!YTH)TeiTe#LRaVk60F5amm"SJPG%1r&JNQ-KB
+lhIFZdB4Z9Kp8ZEYcUC!!SNj81Z4h#bTd-l65SCh,K"6pK''8$CTF,Qc3cEiVXVN
+Z%cHJT3,h(Q'#EYDGE0c6p(ePEGD[IE"!Ab'NU(2YJ`HPhLYXd-fHBc&ICdkG)eF
+YL1INdL,Lqi3&ZVfX9jfPPkE$%fLrB&H+)[5Lq@AS5R'0)2"qiB*HGKhcp1Vb"Pq
+X[eHpV0G5iLTH#+#EhIHNmk`j&KVDm2Z!TpZX1aiG2ha3[pRirVE)3,mkUPp`B+*
+bYI""2lr1iCS%E)h,m!cERhmI&%A8ZAV,Gc6CYeAk'lB2#3rd+[A(k6U"dYa@+A6
+A-+MY8eEmd,F4dqA@#D9LJIL`++*[3hdJHTQYLYRID&iVM1JcU9i$kfU"ki34IEb
+Pek#ebHX&%hU96lUX%N[8Jm%&r4Y%%AV9@(S0qVrlL&LL(JcfB4m95p3$8bfG``K
+m6"b4AdP5$FVhL'i84ZK&V9Q9$rcF**,3LcJ!a*Cc[eiI&dES4DeKPI2V%b)*[BE
+bkj2##,dLHMJFe,'%@p`[ZPQiS*Fr"fY4JK%GrLa,pH#@9r3k%rX8GiX+G'Y6jI*
+KV9Z&$EVjp3&H'I)'il[HEF+)HQETP@SHQ#MF,ScScl&T0R3aF,9!)Vp-q&mSel%
+l4"&kdA[3LVQb0&pD)ic),jTE3Cc*k&HX8c5K&ii8pHYeTfK#,k2N5rBZBB4He[8
+p("`ZpEYh#b2k'G`I*qC5eCCL`59dXB*HYLmG6krUH(6VJGPl2,h1BMSFKYq*Mrd
+GHh"RSeqr95M3jd$(S81BRa)Zj&eQlihNhG#KZdqrV*HICm+"H8i9p"ZmXKi)h2Z
+UIS)#h3DZH3B#Ra&0k&C(G5[[5GiRE0!YAqH'$Z*p0Y0I#"rkLT&`29ijef9PV9L
+KVmM8LHSN$M59Yq%#JFqpT&F%HK$rQ1+$2YpD+4TFb,pI&0(R3kqJUD'dP3kMV49
+'p2NkETaAq[c2#brkI1Jie1Gr34M4jd1[S6lrLm+(rXI[Pk(I8*rrJ(#LclGd'qc
+c5GD+*ITmUKYa20Z[h82#L6iIZJheq9m52Y3jffrcaVi#"a%UMI1A2Iefh+&)kcJ
+6[j-irRBh`GI9`&'lLUlr)+c3eHm$LDiiV6Y`,qNV`S8qd+rVKYi@e"8C$[cl&AZ
+B3B84pbZUFEfiI+32la(K3TljHU85@bGfC%SLKUJ,lA)-NphbrZRAAY&,(,$21GD
+V[c,fL,4JE1"HdYH&$rA-dihk1akXD2mSE+KRRPkMCMFf`-b$(#Zk"T,%$IYDkIa
+#GK&rC,'5`CC(K3Yk[@$*XdGDVq'c&jia10d2""lcp"UfjTU(b$ad&rDp0r[HCmh
+D&cV`[Bcq(RL1I6r2rRirpPh5qf$'QF5qK3Aj5[II@q%RXAJjmA&44(fKHQ(*VVA
+BqIq6F%%[Hbkf8Dp8,"C8i4QM1,%QER$&"RVCmj9ci3-FZamEjb`Cr@U`6cji[5S
+3q'IKJhjqR`VpJNP0(lMAq`hKJAk@EVDrj(,G`&jm)UJ2pURI&&ANRE8REjATBZC
+p5pJ`(cMAFY#dbiZkaFeJ2'UUTF4Eak#f6VBZ,0jXAL-KK[VMpF+%[#M0A6hpkUe
+l!TSaF&,Jfm+&rLY6KmJqGN50K9@YQ'pNHZlUYF0hkepe+qFCpGd`@2qr)iVSbkZ
+M+CK#d%TAYJ+"l`SMkN*PU%EHpi3*rG@f[SVSCJlHJrUqX%%h[jj"YfL3!&6LBVi
+p)9bS$lm2r!&IZfqXCh&C-3C-&1%pbD"lXMNGdmfHqrejEe*GXrkk1lQHjq(hcqc
+)4qMD!ZjRAj`c5*fGbhrj%hbhiZr*MUFrlm'qGU6L81m(`SHjJkpI!R1(LMr2Ti3
+*rCl[PpbI$a$p+[iBRaBqk*HTmc@D-A6q*2"$i8+Gcq4E0CN06LlEf3cm52K3lrc
+jTZA(*'i-j0Z2442p)09Yi'T5)2#--'*HB-hXJL'Y0,GlPN(&#r0-Hqmr25mJHj*
+Be"UB&rbVF+'IX1UFA5mfqFj1e`XM-AR)b"CkA%&#rZfBIj!!LE)@#FQP3lmr&5l
+81hr2*T@)$3eXILCFd1YC+m0h6HY9P6,+-h[bIYkMPl1AGH#DYGA,rM+[XIHcdR1
+E(IA$QYGXlrGUVGR!B-2h#f&$[fIl+"hRj5If39,US&'RAc*SfNHT&dmG0YB8''P
+55[GLIL9XU+GTrD&A+$9i4q2A`J@pr(`e1SbB0M"9#!4qiq@VAEI'pm3c8LGlYq9
+`!Vm9,HJ["E%I[BlA@dqhDPd*$KQfqMFaJQlFVqjbk2C0q060kdBX-`cSpMYKJfk
+2@aZ2ip+k98'h8'6!a8XJm1qHEY[ZL!J$p+0e!r(,j,Z+l!'3!)RbK%ee,cL`Hd6
+HIhKkf[1A+00$80#rTIY1I&[kGY9&ULr[%bEdk&Z6e$A,JQ44BXRfQfMh#CGDcRH
+Udr(8@['8a`l5$Mq)YZlY61Ffh#FK0h6kG#JEACGfq$cXeJ(jCHQ!rZ0+beP+69S
+(h"Q$$Z@6&T,Yhh$(h-[A)j-ASb`pd(HEDTpA&QQ(2m1Ami,QCrPXKQ6l,K3(j-@
+(,5FCYCK!pI4EZ&`h@!B$8YTABIV1MUf$I9HRSh2LqU2aI5HE0leecISEL)kf2L[
+TlliZSkeMDF%i$"c,,IPFNG,q#8Zkf2GpE(ffk)+q+'%jG4ba-9q`jP+j+b1PI4,
+faBXmL&M16)G[M*IjSKk)erBjD1YZapXG*`"f[lGE6jblKP3M5FiBNQ)!SpkbQGU
+b1LqPrG,Yp$0Mjq%Yk11HarI0q0k!leY4Yq6rhNZep`NmIFGEqXEPme"8FZS#YY0
+IRAK!4lY[pA5Fd)+#Q&5Y,-@UI9KAHcF,*0YhRGfhC[*L$)ZR%)X&fqQ,6TL3!0r
+`GaF,0UFLND,2*'QRAcTKJSle4%G0*9EeqQUqY0-rR6K"4q*TDc!KTCeqkX3$1YT
+hk0,edG*4N40DSPA,hi53!'arG6[hGrkQjjCp4`L5bFmD5pIbC&rDkEp1Q&"RU)i
+SQ#8GGrUa%`rSD-q2drf,TD1T4F2pPmNNcjqGXkmYR-M,A90Q,*M3@Q@M0GJQae3
+ifpNb-j&fqVB6$qKShpRDhHZhC88*`aB+*SGN,m(dljK,D4phGc"p9RG1MpdR"-M
+6fc![UH)kVm&h-lj[4haYreGhD6Tq*lX`pMd"6rp4XV)LTHVKdK&Q+Hd(6jLKIeC
+hbfm@G#m1qk5dRc`4L1j@NB2eS(lGdhldK"qk6`L&Bf%X+!l8qE522H'(lVA@A,3
+mdCE52[M%'Ih0+)PF,YdVVAZpTAYK%XaJD4pp[ZlLJ6QiF+%1M#ChciM"NNK-,K`
+RPY)qrF3CpFqHThZkMqAcG*cFQZSV,pPqreKmIKl9XhJ+X9L`Y"mri8FI8Dr'b8@
+5J8j#5[[j%hlS2NC0K&6VXP8mV14[HdTT(i$#$ph(@AY*T@iCX,4r3!&)R8ZX+%T
+1B@NIJX)2hH((#,UAM9K)YSp"mBEZQIP[9A5UJ3Xk!i[38YS(SAKMrT[4[bBk0C8
+Bc!!TlDY3'$,r(NdDq5#DqQ",,&AB3dhl0"4qe2[GXDHXB2R@lRAme43TlIG3r0(
+RN!$pZdUINrD0+!E4IA#a@8Vl6a4qk$jLU,X$,1eM83#LZpSbi)'"`0*q')8IZPF
+0GE1!TAde#MpdTrZ&CIqH8YUISbK%Gf,YX&rhY-p(mFGHMk@l%5ieXP,D,k6iBcl
+,G#mC(j65[L2&'EVEHqVT[UB0jaXL!fj-!e,D[q6IpTC1K$j2i[YipVhcRK[HX#-
+I2!R@"V!4I0Dp$A0MeQ@AB8FqJ+[2`@Ni$,kmBEl"VUU3!,F,fHJHeV!Sh,*KJr0
+(Hq2[@XRIN!#Xq2m!N!-0$3PXD@*VFQ)e,V9PB@4PFR-ZF'0S!*!-KbS!N""DaJ#
+3#2q3"%e08&*0680$!3#X2(&$V(5YXJ!!#1S!!3`@!!!#@3!!*1P3qD$D!*!'-R3
+M4!iL+Rf1U!59'Gq"TQlp-$JI2SdLprET[3YpIqSN*h9fKVXl1`-"i8&m9cJGlj&
+PQ`,NU$L1U1`R&J'&P0Z*LP'CmA6IUaqDH$8S*JFF9ZNm3H2Sa-aDVS2c8L6D24h
+pND,TZ9c"%$I$`Y3@0X$#pP[B3)%a9pJU&0YU'kCB@d'I*kHPr4`9(D!0'f490Q9
+*N6IcIcm%[hmhEM"-56Ir(p+5IJhAdl)UQIr92VkG5242,aN[04bfaPfXT)PSrIl
+r9h$rr"MKA-)Q1RBlR-jcMr*pUHM[9&Q,PBPGS5RTe&3TT[eaa(LUTA,(&jh$)ld
+l"0%6[R!a,BjPBXXjm#J8P1rKhAqMeFC3X5h2Z$ZPf'UpGp(L[Mr%,,[8jRf+cjp
+FH9Kb+9R8NFX"LTee)e3"-5jGZP4@BdSfcTH+VC[S'52i!)0YR"M6Kc+QYP3cPSi
+raTJ6ArJH*IiG5M%hPNim4TQKaqE2@cVZ'%Q@T6N8'UU[FHQ%)j3C-5Q@iNY21-)
+TdA90hf"+[3T-bRP4CUR1q6(pQrJ3K"*&j!j1GHr5bL-%CmJ8Vp)-HI#BMfSl"r3
+aej59T4PG5mJ+YdD(%NV-T@,'9#1$bH)#)*k)R-iSR2Njcr`E#%[33mAc"$-"fU1
+Adj2L-P6Plphraa*H1mk,a`2!DrFbd&RN6"BY%e$5KiR1+MfLe((AXc2f$iir"a4
+2#@Fe+c"fYS@T,!bpJcM&bLf-Yl"P&UDdX2XX6#d`lYF@TK'BG$,Y%CLbh-)8&KB
+iPRD$CDr*bU"CB)D`VQhN-C-KBkZXUHm$$[KBQQIIpej[q@D$M$@`JAQGfGNjc*c
+)RAMmh+b9VrQpI"daI0mPRf9QChCQjZ9Elc@aBbR2N!0,YqIe1HRmc2IUl,cmcXY
+"GRD@mG)A###[#b"kq&LqQPhR+1jYeX)*Gb&,4rK#EL%,i3X!@3$Bi3X,f'cL#SA
+mNL6Cm2r1NUhUD[ar$hkV`Iqp*@QVekAYT!2afp"YDf52+a3)HrdHpj!!Sce1YdG
+qD-e$[@jrNMd`e+I`+NHlj0C`0$3k&,Q2rqhEVaIP9DQmJ([Nql`4lr(FRXKl2*I
+X+[(+'@r0JhrSdEYbY%qZ(cRD'3NHe-1VTMbAbqPUmK4jfqLmd3e)fc@GqFTiflE
+c)P'h0e6LH@3j*$ZLcRUr*p,&BhShb"l2[q[Yml3LZ-ek8ej4Ec[MbIA[j'X&jB8
+L'r1lL[,#SBKhmEYkbj[bZqrS@06V(af@3d6V!Xp1HFMA[(lNrk(iQLJppm`&8Um
+eGDiReYcIG*9dVfd`rZUjCi+fAImIEkZr59,Ck3T2NSC)fal`KR6[iB2`Ii@d&HU
+2-NQDGf0I1HKfZ%,"KP!XZ2mkheffqM+rMG3UDZap3&eDKTTK28epE8-H@m'T@e&
+U&DM8Xc[CEB(D2h&UEdUeJpVSMhR-H%&pP92,T(*3Vi"#)l)+rC!!8rY3+K3DN9A
+S*8iYTe3S0#+VN!"1VF!rDGjT9DjkPm2PLm3#U9LIj&3lT9Dk)Jj2-#Uh*S-eU*@
+8@YhJ$ASM63kBp3BZU,rMe+Sie3&r5&0rbkR9P&VHi)#b9Zk"qM5RpU981kK@,LM
+8CcLeRaDVaeAI&DY1lFpbU-%4GXVHD$U(RZA8V5Qe!Y5-X'hKUkrJe'ddA51S,pa
+TAI8FfPC6L&Ci55aFqAK1(F!F"8NHGFKQZK,U!NiGb+MJC65#8pl!UGXaE`Kk@Z!
+0'8GjMP1hCe486bj2*1,`p9"hB&6C'A5(!UPBSHY#6Kh%U*'Sl!df$NmVp$bRlXJ
+bVmAMp+8L9@)pJ9-r!Pq@jNA+d,2SUMB#YErLe*hJbp+m8$8Y08MeC5Vd#dlGQ9,
+Yk+Fid['#qNY1hB96de@E34h-U,+ca3&bQ[S%Tqk+bN'DAfXR2CEk@+HSK(TNi#*
+1(8+TI3N9`ET#lJf990Z3!&@(FZTZ1Y866&%A(DjlhZk8@UP3'ce4X`)BXZS`6Yf
+$8[XV9&p+SlC!h9K1hE1$DQS%kMK1r5LP9LR8J01AV#UAV9j5aDPlY91pND3l'05
+2X4`LMC!!61B&kLC`kP#GQXkm$ZVHU!qPqA+&beA[M+4+CD,34%lGKe+VA#khTm%
+CmbF6&Y4*R,S[T9BUe&$BUU,DUIXTe0DU"KIUFRr)&!R8DC`kM&+V#68G,DM61AA
+rGLSUP@50XZXrAZ68!bLeNP$49c*eKAXGcDN(kY5)Cj'9$ET#"h'&'Me"P(Y*KGl
+BMP1(Ye1M3@GR3BpBCh$U`6cc'X1SfP+CTe0(F&e*j@YP`e41(FPM$6KEkj0ChMC
+d86@R(X*M$AEPd%a12C45lB4Uf9##1SV(+U2[Em8kLe-2ilV+RSLrfH`UeHRH-,U
+G'T90kS)9eh(Ui6c,)`eqCf2+mh5&MZ#k4RcHX+9V$DH1dDPGQDG6Mq5k4U)KfI*
+bRAS8TlDJ3@44MqA8X3VeXUT)[QkSjG4aP&T0U0eeJdiGhdj0e3fJeR(U"%UY*06
+ZZQ%HTdl8U9EQYEQZdRY4NlK#kES"#Kh(UC2EUCQk3DG1iCRAA6ISe+1jVYee`ha
+1RFTMcG30JETM128B(QYhhD$Rd$4+Y40UGpfJ8kIc@,[V"TdkJq[DA6ISZXjXTkE
+VKMYAFZSXRZAGGB2HXkRKZREA$6Ve@*hDPANIjp6CA0IZZN'RcZ(8lVT"le214Hp
+EQRqVhHN1%&HfHQaq*kI1Se6D`E+`S$SiG6kM+KeL6c6G%A&cDLfMqYbNdj1*p84
+1V91T5RpS%r8iPGSm-T-14MBFMdN!DIj2d*YhZYfT&#+kRX5T#bLeLP,4MdlPUdl
+p1+@L0qm-`r652U46&hC3dckN8dqJe'T3%5RTXTP1kH084j`DLcDjR9&RLATL2"Y
+!aA"*+KYdUV-p9SFVL6@Sp9SfZ*V5iai'eD9PZ8Zf4LN)9Cp9FP-UQ5`"090&k95
+2TLZKCR69U3dGe(5qkY4',I-!G2MF9YFf`+P0lG5ScmTARHV9XN'C)%aRJdip5FY
+AU113!01HTe0p(G5dj`8jeDrP%-B[k[dKPmr-)CdDd+KqC`66,dQ(0DK"6D'`-q@
+6DkNK,BG)Xb%eJ3&UL&2$QRZ"QLb8hkBZdR3Pe)bMk&3j6Qea1c)9J%k0D)j#U+P
+L'G3`TdBeA521KUk1[Nk0DG5Sbl5ZYkR0@ZB4DXE,G@U,PJh4aUK91i#kL&-AakQ
+qU&,GP+LYQ#k6j[qah"G&6@R0!S'U6iQG6+N9[QMA9!5k,hU(q"4+VI*&ZkBL$1U
+TP&VYLcE)k4P#+(3PTjj'UC@qU1`*K*T0M3cUk5a@dSH#SFM0hZ5%8jhH)6j$SIl
+&$S9)C@je41TQFqUCP)TX32A9eApGc+QIS&55$CRqUa(V@CcU#EV0#5)MeNpbK4T
+*kUAbG3kRRXeMEA5J*GST,'*YjG4285VbYF%4p#a1G6FlBMf(Cekki`MUA%lp0&F
+Sl3kJkRhPcl46)k&Nbp'JRXYc+"**M@k"URGY2mZcJBaM@pQJGpR2ip3@+ad-kZH
+iVLe@+a98[6IrHFbA5VApUNJR#S2BJ@5*M5cr*UHH6kR9#M8NBcH%k3dkp3YkV"(
+Ce9RB*+JA8'SPlI1%NNefSUXq'IP&&QZphjfTPK(VYcRe3UBVT6T-r`,e@jck*4B
+VHNU1+)C&N`Q,M[iCR(S4TIBP5HFNR32AKS3&p41FHM&6#)R3R"B@fD$hAlqX8F1
+Y5Y-aeIRq$UGHSLP%U0%Q9h4$QS2kA8kp9-d'K@U@V`RUCET#eLLf39h56Nfef3c
+UjET#9[[&S(k&qC!!3Xe-k#jCbUPIe4@bmY@JINeA+1T0YU)5e#[8@-0%Rdc[8+G
+HbDKd!$29"J4e'DGq28iP8m6S9C5Shf"81VDj+GC[aUQC@1'8jh$UYaL9E#"ab'J
+IT1VA0Nlp0U-fZK`0-QDqN`SKeXp`kP9aDV2AQ@U+JRSZThj(TAU#T1X96(UH3If
+Z6Sh9TqE,Kkck,+FZCBk#bMA6M`Ee2%kp@SXeLPNP5pI`QS-iG4Pc5QAD`a9GE&9
+X,NjYBl(51"eS5CQ966fRAY0"4324c)Ec1I9l(G5)Z3qJJhSYSbTGCBa&@0l`48k
+pMQ8HjP()U,fh-HAPeh,UpC4U$rLkKJi3ki@FqRf@HD"QfZ`'pBCiV*N@-DKIiY3
+E+E8#9'XD4D(UdrBhk95c-kp3,qE8(l$-Sp48AGlQl(XVTpiFecA6)NDXPh$U,C4
+DMKdGkCDSe(E5dPkFqN-@DaJYae60Um5kK&0[CESUKD(9IS%hk$X`PQY84c3%DC-
+0@&#rckNrBJV*Q#V*1%UJ6Tr"ZSdj#UJC4d'X0h,UlI&BZabP)pB9c"Y!lA+83*f
+(8eIUe#j(q4URhX&bL&,*pJ(6br9qqCeaAEXFT81KZp3F3SXRE3k)pHZFqQ0'MD$
+4fdhp"UIHcDNB1dMe$KFmU'IH25`E)R+cJfkN-V0"lmcGbl)"d`fTpM$eKPXip6j
+'M3@l(,CYiH),129qTP#,dimD)&A03b'pJr86l-'4DYf96Y4j)BFrh6XmP90r5UP
+dki1PE0Z#T8GbkJ1-#LDCIr@EHj@'V2SHTcj)U@86Cml1E(""$ZNEV4kL90VED-)
+FGQGRfD$q6+HL('e+GFYdkX-U0HEh1lbB9dVeHRAUceRQS8YKp4[ACYiMFDSM(*,
+0k3%MeNGCjK'UE18VU2Sdm'0-9p,E8*)KeE1jRP0AUG4!e"(`4Eh*B%(9Dkr96#%
+%fH80JEV6129a5ZfVp&&#f,V6f8SaU,pJX8*6XLR1Dqi5Qe+f0DIq8U@5QCkdj`e
+CG41R2N'TGPm-3cDKC*G58HKd6[d9hIe@K4NlTpmDR-9fRpFipGFXm`JefY8l[)Y
+6Rf5kJZTcN!"m5'@HhTYrLZNDF,SLjL!JSGBISdplr)Dj&rS0$HPji,C"+rAUm'P
+'$F+(dR2cE@1Up,RjCjLZK*UHq@iE8rdj6Rf@a4U+C&T4*-[elA5rCGP!((PiDJ#
+HC0lGR2Sl&UXbJa@)Q,'#HJqR2UG6c@kHSY"b6RfHCB2LV3iXkdUjPdlp2A-88LZ
+M2%`lbVfFqJ*6+")FRKR$K+1FbDN[-S9)a4"UF$Z6i`1JkY-H,c'&BN&raVj!2BY
+6AkEq@K',T1S6KEVSL--jp3p-)F90V)4&0Yc2UDpJCja8Hf%&UULBeaSmE"[6pa&
+1r51PNKeT,J`HZUbqei1FqLF@+kMZQ08I![8K6Re9TEC'r#(6KBJVhrPR6[dcYYT
+*Y9H@bk3(d$92ZCT6rd+TGYRPb!a8)PrekB(AiP3beV14qPG+V3$9h@"1PLP8IAV
+JAc4G(@CPZ)lk0l,&mlMb!G-mFMd+[3MG"acC2qaUkR#8XAU[per(JRU8[AU'dk8
+#0f6jA5rU0HAVK$VQe+SChX8Hp`bbhDXp4Sekm4dVP5h'p2fG8X[RYSDa,fi$8D%
+ZAp1E8rq08JG-#!AGhUJh&(6k)4B%lSKJfIA2[-'Trf!+MCXdUriNM`[c`#@&hU$
+8LKQB9-6XUbQ43Af68ZfcjXc$r'"+@B2k&P2Sf"KQKpcBSYHMd"T+lDp4jj*'qeT
+b"p8Q-9dR0@1be%SpJfUMe$k6DQSQ@1QDS2C5Bb@Yk(r'ZT@DVq'`hc-A$F450YK
+k-dHCM+SVibJGe$*+VBDXFl&TZckdH!2DS2CK#YA3rC4Q[!DeR&,l+VTDk@G3+bL
+ehma3e0[J45m&YVF1De$YM$TZ8Sh6jD1q9k"@XQ`B0fQfTp'Vl)XUCN-9T@icEY)
+mY*AQHZ6!"PFhU0A-+FIj[5Lp0MUPVDqH3h0FXMHmAYB%Y4qPPXfD-bjYAJPUIjB
+0%c$R%3UQh0+JENfTPF5-*k&+53CX8,GKZNi)q80b$I`F)lS&AEGP196VaFE6PNd
+j0)!TK#U3!iG54BT"(FMmGBBR'0[XVpXaK5CkRDMQ,B@@[hN-Tfl2+TX*-dLHTdc
+2L(8(TQX0fMa4l(*p4pG"M$VHkIH(3KJ'lU(ZU1VUDIDL"0LBH4pKX8ld4Ra6b5k
+aRPKhSY6Y5@@M11ZiS(X#@QGB1+8(EP"hCJT0$[Q98[iGKAC4UbKi`qBX(maLRB)
+GFf5m+CAPEl9bkUiXeZQS0$E(1S69P00$,5M00p@8Zl'+E6Bf#-6N9-BDe0e94d%
+0j@a-TEP"hB1j9mhd1FT1iFQaS'XGHZPpFhAURL`E803i`rr-KSqbc*[MDC`H3M2
+kR5cILe@(Fk*BPHb8hF4CePH(ecmlMe-rTXDUU,V*8BDbc#2e8,SRBP$hCPPZPAM
+-8H`,1A8IPRP6Je&r1Y10@2G9&8)$B,0#qkRqkPdm!m2f'l0KQ0Vh3T*[pVcpD6r
+2MQEA0,RqN!"4[NjU@f6DbI(1R1d!FL(%[#-VI#1(S5"+"GX@[Ta[dEBG5"3kBJQ
+kYQl55M@T9cr3AeIS)%SYEfef@Pd[k(V$@IGakR$XqTIQ65Dl)ZKHkdj`Qrr@hEP
+#"e0Gqj!!MA(TFKkkm[kVE346#'14`C!!KB@ZblP#)a@&&PE3#3`VK`+eCr0B$iR
+RN!$I@jr*S48meN-e+[&Abr2ZH'i"TikLe$l+l)#9$BMe$NipM'@$FNK%1Pr[R[)
+DTikQq9U'$AqC2JUbJ8p&f!kR9$ZS$RGpUQ6$j[MG128)GXq"((%1)j[)6@Vl23H
+f-G3E-0HVh0eJ8IemPYef*0Zq6lDHTkd5X6l&U8HaH`kS3L25e*FjG5b0Y3baCR0
+)Mh9FBY0rXK*Yhr4['irpqe,Y#MXQPC8PL5Q&k[LFM@e#h,fFXZ9$9cm`S)al`d4
++Y@-4CJB,(hUF8bI4MIJ9f&!rl1$KPZHY[Sc[FVC00ME(QlAAkL9m+l0Y#U1LEL$
+J0*9[)VFGcE,"l`eidfd+k(SEehAUZLhekp#)YB,(HNaLhlbCj8[XR$TYh@llG@"
+-8ihLe1PV0mGh9VhY1q"Y-cEXYPp,lYK5EjZjGYpm+GCC'cELVipe2+HbrDpPf+l
+DeHYYhj4XBrYIb8l@BDJGF0(&"MCLjG["EA6rDfXC0N"RBq8li'ec@1h9J)d[rR6
+YGHdfhq11-MHqE6UVd"3Hkca@HkQ6N@B&i1`eR&2Rdpe8f$1A+D+)VRa'heDEf2b
+8V1EE0crCkPJfZ+*SEDDci3VrF6`EMU1aiSD*D#BE1VCdf)lIh"(KX5kJXGTGISm
+cL%%fUfkiLXIkF9Bha("+4c69Q#0CrKXHkd)fFm!kUC-@a8Sc"bGSFk+CC$$Q4'f
+1MSQdG*D[iY36MCNj+aXHj94RqabEPH8GXGDchJCbU(-Z4mfKmelJfH"L9'53!*A
+MS0jip(41G6-I`Ykh6#0Pf58(h-1T(PEeaU)4C3VEc)Cc"cl*U3h-KpL-BmU(KMa
+@cDQ0e-X(S!XiGd)0TP)#SH#k5CYPUbqpQHG3%k@@cjYB8c-qNhQArSK6[C5kp6L
+kmEM1hcQ#!HSeR(S5TIDGiSR1D*eD3q#G9HqPI),3jY[Fcq2Ci-G&)P,YNj@Ndp1
+p!9V[p!3SY8UKGXfAhmkT3CeU,B%(P@mXX)8SP9`aSTb3!*)F-!@96m$E`T6D6k&
+LePE*ZlHjE822rJ1R,Y)95UhEN!$DkSlRHk0YXY%I-LGCACF2j03)TIDRY`8&B!q
+BMGK`UBEH9BUb@$%!hlepj(+qlp!@Be5fLA`MY9Rh"U[5Jd*hF'T,`P&-DVZM,+B
++$84hD&M%'kiI4TE!bGl'TSkSS4#r+X$@5UPpqAe'R6fEeAV2jQ4+aDDZU!HE-mb
+DcBMe&&B"S'M)9!"Y*llb!UHHbLB9[+MNXj-+F5U@1!fb5EeUX(9k2*p89Al*650
+V$hF)+HmI5T@,@8EfAFQqUpKh0IXZCpppfIG@l(X3qpkHI@r$[[[6EqRIP$PKc-1
+a[kY6HJbBl@+rEkG-T@&ULreZBpqpf$HY`Y(286SeQ%"P[qr%[[GMhcZclehBpf"
+P$JV6+ZchAGRh%+E,'qchJHchepR[&Hbl(rZl0pR[Zl2[2C5*)XbdXYphB0pp'1m
+YpVf'rGeZl(Y2pVfh-Nf$Q5,fqel+r!rUDD95aXb!-Jf!15$fpeZclk(XHj3bBi"
+j'[El-"E[hj8TER4%P&i(URUPANI&VG65U+'9kKM6M)alN!!b*B*jG$*TlTL$l@r
+AiGGql$)Pc8pbYbKed2!jJXafR,''kSM[3r$l#R`I5LBUm+hSKqrKC0i%h`H3!$i
+3[NH6H3Cm(diQ&2"p-+P%mEdrQEI"pdMmrGQ2VV50)C8"![d"GT+4ki(JZVS#Z5Z
+BY-Gd&LISC6X#[lrkb#hB!NDbGHZ%EVNlR,6(Z2qKfj')rbNKJ(l*[-YG"+8pH*5
+J)Hp8h9Mmh#qkET,5(VD(#"Cd1`Ur[mcp`Y!YGa@9pM$I)fM`#e@rC0lPlV25(UC
+r"!ejTqV'mPl,Zqb&@0V$**'B)Hp-hA)hDQN2Nd*L#Geb9h*T$lFaL5GdbpcTT6e
+-h`JDG,X(1`I*49b'EVP,`E5(1CRrVpYBTTZUhcJb6EG&4m5Yk!LI6ZUBZee-HlK
+`4'bKBqkD-ZhK2JC"K)jU[CUS2l,hR@N2-e'#!"f&!hQBZc40HjKL%P[NBHlf0He
+KeNR`N!#(PSpdAH'Q2H`hqarprMIrc2j"pKiil@'55ba4cqBZNY-HTMX%%h9ipLB
+kl@(Q3c#K@rBU1qeY,jc3,AXAR[Cf%%lSPVe-6hZ$4"1kj@lMdpk1`JIG@"pDe5e
+hRCrf2[+"ET2)0S2reZdKl(JQ956V2fXqNEd28(XlIDLE)+$rVXir2,T5UkF02A1
+A#fT[Cp'$RPhkP@CqGK%eq0rDqC1%IYPV$V9(VJJ9-rLhfJpMm`bDEYPl%VA(VL6
+9G$XDhlF9pCY-pSUm1mma"E`*kAl-DZ`!CeGCkMVQ,Pc8hT!!$h@FLZm+I"q$ElX
+i39IV%N6YlIDKVY2)aK0m6mI[98)"AGAkbp!eGb@NpREr8&Ia3*iqMahCl&*2AFr
+FrC,Dfd-ii$mcb2BBI-m8$Z6Y8pMGcZiBADpchT(f&!Eid5cS1ekNi%Zjfc#epp%
+2p482k*QXlh*ADfT[V`rd&#Ei6Zk16Zep6&MJVi)%IBYe(VP0@'cKUqVm1CXr92A
+0h5DU[Edrk)qmeaGjkdbY,j,8+hF9UIEf%52S05#mYRpQk*@lae4lqiS4p"Sk9ZZ
+E(8ZfJ$ebLkf'l"$MG3UEmp6b,AXCU[Ef-r46pNQmUq0Fk$%&hl1Kal3YZN*(UQX
+I8mIFVDVD'bD)d$(H&qc8-A8&TrEf&d2Sk!fD1ZEZHGAH!@))(5erc&dBUceb(lF
+B`PI8rXTkAdRI,UUpJi301XiMfrdDal+kYKr9Xh&XPdqQVbV9hR$4KGrRlX29hX'
+L#aec&qYUMpeC,i$`qk42jQlSe4kl,er8i*2[ebrT+efeGiMS`Ppbp`CVle!K4Mf
+C[XK'Hk0%&cVQEM,@hQ'#$"e6epjUEl6S3XIFhFVD1eb)iBrTLhLeGi33Saj1hqL
+V[6&#$(p-A`fX[51&'$UQEeV5hP(##&p4j`hBIL00aqa&eYSEDqJS+*Jh1*A0Rq"
+EQ6I!Yc*[F'T+[paYf0SE*lM3Vp#I(bqUd#ph,lIf*SJYp#[@941&&[j4kX02%Pc
+S9qLl6aC9k*HlUeal8i3@rPIUXamYY-Lr8RppUY!LrdVpG1aN&P2SPlZrAA[6K"E
+j9qUIBaHd`-,r5Rhc'B),r3VpmTP#LrUee#HI*E6`[e*r[%CXS9qaIMT@D1&rTAl
+iE+'&IU8qq"cKJhic&3IVTHl*eHTATl[V#JMYc@93&UmC$pf(8``)0`Ddak2Z,dM
+%`fk!b"IBmm8)qAA4dpSmJDNrlKh#rSZ#rV8EmiRZdbM%8lFTRZD423Q2QaJfj#I
+E6kc'Jcfdk5XUq6YHZ*!!RdQpF,mmd3ZE,,15,4"&k)ApXXj`ek@el(eF0+&A[Kl
+&c4&L#,e``Ed6fC@kR9pl*iJNp-+P2GC"h1TcL#6m&RUPlTRAhSQ#LIa+hH@Y2DG
+!`QpadATaXAbp+%)[e)ZC`jEMM`(%$hU4[Ih@*GlmZ385rNAd+[LA4c5K9llqDK"
+)e$13!#TeKQcm03SQp$+23SmrGT@0%-*[-bGXajpA)&&r+CHQjrXc*iNQp-VhCpL
+eJ8+)qJ$,a1[*CFMGL[N&%RVjRFS"dGN-#`JNr!$ABZHl5C)8&%M8"jQ$MZ-[*)V
+3LpaTN6kZ2Il#!JRr)RS9k[&&)JQp@Yb1JS2*!SPkR1K9'0L+##6m+h0%IIa&"4*
+k49hjCJGH6#"4ca#p#[h&CS'%hq+5r')2Yd8NSCF[U[6dZr9D,'c3Lpe*SqT9lSY
+L2UPiL34Z#40$k)9V%GrCKhbb+%)[HMYpF4rb+D))[DTaMD0FZT3*)jjL#,dUIEK
+$,a"UcM[#DF+)r&*ZQ-F&dmhHEX91&blSTGjR`Hi2dZT&q!'CB-`ElKR#!VhQNrX
+[%lSYI6LR'h`ANal&29YRLLCd)rlEXerV%d)+hA!bIribLE2%#VUY[,,(*aT*`C2
+eL8q+&A4EPGG0bEI'VL-AkF10!@)*h9#[06L#j)6iE%(a+E'#ELpGd&-(PIEZR#1
+Dd%haL9+&r'P"K@k48'l4cQG%%lSTp83N8MM3j&baJQj5[-jApiUXpf9FTHV2'Ga
+RK3Qk+AZbX8r6[#YV[AiY4B-q6kb3!(IEAGIMFbh&K9+I%cEST[Daf&eRQXq4V4B
+iM$+3!"Y%r,b`3,IhpDT@p!V*Z!Qd@l$c44&kdIb+b+lX')(d"6'#A[[%lqK3IFc
+3+hk2FGCr,hKIVeTbbI&rk6DZCQhGNmLcHVqlCm,[LiCZ%mKPfNAp*Z,lFC'"IY9
+82dHqSh+KQ%'rLA(I-(d1fb4`5Ui6elpfjpqAa!JqYr,YIVLK9ep5mMM*[+fVZf#
+l5(LJPe)I[hKQ4hhmiTQQEY@`jZD5d9h-S-UGXSK6R*!!EfEG4JlG99BSC3hLbm)
+&IdMU"AmJHN@EA0(Z3[-5-B*HMleDm&p&VrbiQR5T+#+rU"m86jZm6$#K9f'Pba+
+aK"m8"r3[&dAN9k@L9r(qZkq)*IbJ@)Gp95cK"e&[EKf'p$9a4(k&L4X8pK&G)Bc
+3LjjQ99M`Fk8S`Jq)AZ3#3%`jGq[eG@&%IY(6X!Vjp3f4K&ipqI90BB3I01!-G)G
+X(B1Z[Qm*&r,,l)-eZK`0-Zkcc2R"Ycr3kcM-8e`V+Y#YfHXX,0Dk5YLJQqN2Z*@
+"E"m*j[Seha&'q+qL9k`qhe(iVLK#VbT-Q[9X$&`UM+JAL&ii$6R[BeH,)[+,lS0
+f44IRqN[,K"(q4A2,J68ChBUe#52mJ1Q&*8AGHPdMQXL[51iZ@GaU,iM35pQqKiA
+$ZAVh@P'%(e4KrcJj,YAEQ$9F3KFVj*GkPikKPchJHfI"l2@'AXFc(3l%lb[rF`j
+Z!HVeUi3#G3jdl&Q%qAhK3YiPjpj)h[8XZV[KIEh-2"-1p(-US&pablSNhILKIS)
+#hI,E2#AT*Y'%EY98Ym+Fj!q%$EUPIDjR)Gl0bIT#q&"AP12UmG+k,L9Va3Te4G)
+Rl'%XD#T-`dR5$cIUe3!pb2fBiS-kAaNT+JlNhbTFb$0,,dFd"'[,,8CE,SbSmfA
+X1#r9q6m5AY6jd,'RcVp0'&(R3kqH1[pfi82pBpE,d+qRcPmKR+Mc&Gf+G6l*@V&
+%R8pe)aI2GQYhKeK"0plh62YF6jerTr$"jp4lQpI@&9L)8#UFlc,dfl+()U(MH2a
+1iRK[Em,JQSkp#B0V8VT'X05ZT1Z2"4'k'[XJ"TqCUJ1*VPLYQpqAG,G`S3idI6d
+L0cYNPa-Aq(FVGJq$#L2f9pLa[EL`T!r[AZ&#RTPkaB,[G1a)Pd3-i3XY6MmkZiA
+jdrXrd%XF--qjMH'r6X`4K4cqr,kNR`JIr-c3MGjhA(5dR`SEr#bK&p3LpiEjF`H
+V2#"Fd1XY4Cj"#Eh+*XkFAHb@5p+$KPkpPPem"qN[pQEI1l2[`FZ@[p@+liAdGqN
+0p[dQqr[Gf(G1lhdCCaMl&KEN+jdREm*pKYP0K!q*)[b&kS@KYDCX*IdciB*HDTp
+TV9ia[prKa3d@f3i`ZDj@E+!Al9FmE$X"Gh9MPX,S@caXkPH*qHcL0LK*qVR`36q
+clS0qMR")cZqrI84iS*qL'raLSfpJcMcSN!#,GGqMSSUm8qE1&C[1CYjM`SCkq`6
+P)UAHEqX@L$S#[UJhPhLV'&695G@&aC[+Db4%6hfm@TL3!"GUILIb1PPrp9AQmd1
+4r)Mqim+&qL[T3f5qZF(VphK$fA`Mh@KGVbehV,kR@b(2k"d,4IrrT5LL,VIlBML
+b)*6E@L9*6`JMI!%AjcMpaG2@IL9-U+mfe99%YfKa[p+[K3fkQAi'hA`1iX6CI(Y
+5Z1!2Ij0HapF1DrdXi(4&mNF*i6h&S$Zb2Kh66HhlrA-1dEYXpDAAF$e2`ZmhEFP
+(k0S)lXe[paPXTl5Gq-S,q'l#hj1C5E2IJrRRKY,&Glm42[3G62f#k$Z8lYem@TK
+3llAI(`ipXrT9%Ie+pbBq)hc3,qRcPD&)ccS4k9RKJXmRmme1HS2$#qGK5Vm92[L
+GfGp8lKX*42,jpM[44$e)GFY[)C+Nji34r3+PCqG`Kh*pZqFC9,c3ce6Rk"2p!M*
+hL-'RI,rJpm+&HN,a1G8[e,SLACG'JX0l$X0#M5Y)b,mYr3r583ieZ*fjaEN[#KI
+mcTbcL3Ap23fEPi3,HMf[C2Kf#EdUBT&#cjkmPc[ddZDbpPkfh,l`hAk01Tq9k0Y
+XdPAe$k9IXlRHUe*k!m@#l`r#KRT2[8Yd@b-r-3m5maB2AhU&340hL4Va9'0LcBA
+$P&bjr5Yr&$EiD8*rk1@1&IG5r%QiS*HCVj(@L$q8lbT)dUY'[UUq0D!MRR+Cc,%
+@`T(q,&V3hqE![2%U((1Be-dZZa`p"e$p4BbJQhVI!lj2K'k26JaRG#-R+14eHdh
+BS0Y$bX6MYJRG+U#EZb&r&BXNrGA3EG0H$Q'!IY3h%,q6I+pm'R-!T+-mF*h[1I+
+c4q6pLk'RfRra-6d%"I9ESZl%Yk*[h"HT[PZ2dZU%J4hk9SEPN!"bdQ0@BTYk[k&
+D*jbMA**M6m46TF46D$[BYYaAU1VH`R4ZaVi2XT1Q5iI#iHLf,AF6YZZ!r&*d32e
+a[R+T5@9#"qcYJJk&&4%fp4l#,Ad[8ipNA[46p%$G(I9fhCjLfh,[i2Yj3I1cX)E
+#TYia+!l)LbmVPeP8S3298@pK%ec4"L9EiNl"a0iD93Ge6deVfj!!eD2`I5VV0jf
+mE2AP4%G9RmAdGe1ArXVb-8F!"a%l'p1jBN[F)jM64GfASqUc34I848(PmX8qDr-
+&BbkP25ffa0f"AI%L$aU85dI,eXE,lSc1ak[H$DMUVXDEL*-83iHX3#qb0bk3!+S
+C@M2CVf33rJCel9aX)ljj8-hd#&12[0lN-UaH0A-mM@X8Z[*faYmeNEmK+[dI!%-
+@!!!"!*!$!43!N!-8!*!$-J!3%,+ji88PU"C#9lr%S6$K3D-amBS$AU!3i!mbU"B
+N$@aTBR*KFQPPFbjcDA3#!!)!8dP84&0*9#%!N!B#!&0*9%46593K!*!BV(5`D!!
+!Vl)!!!&'C6!m$4HR6jpSeThf'IhH4"jdcb)%5ZNT3%+K-5mmdH%[mLim8b%!$!!
+5G%B#AMm[TmUFlclhSNj2T3!)Ejq[*Z3I4UV5Z$a%5Q'c",1a$lB212mpYaMm[N3
+HjRTbcb)2U'BqJblK3ID[%!qdrdmaTjr[2VC#r0Uq-%C&UXmL$dTQiJ#3!a!!+`!
+&!4J#!*!(!`#3!`%!N!-"&!#3!a3!N!-b!N9Gf"-D!*!$(!!b!!"6CA4R!*!$#J!
+!rrm!N!3#4D@SE+`: