#!/bin/sh

ddq()
{
	dd $@ 2> /dev/null
}

ddn()
{
	ddq $@ conv=notrunc
}

store()
{
	local i
	local n
	n=$2; for i in $(seq 8 8 ${4:-16}); do
		printf '\\\\x%02X' $((n & 255))
		n=$((n >> 8))
	done | xargs echo -en | ddn bs=1 of=$3 seek=$(($1))
}

get()
{
	echo $(od -j $(($1)) -N ${3:-2} -t u${3:-2} -An "$2")
}

compress()
{
	if [ "$1" ]; then
		gzip -9 > $1
		[ "$(which advdef 2> /dev/null)" ] &&
		advdef -z4 -i100 $1 > /dev/null
	elif [ "$(which xz 2> /dev/null)" ]; then
		xz -z -e --format=lzma --lzma1=mode=normal --stdout
	else
		lzma e -si -so
	fi 2> /dev/null
}

add_rootfs()
{
	TMP=/tmp/iso2exe$$
	mkdir -p $TMP/mnt
	mount -o loop,ro $1 $TMP/mnt
	if [ "$2" = "--array" ] || grep -qs rootfs $TMP/mnt/boot/isolinux/isolinux.cfg ; then
		$0 --get rootfs.gz > $TMP/rootfs.gz
		SIZE=$(wc -c < $TMP/rootfs.gz)
		if [ $(get 2048 $1) -eq 19792 -a $SIZE -lt 1912 ]; then
			store 24 $((0 - SIZE)) $1
			OFS2=$(( 0x1000 - SIZE ))
			OFS=$(( 0x7FF0 ))
		else
			store 24 $SIZE $1
			unset OFS2
			OFS=$(( 0x7FF0 - SIZE ))
		fi
		printf "Adding rootfs.gz file at %04X (%d bytes) ...\n" ${OFS2:-$OFS} $SIZE
		ddn if=$TMP/rootfs.gz of=$1 bs=1 seek=${OFS2:-$OFS}
	fi
	umount $TMP/mnt
	rm -rf $TMP
}

add_tazlito_info()
{
	HOLE=$OFS
	[ $(get 0 $2) -eq 35615 ] || return
	zcat $2 | compress /tmp/rezipped$$.gz
	n=$(stat -c %s /tmp/rezipped$$.gz)
	if [ $(get 2048 $1) -eq 19792 -a $n -lt 412 ]; then
		o=$((0x1200-n))
	else
		o=$OFS
		HOLE=$((HOLE+n))
	fi
	printf "Moving tazlito data record at %04X ($n bytes) ...\n" $o
	ddn if=/tmp/rezipped$$.gz bs=1 of=$1 seek=$o
	rm -f /tmp/rezipped$$.gz
	if [ -n "$gpt" ]; then
		store $((0x25E)) $n $1
		store $((0x25C)) $o $1
	fi
}

add_win32exe()
{
	$0 --get bootiso.bin 2> /dev/null > /tmp/bin$$
	SIZE=$($0 --get win32.exe 2> /dev/null | tee /tmp/exe$$ | wc -c)
	n=1536; n0=0; n2=0
	cut=$((0x98+$(get 0x94 /tmp/exe$$)))
	if [ $(get 2048 /tmp/bin$$) -eq 19792 ]; then
		o=$(($(get 584 "$1")*512))
		f=$(($(get $((o+0x20)) "$1" 4)/4))
		l=$((($(get $((o+0x28)) "$1" 4)+1)/4-f))
		store $((0x1008)) $(printf "%08x" $f | sed 's|\(..\)\(..\)\(..\)\(..\)|0x\4\3\2\1|') /tmp/bin$$ 32
		store $((0x1054)) $(printf "%08x" $l | sed 's|\(..\)\(..\)\(..\)\(..\)|0x\4\3\2\1|') /tmp/bin$$ 32
		printf "Adding Apple partition at %04X (2560 bytes) ...\n" 2048
		if [ $(get 0x86 /tmp/exe$$) -eq 3 ]; then
			n0=136; n2=2696
		else
			n=4608
		fi
	fi
	SIZE=$((SIZE+n+n2-n0))
	printf "Adding WIN32 file at %04X (%d bytes) ...\n" 0 $SIZE
	[ -n "$gpt" ] && printf "Adding GPT at %04X (1024 bytes) ...\n" 512
	for i in $(seq 396 40 $((356+$(get 0x86 /tmp/exe$$)*40))); do
		x=$((n + n2 - n0 + $(get $i /tmp/exe$$)))
		store $i $x /tmp/exe$$
	done
	store $((0x94)) $((n + cut - 0x98)) /tmp/exe$$
	ddn if=/tmp/exe$$ of=$1 bs=1 count=$cut
	[ $n2 -ne 0 ] && ddn if=/tmp/exe$$ of=$1 bs=1 skip=$cut seek=$((n+cut)) count=$n0
	ddn if=/tmp/exe$$ of=$1 bs=1 skip=$((n0+cut)) seek=$((n+n2+cut))
	printf "Adding bootiso head at %04X...\n" 0
	store 510 $((0xAA55)) $1
	while read adrs sz rem; do
		ddn if=/tmp/bin$$ of=$1 bs=1 count=$((0x$sz)) seek=$((0x$adrs)) skip=$((0x$adrs))
	done <<EOT
0000 0080
0178 0040
0270 0190
0600 0178
0800 0088
1000 0088
EOT
	i=$((0x600))
	OFS=$SIZE
	rm -f /tmp/exe$$ /tmp/bin$$
	if [ -z "$RECURSIVE_PARTITION" -a $(get 454 $1 4) -eq 0 ]; then
		store 448 $((1+i/512)) $1 8
		store 454 $((i/512)) $1 32
		store 458 $(($(stat -c %s $1)/512)) $1 32
	fi
	mkdir /tmp/mnt$$	
	mount -o loop,ro $1 /tmp/mnt$$
	if [ -s /tmp/mnt$$/boot/linld.com ]; then
		i=$(($(get 20 $1)-0xC0))
		store $((i-6)) $(($(busybox stat -m /tmp/mnt$$/boot/linld.com | sed q)*2048)) $1 32
		store $((i-2)) $(stat -c %s /tmp/mnt$$/boot/linld.com) $1
		r="$(sed '/rootfs[0-9]/!d;s|.* initrd=||;s|/boot/||g;s| .*||' \
			/tmp/mnt$$/boot/isolinux/isolinux.cfg | tail -n1)"
		if grep -qs rootfs /tmp/mnt$$/boot/isolinux/isolinux.cfg ; then
			echo "image=/boot/bzImage initrd=${r:-rootfs.gz},! autologin rdinit=/init.exe"
		else
			sed '/[kK][eE][rR][nN][eE][lL]/!d;s|^[ \t]*[^ \t]*||;q' /tmp/mnt$$/boot/isolinux/isolinux.cfg
			sed '/[aA][pP][pP][eE][nN][dD]/!d;s|^[ \t]*[^ \t]*||;q' /tmp/mnt$$/boot/isolinux/isolinux.cfg
		fi | xargs | ddn bs=1 of=$1 conv=notrunc seek=$((i-134))
	fi
	umount /tmp/mnt$$	
	rmdir /tmp/mnt$$	
}

add_fdbootstrap()
{
	SIZE=$($0 --get bootfd.bin 2> /dev/null | wc -c)
	if [ $SIZE -ne 0 ]; then
		SIZE=$(( SIZE -  512 ))
		OFS=$(( OFS - SIZE ))
		printf "Adding floppy bootstrap file at %04X (%d bytes) ...\n" $OFS $SIZE
		$0 --get bootfd.bin | \
		ddn of=$1 bs=1 count=512 seek=$OFS
		$0 --get bootfd.bin | \
		ddn of=$1 bs=1 skip=1024 seek=$((512 + OFS))
		store 26 $((SIZE/512)) $1 8
	fi
}

gzsize()
{
	echo $(($(hexdump -C | awk ' {
		for (i = 17; i > 1; i--) if ($i != "00") break;
		if (i == 1) {
			print "0x" $1 " + 1 + 1 - " n
			exit
		}
		n = 17 - i
	}')))
}

fileofs()
{
	[ $(get 1024 "$ISO") -eq 35615 ] && x=1024 ||
	x=$((512*(1+$(get 417 "$ISO" 1))))
	[ $x -gt 32768 ] && x=6656
	stub=$(($(get 20 "$ISO") - 0xC0))
	dosstub=$stub
	[ $stub -lt 30000 ] && stub=$((0x7FF0)) && dosstub=
	c=$(custom_config_sector "$ISO")
	SIZE=0; OFFSET=0
	case "$1" in
	APT)		[ $(get 2048 "$ISO") -eq 19792 ] && OFFSET=2048 && SIZE=2560;;
	GPT)		[ $(get 512 "$ISO") -eq 17989 ] && OFFSET=512 &&
			SIZE=$((512+$(get 592 "$ISO")*$(get 596 "$ISO")));;
	win32.exe)	[ $x -eq 2048 ] &&
			x=$((40*$(get 0x86 "$ISO")+0x98-24+$(get 0x94 "$ISO"))) &&
			x=$(($(get $x "$ISO")+$(get $((x+4)) "$ISO")))
			[ $x -le 1024 ] || SIZE=$x;;
	syslinux.mbr)	[ $x -eq 1024 ] || OFFSET=$((x - 512)); SIZE=336;;
	flavor.info)	[ $(get 22528 "$ISO") -eq 35615 ] && OFFSET=22528
			[ $x -eq 2048 ] && x=$(get 0x25C "$ISO") &&
					   SIZE=$(get 0x25E "$ISO")
			[ $(get $x "$ISO") -eq 35615 ] && OFFSET=$x
			[ $OFFSET -ne 0 ] && [ $SIZE -eq 0 ] &&
			SIZE=$(ddq bs=512 skip=$((OFFSET/512)) if="$ISO" | gzsize);;
	floppy.boot)	SIZE=$(($(get 26 "$ISO" 1)*512))
			OFFSET=$(($(get 64 "$ISO") - 0xC0 - SIZE));;
	rootfs.gz)	SIZE=$(get 24 "$ISO"); OFFSET=$((stub - SIZE))
			[ $SIZE -gt 60000 ] && SIZE=$((0x10000 - SIZE)) && OFFSET=$((0x1000 - SIZE));;
	isoboot.com)	OFFSET=$(($(get 64 "$ISO") - 0xC0))
			SIZE=$((stub - $(get 24 "$ISO") - OFFSET));;
	dosstub)	[ "$dosstub" ] && OFFSET=$stub && SIZE=$((0x7FF0 - OFFSET));;
	boot.md5)	[ $(get 0 "$ISO") -eq 23117 ] &&
			[ $(get 18 "$ISO") -ne 0 ] &&
			OFFSET=$((0x7FF0)) && SIZE=16;;
	fs.iso)		OFFSET=$((0x8000))
			SIZE=$((2048*c - OFFSET));;
	custom.magic)	ddq bs=2k skip=$c if="$ISO" | ddq bs=1 count=6 | \
				grep -q '#!boot' && OFFSET=$((2048*c)) &&
			SIZE=39 ;;
	custom.append)  OFFSET=$((2048*c+47)) &&
			SIZE=$(ddq bs=2k skip=$c if="$ISO" count=1 | \
				sed '/^append=/!d;s/^[^=]*=.//' | wc -c);;
	custom.initrd)  x=$(ddq bs=2k skip=$c if="$ISO" count=1 | \
				sed '/^append=\|^initrd:/!d' | wc -c)
			OFFSET=$((2048*c+x+40))
			SIZE=$(($(ddq bs=2k skip=$c if="$ISO" count=1 | \
				sed '/^initrd:/!d;s/.*://') + 0));;
	esac
}

trailer()
{
	OFFSET=$(stat -c %s "$1")
	[ $OFFSET -gt $HEAP ] &&
	printf "%d free bytes in %04X..%04X\n" $((OFFSET - HEAP)) $HEAP $OFFSET
	if [ $(get 510 "$1") -eq 43605 ]; then
		echo "MBR partitions :"
		for i in 0 1 2 3; do
			SIZE=$(get $((446+12+16*i)) "$1" 4)
			[ $SIZE -eq 0 ] && continue
			OFFSET=$(get $((446+8+16*i)) "$1" 4)
			printf " $i:%08X  %08X  %02X\n" $OFFSET $SIZE \
				$(get $((446+4+16*i)) "$1" 1)
		done
		if [ $(get 450 "$1") -eq 65262 ]; then
			echo "EFI partitions :"
			n=$(get 592 "$1")
			s=$(get 596 "$1")
			o=$(($(get 584 "$1")*512))
			i=0
			while [ $i -lt $n ]; do
				f=$(get $((o+0x20)) "$1" 4)
				l=$(($(get $((o+0x28)) "$1" 4)-f))
				[ $l -eq 0 ] && break
				printf " $i:%08X  %08X  %s\n" $f $((l+1)) \
				"$(od -An -N 72 -w72 -j $((o+0x38)) -t a "$1" \
				 | sed 's/ nul//g;s/   //g;s/ sp//g')"
				o=$((o+s))
				i=$((i+1))
			done
		fi
	fi
	o=2048
	if [ $(get $o "$1") -eq 19792 ]; then
		echo "Apple partitions :"
		i=0
		while [ $(get $o "$1") -eq 19792 ]; do
			f=$((0x$(od -An -N 4 -j $((o+8)) -t x1 "$1" | sed 's/ //g')))
			l=$((0x$(od -An -N 4 -j $((o+0x54)) -t x1 "$1" | sed 's/ //g')))
			printf " $i:%08X  %08X  %s\n" $f $l \
			"$(ddq bs=1 skip=$((o+16)) count=32 if="$1" | strings -n 1)"
			o=$((o+2048))
			i=$((i+1))
		done
	fi
}

list()
{
	HEAP=0
	for f in win32.exe GPT syslinux.mbr APT flavor.info floppy.boot isoboot.com \
		 rootfs.gz dosstub boot.md5 fs.iso custom.magic custom.append \
		 custom.initrd; do
		fileofs $f
		[ $SIZE -le 0 ] && continue
		[ "${OFFSET:8}" ] && continue
		[ $OFFSET -lt 0 ] && continue
		[ $(get $OFFSET "$ISO") -eq 0 ] && continue
		[ $OFFSET -gt $HEAP ] && [ $((OFFSET - HEAP)) -gt 16 ] &&
		printf "%d free bytes in %04X..%04X\n" $((OFFSET - HEAP)) $HEAP $OFFSET
		[ $OFFSET -ge $HEAP ] && HEAP=$((OFFSET+SIZE))
		printf "$f at %04X ($SIZE bytes).\n" $OFFSET
	done
	trailer $ISO
}

restore_hybrid_mbr()
{
	[ $(get 0 "$1") -eq 60905 ] &&
		ddn bs=1 if="$1" of="$1" skip=$((0x1BE)) seek=0 count=3
	ddn bs=1 skip=$((0x1BE)) count=66 if="$2" | \
		ddq bs=1 seek=$((0x1BE)) count=66 of="$1"
	if [ -n "$RECURSIVE_PARTITION" ]; then
		for i in 0 1 2 3 ; do
			n=$(get $((0x1C6+16*i)) $1 4)
			[ $n -eq 0 -o $n -gt 64 ] && continue
			store $((0x1C0+16*i)) 1 $1 8
			store $((0x1C6+16*i)) 0 $1 32
			store $((0x1CA+16*i)) $(($(get $((0x1CA+16*i)) $1 4)+n)) $1 32
		done
	fi
}

extract()
{
	for f in $@; do
		fileofs $f
		[ $SIZE -eq 0 ] ||
		ddq bs=1 count=$SIZE skip=$OFFSET if="$ISO" >$f
		[ "$f" = "syslinux.mbr" ] && restore_hybrid_mbr "$f" "$ISO"
	done
}

custom_config_sector()
{
	get 32848 "$1" 4
}

clear_custom_config()
{
	ddq of=$1 bs=2k seek=$start count=$(custom_config_sector $1)
}

main()
{
	[ $(id -u) -ne 0 ] && cmd="$0 $@" && exec su -c "$cmd" < /dev/tty
	append=
	initrd=
		
	while [ "$1" ]; do
		case "${1/--/-}" in
		-get)	shift
			uudecode | unlzma | tar xOf - $@
			exit ;;
		-a*)	append="$2" ; shift 2 ;;
		-i*)	initrd="$2" ; shift 2 ;;
		-r*|-l*)
			ISO="$2" ; shift 2
			[ -z "$1" ] && list || extract $@
			exit ;;
		*)	cat > /dev/null
			break
		esac
	done
	
	[ ! -s "$1" ] && cat 1>&2 <<EOT && exit 1
usage: $0 [--list|--read] [--append custom_cmdline ] [ --initrd custom_initrd ] image.iso [--force|--undo|"DOS help message"|filename...]
EOT
	case "${2/--/-}" in
	-u*|-r*|-w*|-f*)
	    case "$(get 0 $1)" in
	    23117)
		b=$(get 417 $1 1)
		n=$(($(get 64 $1) + 0xC0 - ($(get 26 $1 1)*512) - (b+1)*512))
		ddq if=$1 bs=512 count=1 skip=$b of=/tmp/hymbr$$
		restore_hybrid_mbr /tmp/hymbr$$ $1
		ddn if=/tmp/hymbr$$ of=$1
		rm -f /tmp/hymbr$$
		if [ $(get 512 $1) -eq 17989 ]; then
			n=$(($(get 0x25C $1)/512))
			ddn if=$1 bs=512 seek=44 count=20 skip=$n of=$1
			ddn if=/dev/zero bs=512 seek=9 count=35 of=$1
			ddn if=/dev/zero bs=512 seek=3 count=1 of=$1
		else
			ddn if=/dev/zero bs=512 seek=1 count=1 of=$1
			ddn if=$1 bs=512 seek=2 count=30 skip=$((b+1)) of=$1
			ddn if=/dev/zero bs=1 seek=$n count=$((0x8000 - n)) of=$1
		fi ;;
	    *)  ddn if=/dev/zero bs=1k count=32 of=$1 ;;
	    esac
	    case "${2/--/-}" in
	    -f*)
		[ "$append$initrd" ] && clear_custom_config $1
		set -- "$1" "$3" ;;
	    *)
		clear_custom_config $1
		exit 0 ;;
	    esac
	esac
	case "$(get 0 $1)" in
	23117)	echo "The file $1 is already an EXE file." 1>&2 && exit 1;;
	0)	[ -x /usr/bin/isohybrid ] && isohybrid -entry 2 $1;;
	esac

	gpt= ; [ $(get 450 $1) -eq 65262 ] && gpt=1
	echo "Read tazlito data..."
	n=2; [ -n "$gpt" ] && n=44 && echo "GUID Partition Table..."
	ddq if=$1 bs=512 skip=$n count=20 of=/tmp/tazlito$$
	add_win32exe $1
	add_tazlito_info $1 /tmp/tazlito$$
	rm -f /tmp/tazlito$$
	
	# keep the largest room for the tazlito info file
	add_rootfs $1
	add_fdbootstrap $1
	printf "%d free bytes in %04X..%04X\n" $((OFS-HOLE)) $HOLE $OFS
	store 440 $(date +%s) $1 32
	store 446 128 $1 8
	[ "$2" ] && echo "$2               " | \
		ddn bs=1 seek=$((0x7FDE)) count=15 of=$1
	if [ $(stat -c %s $1) -gt 34816 ]; then
		echo "Adding ISO image md5 at 7FF0 (16 bytes) ..."
		echo -en "$(ddq if=$1 bs=2k skip=16 count=$(($(get 32848 "$1" 4)-16)) | \
			md5sum | cut -c-32 | sed 's/\(..\)/\\x\1/g')" | \
			ddn bs=16 seek=2047 of=$1
	fi
	HEAP=$(($(custom_config_sector $1)*2048))
	if [ "$append$initrd" ]; then
		echo -n "Adding custom config... "
		DATA=/tmp/$(basename $0)$$
		rm -f $DATA > /dev/null
		isosz=$(stat -c %s $1)
		[ "$append" ] && echo "append=$append" >> $DATA
		[ -s "$initrd" ] && echo "initrd:$(stat -c %s $initrd)" >> $DATA &&
			cat $initrd >> $DATA
		echo "#!boot $(md5sum $DATA | sed 's/ .*//')" | cat - $DATA | \
		ddq bs=2k seek=$(custom_config_sector $1) of=$1
		newsz=$(stat -c %s $1)
		mb=$((((newsz -1)/1048576)+1))
		HEAP=$((mb*1048576))
		ddq bs=1048576 seek=$mb count=0 of=$1
		h=$(get 417 "$1" 1)
		[ -z "$RECURSIVE_PARTITION" ] || h=0
		for i in 0 1 2 3 ; do
			[ $(get $((0x1BE+16*i)) $1 2) = $((0x0080)) ] || continue
			store $((0x1CA+16*i)) $((mb*2048-h)) $1 32
			store $((0x1C5+16*i)) $((mb-1)) $1 8
		done
		if [ $newsz -gt $isosz ]; then
			echo "$((newsz - isosz)) extra bytes."
		else
			echo "$((isosz - 2048*$(get 32848 $1 4)
				 - $(stat -c %s $DATA) - 24)) bytes free."
		fi
		rm -f $DATA > /dev/null
	fi
	echo -n "Adding boot checksum..."
	if [ $(stat -c %s $1) -gt 32768 ]; then
		n=$(($(get 2 $1) - 1 + ($(get 4 $1) - 1)*512))
		n=$(($(od -v -N $n -t u2 -w2 -An $1 | \
		       awk '{ i+= $0 } END { print (i % 65536) }') \
		     + $(get $((n+1)) $1 1)))
		store 18 $(( (-n -1) % 65536 )) $1
	fi
	echo " done."
	trailer $1
}

main "$@" <<EOT
begin-base64 644 -
XQAAgAD//////////wAxG+zoaxGCFcQph3RauM1gXQzYPkRFgqnSs0hKSW+G
i76vxhEExPzhUk3J4IZp4Dyxv5Q2oeOvZu2KyLujzgz3nXyY2mYhcPGksDGO
psgTqP2uYF6UauttWPxEqOBkkbjHV8WZdN1SlCY2eqK8kbKAQYn3fhL4MD6/
XbRAQS+C7m2gdG535HaJ+jR0JdKTu+hVbNO5OCyuQYjyczBm0jxzXcQo7Q/q
T/U3sovH2V0qkrENzMPOpNTIG/a5bWK0sx1sDW2+5AiIx2IReK1cxnDOljL5
ygJkvTnvSzgYjTnvBGvVAM0KbXV6pL9KrViDV1l13+KgtCuPEWAHtgMX2mvB
SAL/4MGuSp8/0m0hAjJ0GT328b2UBaVrx2SivopGFI6nPuMw+N8X5L1VLm4Z
O7MbkNkTvLoEbb9eHL/aPSk4Q7gepqrCU80o00eDg5X2HyVoaZX0RCwOnYGK
pjVO6a3bCv5YqWibWgdj5hmaAIcLERx8GTwO1Y+7dC86//AHw8lgsi3E9geH
x74Eu4EUwa1m5ql0sTvloJ+NCPhNKgbAifL1fAongcPB//CLSJDwBGi8BTFz
9ocqXszri/Xzye9sefYpw5Zgmgmy/s0D/lhiC2GIrBhi0f5r0FdUORr8jtoS
JG4oo9VtxWMB08YcCXTKkfazcI46ot4vS/ard3Xv9geLzLpVZ41inZGSkMBN
mHZUI20KKkag9uhTjBgutVf6z3NsqPRcjKRPGrYbJj5fIylJimVWgnRLXR5v
WGxRFAwBE4CVI2tHD5BEzZaXQIZQ51nOjI7jti15jIkiTKzN75S6YhfEcaSB
3hNYJ0wB+HoCcEo+82qTK4UC3b06pMx8n8RTB0F6fyMZZc674PfybsDWKeEz
g+fsUCw+d0n3ABQPGiUo5fBCfhFY6hwgLmroVJKRCpmcUBXwKJ0v+Txfq0os
S8Qhw95tlGb4tteOCiVIa/yBL+eGGJXxPAcGbfuM6I60W1ceYreM0BqFGED/
mWInLKercLo07hyhSt7LFnxEvAwibdrnk+BmGohDx3oKV2WLoNpq2z0jIJ0s
Xd/KD4TUZbGZmfLZHXzKzBVoGT1S+HerdXJZgKFhCRIAmdsaHmf9ExS/6eZS
RGu7txsIg+B8b3KrlkbKPxPVEB4dOHoj7nfshSyfBPf9OIxqHRH6A1sTxARF
OpQAnUkDgisWKt53DlbzvdmKQ0yNkaAYiNWS3FY/U7+5qu5LYbaFPqxxCye+
xwx76C0HERUm+X9iZQAfkdW2DgQYWUI9M+Oid75Brun7TQgemQUZie/3LuI7
qk385GDAH/UyJaJ/8gjhjlp3MMiF0bEgEwEexL+KtrTeh9AWwpeJwP5zTpYN
MSMNT/Hb+R7b0waBjCef7BSwosUg3d6h/Qnq+sztUkOLzvzVyJAjvY7z1NHD
8acsi7xwQoTNU+d+vShLTq+ptVpaJGCvMYYnMzqjer6001TIuN7VHbhaSobG
ab/zSe4RXQLw5xZC7Mc2x9fBCEysVYBhevcugkezLi6vgedk6fd7J94jUW9P
osJk4nSyhH4C6Kyj0nLXaJ0+xs+M0GOKtIFDWaBR84GEZv3XP47C6GKjcQp9
MpAPCtWR651+cOJY5XuVfZ+SiHa5oOSnhYdKrabcEAKdGyyX4U3rgEOv4BPc
5oAcLOLvwfDXDd6wJuG86Bsv8Vt2R4r5N5nBUh6lGFkz4kQbpfKPedbHUfUx
1LKZ1vr3aAIuQxkwpVYtQCqv2J4DOAOuhHvxjYNY56cj4NV029MsFR1chum+
itnU3rksyCe3ebj1msH+h94oWHRiI2O2Z25EsV8/6Ib5ydEaNp9l+On8ChQC
8nd0JGBqatbQAvap4qpQSAw8ZpHIUPyMHoZrGxJ+ScuNKzt2TC1LdgvQwZxv
aBEsoqftFSPoY4vsKaakhWlr7e5tUfAWiI/21ML/TZRyX+7EdMUjPxygiFR3
+Bf/+rzg8RQteonkVPWyKPrE/2W/SWE4YPbQPJlinFCWYCMwFyk9Gj5KCaU1
tCoU89oloU/FANdf98IohTVMK+943LkRe8sja8nz5VJ6eeOIkqXDdS/5IKAJ
yFwHMve/C7OywIYX8WBcMdHiXJgW9wsK/nUP8ftpDcYoBUab/nyAQcKAw318
GytKFXyl4T0uFRIbm/tbw+6CdvXpJrjcCVoHb4Z48QGQER7lj73jYhrDP+5M
KMafNlrFVReFTdWLXUKA94+vAiXcJB8S0kOSsKbNdMtvs4YJ2SmXfGKfp3g2
Sd8EzMsYiYNNr9X6OkOMgQSEk2JOfH1lNefTAzhi9CmixqN85w1j6fVh8Qb2
cb5MrGH1YlrKLRtakNy1uAuklkGUnE0Taw5HQaE/NjbtHS+gwh31jsMDZOrc
k0EQ0G1iOyFy6kb2Czu0VYebEfl24gPL+UV+jjMkadwSOYkAoIB7eQg+XEl7
oxhsHrkQqohEfn/w1cNu1gViL3NRx1BULpjv6Ih1hXUEgByx7hnNePUqTMvH
YXpcjFq2IoW4EMot8R+GXLGHPJ5ARhXD9dWxYqnZ0S1hST8vT2LUPaholYPp
FZgWmjHOW+GBz0TrANodxDoQRtGNESb+GLVFCyhQIQOcz4mUeXq4rQk8GROp
i+Ow2MTuKaIDlI5H4eoQ4TK4Hnk/e2wrD+XE2Dy/A+8JVwOZpNK6YppGFTeB
4wEIMfjtI93I8yZ9EyOMK6pCR64kR2oKVsoE57cLA9j8F+7vxfut+rrU/UOH
a1S4FOQwD/Lhhs5N7TZn08EI49yCIDrBXYaD6GCykA5Ycg477slkW5H53gyK
0HVwFlDQZOkKMItTHYst3JRP6KGYZ0AGL5qR5HVNzeIaazwBaDQxkl3/dL9a
vbw6CI4/E/B4S/FTrbg3+MTCfc1yD64Rrx84bxZL+K66LfT5pDN/cWWtNM0V
TThZPqlmMhgXFkgrDEnvZ06wvck7XIdjfgqTaj6U6ZeGAva3eoJNE9mwdG8z
ZRRep6jVnwN0dy9M01LbtKYhG1YFqg8JpKGIMbE43BtuhTIA68PaQTbUfW7i
3zDyhYZ+OrFQLxuwpvwwpanZNggtVMZFq/Bcv/OwwR+VWuRQLxh0+/OngpaO
f/8ZwtcWHqeEX75HQ9JBmE0/9BSBzG/iaDsNPpQxepiauJT8nYByBTnCy3hg
XuL+aU4D6PCYPrehSKF1OKgO+D2xubA4ik5TVMPy5DZqq4vFwMBDGXWNdFVz
hH5vp2ZlxJScT4Zh5oOYNeBSeyPkhKFn1M6n7iYWU4WkFBs+Ns1opDYXoCvK
BK2Og2qeqgxzOimaNUXSpadlF9ohT54mHFwDo4T4vJXJatk8IVGlwMJWI/Rm
sL2oxo7G/AmBTTVBk4F2nJ5kqWIawBDvkpB5Sa2UskXdf5goLfxxVQd9MnXl
5Jf+DgPK45aLVyvJ6BUEe72X8yMy0ces70Vq9Zo/3Zry92xhKZd9xUxxrMV0
sSFhUYwid7DYhcvfR0kxLHimRdqbYx/8nJ5MYkWRMe2QDnK93EGSOSrVcFOG
Bsqh6raAG/AZSegr4/vIikqhULMvByaEwCSQcMg0YE/zTOj1TKKH1o1mdZL6
NT2CT+PHHz3LcdUfVvuwXRq8PapQKVJ8wYGOs/64TD6ABB+G/CILve7LnfST
B/vv8LvvEvGMH56zEshf/SGbd6JlSp2sk7aJ0kRyCCI8DI7ml59+XE1Iw5sS
nGYBbyG4EeMqbJOlcaukcSO8VlUQ2GXaV8cyzIIS72/zQJBEdPW3Vlf+Gid/
Pj8C70a5e4E5KmFSmt0TlVe8bh+y90mral5re8TJxiRTDS29Ge0alYtMBFkf
K7ZwUw5HaMgbNt5iLY8y/elS1FDl3rDNT0zZ/1ULhAJgme+j3t4roaiyGQ3h
YsVh0Gh9RPNUoAouL+F3efPu+vMOEjHvspOf67/j0aLW5DjCAeWxZq+Wh7Ak
EHHVdlop1wRq9OaOVlXUdXriMsc/gFKqHFrm54nVfw8cZbybaCKQ5Jj8rrAr
AjtgdXaES/9AG+9nkDb1BoQVtfn7gCQH0c0LJWTrOHvzsytS01n/Ts4RILud
stmh2utvmhWkUssGMk63423LbQrLnQZAuFGry4sJuNbnvMO9K/GlTdAryF4W
DA5Krd5FM1edE6ucm63G0ro3IFB4tacF78RR+hdrzM+PhADACB9wVTs18dIC
6sJqoZ0LP+Vc8MhjK1+RzRfq1zZmgnhUMwobPtgv0z3HgYZGwA5N6DzcyoaZ
rtjGiqDTjU97+VwRtgk1LxTZ3Wfz/Vy2W0AatODlgSbUiJnz/1AOqPzSg4ZX
JPYjklKqqCQaKSRvZJuw2mYVLcci9P8Axig7C4+HiK7BCpYlRnZMMG3RypgL
O5CvNiTJ09WhNKZJ0PhjpC+zVWaR9q83S3dUB0mt9gk13liL1KnkvQ7yKFCl
RFa/Zosj0GKxOfaj3cXGeXHBiNGZeitMsXqK41Bx8JpP9Q+pZKxHiEnLGJlN
miL3NhQfhen2A3MUYh1cy4BjR77TBq71/oqWGKwQ1xLApbhsXzCSyMnuL2tH
9PjhpC+wzql5nEhNoJ9+6RyzOnLG1waVrYqdtMkkHGSvpTTGFx3jrrVJKljz
HINC5HnRTSvHQdGoj4xwoiAiZ9Ghbo3zzgTV+c4qmrFL+gBBjPv0qJXQNwJe
ETawd1KXeG7T5dHaEkXBZ4JFJD400AemNaBnW5/TM9ZhJiB1BzRcxeZlqQA8
/8u6rM0VbrPwp872QstzjBxT/dwI54/HaQ8EOgoPQj1j6ZblkR5Z0051r8Ya
x3yeVWLYo4tTNNKHTbNcaUBcNx/Fxb9+rL8snDHhtPVsNooTJVPO+B0GZdfS
QYJlC4H+9499MulHp31sTETfDDLF8nv/7A4BONLJ2z4FowkfFX4KMKIwvy+5
i+A69RucfAvD5GC8UHAdBa+lgDAWY/bA/iLjn9RSfmBfV6DwmRin645c4nzc
LCIw6DAxS9+eprn4lVCNPn3zlraOaY23nJfuSlhTjXFJppSzRgmsEZPyy4xI
ZbkI+MVpstoij96zCbrzESd3cDtTNStUyQCEhFlqu8aAQWCJIGra5g/Rb8PC
QKpYvvieJmaRxIdgM702YdLNW08VSxCtTHyehIaJEh9cvx6HBqXSnMxD9N/6
GPJHCCQznBvM4dtdgge+9SJst0Vvd4DOOkNzVuOOR9im7dE0b6WcLc0xT9Zq
qJvbK2ajqc0Rhfry5c3rVjo+oVNxPoUzZCOqhPtX54J9L+KS4Zub/ZeOBXIs
cdT8iyO/agYvKQCTISxyfcrtEDea8bUXkrRouumoyl744YBAaUU9FylBuOQt
b5fcV996HWEJsfqS/ax1SE7dhGQN8xiOrm9Hk2wuCHWyi7byx/DFz0KW01PH
lXp+qQsLGxtJxpny9Q2gpcwCUix34ncdzj4K++q7Wc6xP3IY4P/xW0DpAkHV
AkL3+BLBC9C1DmYXpQNgFHWIVrI4uuApFsHlXGZXaF+fE+roQlQcuYPfrzCu
0DymkiZwEAiMGvBLwAq+JH3DbY3CMiziK666BrOqmzdgnSe2o4sKn/byeUcb
Y+wpnF7/1lCSDtIfHObx8ihpq2dlN9uCCFapGZyRm7lulaAXRwv29bLxmCwY
IVBbiNSzWsOYINqKeW7TWrkhmMamhFZvJGpIcHpRrlpa9wESOFmJUAxtrzzx
NqYHiyM+Kycg5be1Wv5mcBawE3jQBG5GeJ5p4uyAqIVbnJ4lmfIgwSlnH9z8
HyO1H6OzYxM1JmEa9JiOo3FubxY6xJKa+sS8lkEU0yUsqCQ4IRwV6b15xFF1
CUEcLsd8yiCx3O9tH+z4Kkf4BVIBWhkqSxGwxDXJ20dnJWAwGQ75lStR9z30
3FGHo+M/yQRTN7S4sPOJG8C41yKqh/SYzYKwZW5/I2MLLmNsGE/PtYdTSnYO
UR6qSrPLd5mMtyxgvGFEIA/Frppfguh7NxvzG82+D5wHBjCETmMBSgNeH19X
SxaGMhhx8GN8l/SWWrSgApptJIZw6f+Ifv19h0c81uLbtoulscO8AuU4c/+t
MKdLHqtXnhNyyconzSKA6qt5sf8Dy56XVYGjQTyvkJ54ZgkEgaF/uhWT4fdd
acIsc7i1ufq1Talnq156gbRoyxNWnxlDxL8CaC5DNY7jQ3uw9/OIFw0DMuCb
OxyB73oGtiazisw26eABps2CQVBzohoDmB9Q4Up+FqDAGbyJyKVqHocRG5aX
IpnIF5xwLYEiqS3njiNcpkLF2ZSXMy60sPx9NjwMkFDyaARLD+QCozY9zWKt
wh5qzdycyBAlX8Fn93ddhbL17QNbuVt01NxssctsHthNrT5lKI5HNBym8p7m
TivYnR/ODe2rT1puV7sg9b7ZE0s8kL2Kungm0pBAwnrk//XnhK+oFbGQsTbm
Wo3dCKY2GnQacew6VM2sHAV8PNsoJxMOKuFd82HLkBergv1A5UmjASxPBazM
TVvP4nYPsUnJOBYSiLVK66i0sdQrYR5jFsFZC6nwopz+noLGNdwGpvS3+aiC
rfWgmSt4xpnU8SQ1IskOAJyZIGelReZNePfoUDsKB7K0L9dgi/vZ9qvxWfHe
xLWhMw864FBTHHwTt3Jnb8g8ilwFTtx6JMbGXjxIKPpdwOvQwLZ4/yhyILBP
xSqv/VXY68T99SZdylIsgRIKhPSnc7ougfh0WphCRwx6M5e5PtK/g7ppKVT/
uaxx4xD/AlYO3MahjTCL7L7tXrcobaLzkK7id2IG1Ml/X81d7LbvVSBDTYjd
2PfkoXuESnDtQrHOqz8aBekF4UyZhxBWkuyStXNqT25tTkg3dgzIu1lFeTc+
XONWyunyxZGMTr9z+tpjiAgyLd86h6XnocyFPG3vCbSdGgXoeglJRtvzDWcS
2EouV/9EjnsQLd/9rJoLaVJU2SLZSLoW5qgDVhOBPDIcHQjE8ZlSzKnB9IgB
CaQhDCWtHL6MoQJzNG9eB0QgbVE6k/xAw/fGuLTLqgzqDLIbos7RM6X71QOq
wCdzvSwaIFJ0KC7O1CmQmvT0IOAbjHMvihjCrcj933/dBbqpqX7p3ns1VxnE
nGZc33WKJXBPjzNxJJVGk5CuxU2PMrpi0PNssXeBSZYFvHhVddxqlaJLVmwy
Q7ZfEd6+EGFjx7+sgLT6LWXqwRpn3AL31EnAi4mZm/iX0nO+5aW9j1+dpb5+
Axaz3NRq56WwYokIStmAYn6kq/ojb+5dMNV2cMzhyJIHkD9+JJeDatPixLVa
Z6Y4AnARUbDv2RtTTTAu/YKJJnoa7BcMlPzyqGxhf9t7TXaualNPcHWGBZWI
2N3D/ApD8FRMSNNY1jMT7yTcRuuh+q4In5FrhMpJ8gFwiSoiySJ/jIa9hyCr
rgiURL+3de27YBILN6eAYum9nbf/5LXG/1T6K7gLvItUASvSjebbCk2//zXm
p0mMCi/Zdn64YJFvrCsOLyLrL6Pg5nGMEVjVZ1IbHq8LtCc6d6v6Zurizw1M
Yb40K30rhkWUhnaiAgt8F4JqOAoYfjByfrVz6f/laX2b2L08WEbFlqHADeKm
qBNeKyY2Uo8lhq/r+t6AetqO3iYhNLfQk6mRjrXIBDd84w0bFBMy+7H0c1vU
tvP3ohgfh+tkV/WIXu0UzrBnIH73HcdjRo0D7ka3g5WivNONsaz2FoDanSjx
eBz9howhMev+Yn6N8ajBbmufsygh7gQF50ORoTuGCzjUIJIsQk9I0tTTcopK
tSLVZ7eHiLX4gDpcPgNCYvpiNIzP8H3JGjy5LirPJ4Pa+18FyqXxPtOLmxsE
S0jQV7YX+7BEeR47Em+jg4jyseaze+DMStXoQtNSP4vCcpJ1hBFRvB7sCDWX
Qex3a8y/aH1VS4my3FbtEJFK3jb9xTIvG+snoAK0lVWguRj7fsonRDhgO7HU
zppQJqpd2VAiqWs5WYKV3j4wXuxsN+sy93xbFv2vCRXVVCYMnMCENkRa2qVT
F0aCJD+lHk+43tYQ8lvLZBvM3/XCdkOLwsgP2OG669/LzrQe/yndzjEXFRRB
3pnKPA1rExoNg8b+516KKM9wDcOEEUr1fBKEjy2yiBsqpoFYKPm0kJJeuPzQ
GxCpt6UuMOiwbCffgVBi7A62AKxtCuuWrAYComWKydE9e2H3DGsCzUPpva3D
QA2Ru35Aa/KoLzfPE3s73JA26+Q1BCopDRfh5DdlYxJAxWXtRFsKqKI3Q8eJ
17jftQArwPXxkyYUGsRkv4TIa1NOnXlZ5i5kRlTn7Q8F2hCu/5LuRF36HzJF
4B3rKVeOud29WD/ljFRKUTZIUfiLGODxYFLF7O3v+CaN+Uh75pK1hb7MiYa+
EwMpzNiNEFG9RsdHk9QaRMyVxi8YtTb2ayIgTJwHkzhg3RF0UOs9NsGFN24m
aHpLlZB/9lNYfG+MkOwRzP/RFd58zdE3tdi7pVz0k0UgZw990s9V8zvPiWnK
+MBRDvLs+c/M+T2ry6zjgkImZFXhMIgiFKcwWL5CyWY5eRohNIdtXZcl0EM8
8ihSGOt8QEzAmf2gfn5ysa3BohCC18zVgLUCVLfuxvoSRnYca48Won4lc8mJ
HQjLS6wyRkQjy5oRqfQE+2kcD22EOGaL0m/9I3Rvu4myryAYg/OywkPWQdFC
0iUuoJDjKhV7S1R+BkFpWeWNUOr7xZQuks8cUN/QVNO6DDzaDt4uTB6RrpYd
CqcD4MW9ZtQkruMxrOPVcwGlS9HVp7eXwOI05VMJiTDUBP4kXPp544R7k/+c
PEdJnHtAz+iIiRYTpnAJGNv14CK18wodujioHKKX+e75bdm4RHkQllTR5cjR
hmbG80L1VgnLlijns/gJsDqgA6NZ+7XI482mRGwiX/mK6nkNBoedWz8ShuOW
NbGRbn3TjgY34duig4RueA4KUYbVGLoYTAgN7VrcE3BHhL6T1b30sHww2DsT
uLIO0872PBUuId34CdNLSL82n9Ah5Mml/OHl9jqJ3jaaQBlc+/dFbSYnF80j
nOFKjqcHSrNyxtWdWgxWC/uQIKTbzkQQl/V/lBdAN26bEQE7ykX4xudUSk45
OTgV1ZxDD6o6ukGbNrZR8BnooGc3byWAk6ASJc+m0AjxuemaHTxF6BNu0XlU
Dv/KdvVXNPRs5i6LtHZhK+nAngYHqGLkNOfjE6HaJELpoXY/KGgJTNM3Ynj5
INnM5ccUiM3nOuGRMKiEnVr3SUU80toztV817b6AcrXNEKeTK//843Kk7c4Z
hqKwrICpngPV+oErwbMa2NKQ5N6oLoAg+gEPDtoltT9+f2UMtq+49yw3syl3
fGEluUr8P6uRgJE09rBN5xBizGx4vkRm3r5jOOFG6rZaMr9i9TTNfv/AveU8
9GdA/DBo9EIH/EtPY/8Lm/x6ynCCQtRrMeNpDLO+AFmfnRlV64dj/Z26u2Y8
8l9zQ+vGT3FWIA7fEnoS2EM+TNu7LmH3Atq4MHMQfk7Ik11ltwUFU2HWSHqc
y3roCtrvW3Q/dKBna8oYiILhYf9UWh7vBYNyVBnMeekA6Q+vk8ZU7if6Ludb
8Y3tWwXaR3afiBRVIiXBoRgb/zmmeDKxIqFU7ms10zv0Nc59fA7FEHt6SFC8
oIIauDhgEgS4fqE+63sJQoc1KmpWfxb4isN4il7XfjPgtXOTJh7uOJnO+ujv
mcGNXkKgVJNJWb02DkvxRDTeCmHT1fwPbpiDvygtgFxZKrrfpFv68uxbXjVx
dbUXkD/G0BFAQxw/jayOCK6impwZfH9V98U6SsFcJs9Zv+tw4SquF6Vm1Ujn
arH+QhikiCGWuWg2cbiOxqK5KhCxqRylwzAsqo3V7rjEX5TYMSeFAPluzf1N
AQAVT0K+rF/LWJAITkmGj7SqjhGeafBcErmxNwYDWkLTvW6MZPqUhswiUIL7
JDnYcRtIjklaKjYVy2eZV5L83of0/+ST8HZWc15km4SR5KEjx2+Je7A3MV66
dmekjPTsd3rluVfOfbNxwZNFOPYr0TjZdeEsYQHmvbDT5z0Aap79Vy4wR66k
MIbPvCUB4cuImsq37g4gOg+3ErhdJWsCGzZ/bFygUCVJ9LQlNDA8v2D9o5/A
me19DdDTy6aODtvSvjx5ZUtjCpJw/fgSdMMp9M9eVRUxagRIOCHkMVuaJF25
jU6BZvex7bIO0c7ClJDOmzLilsBDDPlQvRmr3MQoX62XZc+Dnm8U4HDek+v8
PnsFqqvAUhToMqn4JZvsoDyD1OyN9pCCD3wIYwHWZNFHj2FJCKB6hwrOrX8T
HG4/ym0/DfldJWOI+koDRzxbkdp2MRlM8W+mV1fgvPted5I2ZcDqE4YR3FDP
k9lbNLAePJlyJBCi5gHWLapZJ/0YsI4S2Z4wVXHoRIEL7S4fxhSXH5eKdaJH
Llh+R1DibHDRpMM5GbP2BTzK+rGbohKqzZm6qcmoe2nUGGO7lr351G6TKaSg
+NtBGhHVze3gwVAvwQzY5Qzdv2oJ5hQHq4SF89lcEPCX7Qoggau0k86ROyLf
B/xFf6uopONCL41x2agj2wQ1gCy2OFEFgw/q0ateTrBZrsZzaFM42na1K3uN
zbsCkus0jMaj9y8j0iFwi5SJVhl4WJ+FslypTZ84/Cjj0a9vEg8hMEL8bQlb
OdwinxBvYXdD06IP+NDuBtEhvVY8j8ObthoTzn6XDPSVtFWUQsr6sdCNf5IK
/XZTA0JYCcfwxu8aeJmrgHHCspcJz0Vn25KA1YTBZK9rcyHHERCcClMI1ZUv
ZmgcuStauw2gjIZ8yY4q4TL/SK4DyKXy03V9mcCcZBKeadq2S/X0rg2ASxXC
evZg8fYUjFr/2wIJKrkVO3cAEb4GnK3B4mK9mdi7MXuRTr0263Yf5mpSluch
8OejcR1yj0fJLq7ilX9qgahCx73HO3q9b9uZxxvdZK4Ob+wU52yh/Ev1sgsV
D3Jt7cYruAOl3U5a08eRu5qHdcjFv8pWABf2mS0oUQK8R2mEBUaeq2MHEPds
J6RTGg2e7iPmm6NRH9NmRvbcO8cOJHuDHyQP8p80qp5iyWw5szGMJ+f9WPYv
1dBC2SMI5q7RbFZbfkeSEt8IDMYCdUj5YWDZ7vdHvEDFiF+FZ4RjAwf4D5wP
ynrjnW44950p8d+82YOCCeKjEaqUSTiFXoe/N3f49JaQb48g37M/lbDYqf4I
7J0/JRHDdKLPF3pLR1kzZFsc6wuvr0KxDOf1b1TyRlGRJFOJurYk4G+9zAwr
nyUZF3oK5ktVwB1Op42wLz8cuCmZgpt/kCeW2jcKaZ9Gn9o3iMRtRTvYonOU
7KFANsTZRTBWi5X6X7OWjsatetbv5AAT1VVvKHpf5Nw8QWCTKuGDD3sXiTDA
VciR2O79w2zf58Twh9YG8Mij5ygvpwIhAiAPQNJf6GGeXmY7c5FklmCmbj7U
ERa4W9OiukYNYvE7M0fWNLP+v/0BfE+uz3b87r3zSVtS5sJbTBMBH/J0hwbD
5rFAZdt9VHcunb0yMJjVyb4gBQPLBJxfHkgHviJadOw7x6nVxS1kM3lDhwzK
UJDMztEWbXXbSmVD0qkfc+4614YT+e4Pi0lvb/jmvv5T3nIHqTDjO1ebbQ+2
j5kyQ3ImZXdv8k76pr8PvDr8gutMvjfU8HnAXaTrO+H6RNDW1yBBABmK096F
E1j31G5vnV9lu7V8pI0Uxhvt9qmULVvaVmUqCy8b4+Y7eyBmTy2/1D/a1qFz
93SIO7FDIgYQlvsGJwMbM2j5atQeyeUKTv+WrK/ftgMolWfyBTRs3y1jRhll
F10RIbOc2IyDtgmA5x/y/4NxubziO8QGmqWZ0qGMK0qQbC8RK1Jypntj8hqY
sfn/YnmWzOCxDzaBC1Fuox+kJ3kGCK6QYO4R9MGvtfmKvIYQSzAb2DqxCT3g
pWq5jdNfox4hWlZ/Co0l6VtJOdVhfrhZKytdjsGZVXcAdgzTYWNIzJCGh94U
YOVfaNBgc3jpOpGVIbPklZEvCDMkREolWDKnYuFyump5eb2mxhyshcp/YBbM
+jPFgtQbWeCYOT9+P1cxYAdo9uLfCDVVLFrsuIdtoUDdfRf+XZzBODxEs6B+
ElkiB+NgOt0taf8uylhClBM5S1JTNAzU5S9UI67fHr3ZrOhkZw+koOWGve3F
VlIsxArpIbu0mJXcEYd+0g8nwKc1mQvWofEoVM+//NfBZk68Nujsl0sRsSER
cArXzq3PYoJIlcAPnysZVhj6mPyV/a4xFXeiJg7zIiL31vAzU/FHiMAh69iU
kEq6xsAoyg9YCAGJyDNdq047piL2Ro1s1PFMzl1HABt1ZhnPgBQl5o//tEDO
EqzBmz3NRmw2Qor4D+qtnWY1cW5KXXEZemHz7bpvIm/z77pqdNZjuCg+2Un3
gKS5QRCnQ7AnjS0BC8dJ4WOmxwCUGHIgSdQUaSbq4EqBD6pSF0iNGCeJz4mU
JyMzz/Ch4N1cjwhcpzm2z9vP6PhHb0NL/uNlleYdVPEkFqfjqHxs/xoAhIlC
gk0twNmQBaePzuISO9YOXOaofTTrrzwo2hN/hqU3qaEXnzYT/oki/4/r7aij
UlknDpMhjEYopI4U/LkVPU5uBr/IAPu7rVpFXY98HhHa15EU91z9QdziHnqK
yHjV90j5NsRV64DGHkWpzj2eOX3T83mwEClzLGeqvJjdFt/ntaraQe4DPfyz
AddAH23KudTrQAGW0zcQGQ2HJi5nDuhnXGlV4q+2rnQ9lxoEhsNgHyk9prhl
zgtwCUBk//UQIT+X3iU2dzZft1/hMeQfgFN+gRIw4GzwQZu7qLH4UrZR+vQh
TubmlrCJZFMjQZAuZ566ZwZ9Grxe5y76T4kqEOiLU4xeUuXztEwXbFwUNGh0
dfmGbophv3bvD3U5mmA+11NXYprD+fT7lUSu3nuXGKBeucdeVD2cguNBEpOE
NAtcdUeXiIworxco+omUlKvVRVUrqxor5uBRaTbOGlN0Uin6PxmI7aUM1ivi
BXs5qkZHSuilMwz5QNgK0es6kMwnjcZ3Z3HciZl0gk2ETEthc798NbZmFv/Q
EGTG9+1sZTGLBCxr9qXa+OU7rPP3X1x6P1GMbqxsb5fI2GoJ9MbIjLSPzhQF
ur+w0B7FN21OmFK1nNCyynZfpJZia+OyRti1lRV79O7KDLKsgtpxiAtNYnWU
Af86aVDlFMaVs7+UNLAP125tU4F9+8eZ67h8eXirvb+jOqPt9z0iqe3k8FLk
Wyibzf5O1J181UkwEZ0H6wd41e15S3YKNSmYNOsIF1EfA7ltVDyB/y0CHYLJ
+uKjKaFH6n6UWRrdGmLwcTJGR35pDIpKKqG3rsR+cRrxqFJJpVlClNUh+n9h
baS+R+291u53xXHVZQ3IeIn8YSNJDcKHsCU+Yy8XNTiAiJw83Im2nd6hzd/1
FoLjTqtIwCB8vyQDY+4ovbs66AMoEdqAY7s/JubsO31PeN7c8s5c2QUTgcZK
ZAHfWd2CcqjnKHmRDkG2GUdaoP1ae9l+g6N/NmeShwErEieq76zF0LNYJIXT
adbiAZD3oPEu1Hj5DlQL6jfi91bgarPvbA1ZTLF5aes8POcMu1Ym40PF8kfz
GJcllZzGBVo066/HCWrqcHR8lnHgmiC/oElYeA+dVyzUYw7VJsw4wlPLzr06
kJ8NvpIWKWlkcMy/F1MFfuC7I03ypT2xF5s7uXILyKb6zHFPk54fqxsJ5+UU
RamZxFajAl0Qyzx7GOjqtzZw6zQFwd/0Mo0h6rEadNdeUfI02oV+wUae+GhY
t8h5XP5b716Pw8ZDWuDG+qKGwhx72yQ6PDqpRRg+cmRQUxQjDgX7wRct4Emt
9IdCcZ4/SCdRFj7UiGgM0KMNl7MxLitTUIYRbwWRHzHVPWhaAo8Bx91ZXlVw
pC9vr8HIQ3dLG93+ctNU262MkCmJN+Tg3TRPr9zXtGo9EoCfJawW7VX22v7n
Zi41F/lnFV77e4ZvB8/Q5kv4O6OJDFUGcWxis/qp+9GiKZRn9PysMI9rPdP+
B56TZY1Yq8PQh24yCf/UxGSEyj8XRrx95A1eFncERWDe5iWMmPuAuFyArF3n
Jc3ithTrobF/QIXN63D9blhITP31ZtnUcXup2C8FGaTA2cC0zwkiplmpJgGa
30AdR8W3pPeBCw/BDvlXUjGHWV60bfP7sJtPq0oDl4aguopEqXBYRGFDI5gM
WO5WGir1lw5BAJL2Yd8kNpuAcdJg5jv29IgIXvrVOkyRqgHE6W/ni7/bywLp
ViFHs/Bqcs0lV6Zf/Has/wo8cE+bXbX2kNm4lubRJAWSlcYGWBAbu+F79rzQ
xuo/SPV1nh9ELwYUHnW1PRLOg4fpXpd+t3aQwRhmx2fAR8Y/MFH+W5V4yU8l
60WaoRD+wi6BF3apQJb5xRdXtipwiGFqU6T4izKyS9FswN4ej0XLIKOLKD/o
LRS3wHt2bZoBKvHKLq4GBdTgl5OvN7lc1f/LroHCIVwQNWPpRiNOLVPgUWav
aP47Qcy9HOBLbib5aAPKD7NO81CbM7xY1pLvOQmuPZu2oPwR3H6yoH04zS73
f/8b7Z0lyCqLULXz9Pp/QobZuv6JpQ5amTVN8y6I4FFnQO/fhRUjrvX6G+1p
yfo2/lUcoMJ0AEnfgPvDtnbuh6v3fQjxCxwsmW87DtzISuhpkTCnK2vn2shy
vJSoHJc89V/IIjOyV0Sjy1fKvZNVMFbvWxty20B3Fgj0kf0zW7Auda6uvVnr
8Jr/lbUQa4E4r6i3GB1agHcYQRdqUlBaJCRP6rWSJBlke1MW1TxBmlY7FWOQ
p5/Pq5exn9jrhE36pkMn6TFmdde1/V8r84adB4mU5pPUsvKEALHt9jGECVWf
quG2GvbNdK5dO2v8/Ygh3legg8Iurd53/HwFUY75DIV6gZszetQc+gu4pctA
3MQ0x8ETd4bYPPU4MYmQTN+cPa5flvwO9RjzkylE33AD0zXhaDQ9GN94BNwh
j4JofzP0+k2P2jDOPBbry6xIw1N9OWT3NNpDUaqxjsRADFZT8EqPVNWKF1o3
AsUR5U/+RY1+y83n7NeTg02Juira8u72gffbsSpIvKOkwaYpX6fqpnVj4ptR
fZgLTOScYN2twoSzrYIpjJhfQ45TVrO14/jc/83KTHCX8E9fgexaINYnxhA4
H7+OchAm72yN2lJG4FQflq1IaA09zKxmnoSOhk55Q6xa4xtPYh4zxctTCBKi
aBYfdGWokD4nmle+9XWgJNV+TO+dnOAvgcvZIDf0zI7RL4KlCdhb1hR14ljJ
xKXZ/3Cw3hPqndVXNcvfePW3cyat5pfZq3zjRrLQ5b8Zb0ypdIGkzMEA847J
agAzmnIZk/Q0VSz3mrvPYIhHJ+BAp+WsQQaXutjk51BCfCeUhiizmdm3g2kR
qqukFriXV8I0y7f8cJa5PuJ7fMOQdr7DKAEQoPLGDy3Bh62zCwnQFqoeKjzC
rg2HEWU7csr+ACtrS9YmiNiXAP6dOn1/1uSSIhHa2nwtZgDnnXcoc0dKgJOn
TVMaDUs6X3tRIi9XosIKHXmUnEGJ+2RgpTSu5sFRZBgRFrGxK+kS3DET9Cl1
LqNv0A876S0vOezYWBR0LHudrOiPaczIuiuJY/T8F0vFFhTtMAckC65VqvlX
/jQFEfmZ0tp8HFyCGbPySAPdn6jvsBLeh4ZPgNYOUhjlcIEBSG7r1d6svX1L
TeIR/mLx2KeZacLPb/NzjKqoWaH3xw6pL/xhbunr43yO+SG79AAScqa5Xw4M
Muy8zLGy4QJyPCd//rp82JSEZNwB7qzNwanqIdT+RmebgqiiD9DIV22KUWFT
Fnn7GZ/burFqRig16Z0nNMdKDmsO65Pi8PaUcjvR28MEYgNRJEuqkmHyGRg3
3KavVbuLRaJNrvrv4LCfzqdRYTB45BJW5ojXjISjeCLiHYEIYs7tGcyxkWV/
cKUrC3ad/pdbY0G0TgvkJtZxCYCATf620fHk56CLZlONVJlDTkRCfJEZXJx3
QQ8UMDxNGc2GDvZI8L3tQ9ie5DZ8NYddXAmpWJgVpbcPm4YsUZYGfEtPkDDB
AjwmBzz+8nlZaMddGwI2F8+FR9a7j3RnEoszTOHCKBNlTY37HqnZmXFjEJyL
GB6Qsk4pxNdt8ThMMfP3YpvX5XbaNnvBU3dGHxryEgFVM5IR//Qz7AI=
====
EOT
