Keith Vetter 2005-01-11 : Here's an implementation of the card game Crazy Eights that lets you play against three computer opponents. It can play several different variants of the basic game.
I initially added a very basic algorithm for determining the computer move, only to discover that I'm constantly losing to it. (Actually, I think it means that the game is pretty much random, and losing 3 times out of 4 seems overwhelming.)
I welcome people trying to develop better heuristics--check out the routine GetBestMove at the end of the program. I can set it up a little competition with different computer players playing different algorithms.
##+########################################################################## # # Crazy Eights # by Keith Vetter, January 2007 # package require Tk package require tile namespace import -force ::ttk::button # IDEAS # better computer AI # change rules dialog instead of menu # resizeable # hint # game score tally # saving state--rules and game tally array set RULES { win 500 StartingHandSize 5 2Draw2 1 JSkip 1 KReverse 1 Draw1 0 } array set S {title "Crazy Eights" w 700 h 550 margin 10 cs 2 cheat 0 anim,step 1 anim,delay 1 pause 200 animate 0 tableau {-100 -75 100 105}} array set CLRS {table \#045a5c tableau \#c4c2c4 cantmove \#c4c2c4} array set GAME {next,c,w n next,c,n e next,c,e s next,c,s w next,cc,w s next,cc,n w next,cc,e n next,cc,s e s Spades h Hearts d Diamonds c Clubs a Ace t 10 j Jack q Queen k King ? "" } proc DoDisplay {} { global S CLRS wm title . $S(title) wm resizable . 0 0 DoMenus pack [frame .screen -bd 2 -relief raised] -side top -fill both -expand 1 set h2 [expr {$S(h)/2}]; set w2 [expr {$S(w)/2}] canvas .c -bd 0 -height $S(h) -width $S(w) -highlightthickness 0 \ -scrollregion [list -$w2 -$h2 $w2 $h2] -bg $CLRS(table) label .msg -textvariable S(msg) -bd 2 -bg white -relief ridge pack .msg -in .screen -side bottom -fill both pack .c -in .screen -side top -fill both -expand 1 bind all <Key-F1> Help bind all <Key-F3> {console show} update PickNames PositionCards } ##+########################################################################## # # DoMenus -- sets up our menus # proc DoMenus {} { . configure -menu [menu .m -tearoff 0] .m add cascade -menu [menu .m.game -tearoff 0] -label "Game" -underline 0 .m add cascade -menu [menu .m.rules -tearoff 0] -label "Rules" -underline 0 .m add cascade -menu [menu .m.help -tearoff 0] -label "Help" -underline 0 .m.game add command -label "New Game" -under 0 -command NewGameCmd .m.game add command -label "History" -under 0 -command ShowHistory .m.game add separator .m.game add checkbutton -label "Cheat" -under 0 \ -variable ::S(cheat) -command Cheat .m.game add separator .m.game add command -label "Exit" -under 1 -command exit .m.rules add checkbutton -label "Jack => Skip" \ -variable ::RULES(JSkip) .m.rules add checkbutton -label "King => Reverse" \ -variable ::RULES(KReverse) .m.rules add checkbutton -label "2 => Draw Two" \ -variable ::RULES(2Draw2) .m.rules add checkbutton -label "One Draw Limit" \ -variable ::RULES(Draw1) .m.help add command -label Help -under 0 -command Help \ -accelerator "F1" .m.help add command -label About -under 0 -command About } proc PickNames {} { global GAME tcl_platform set names [Shuffle {Abigail Andrew Anthony Ashley Ava Barbara Brenda Brian Charles Christopher Cynthia Daniel David Deborah Debra Donna Elizabeth Emily Emma Erin Ethan Hannah Isabella Jacob James Jeffrey John Joseph Joshua Karen Keith Kenneth Kevin Kimberly Kristina Linda Lisa Lori Madison Marissa Mark Mary Matthew Michael Nancy Olivia Pamela Patricia Paul Richard Robert Samantha Sandra Scott Sharon Steven Susan Tessa Thomas Timothy Valerie William}] if {[info exists tcl_platform(user)]} { set n [lsearch $names $tcl_platform(user)] set names [concat $tcl_platform(user) [lreplace $names $n $n]] } foreach {GAME(name,s) GAME(name,w) GAME(name,n) GAME(name,e)} $names break } proc PositionCards {} { global S GAME CLRS set S(cards) [list 8s 8d 8c 8h] foreach suit {s h c d} { foreach v {k q j t 9 7 6 5 4 3 2 a} { lappend S(cards) "$v$suit" } } set img [Card2Image b 0] set S(cw) [image width $img] set S(ch) [image height $img] .c delete all set n [.c create rect $S(tableau) -fill $CLRS(tableau) -fill black -width 0] .c move $n 10 10 .c create rect $S(tableau) -fill $CLRS(tableau) -outline black -width 0 set y [expr {($S(ch)/2 + [lindex $S(tableau) end]) / 2}] .c create image 0 $y -image ::img::h -anchor c -tag suit # Player names set x [expr {$S(w) / 4}] set y [expr {$S(h) / 4}] .c create text 0 $y -text "$GAME(name,s) - 0" -fill white \ -font {Times 12 bold} -tag txt,s .c create text 0 -$y -text "$GAME(name,n) - 0" -fill white \ -font {Times 12 bold} -tag txt,n .c create text -$x 0 -text "$GAME(name,w)\n0" -fill white \ -font {Times 12 bold} -tag txt,w -justify c .c create text $x 0 -text "$GAME(name,e)\n0" -fill white \ -font {Times 12 bold} -tag txt,e -justify c # Position discard and stock set x [expr {($S(cw) + $S(cs)) / -2.0}] .c create image $x 0 -anchor c -tag discard set x [expr {round($x + $S(cw) + $S(cs))}] foreach i {3 2 1} { set xx [expr {$x + $i * 2}] .c create image $xx 0 -anchor c -tag stock$i } .c create image $x 0 -anchor c -tag [list stock stock0] .c bind stock <Button-1> [list UserMove stock] .c bind stock <Button-3> [list UserMove xstock] } ##+########################################################################## # # Card2Image -- returns the image name for a card--the back of the card # if the card should not be revealed. # proc Card2Image {card reveal} { if {$card == ""} {return {}} ;# No card -- show nothing if {! $reveal} { set card "back" } ;# Hidden card -- show back set iname "::img::$card" return $iname } proc Card2Name {card} { if {$card eq "cant"} { return "-"} foreach {value suit} [split $card ""] break if {[info exists ::GAME($value)]} {set value $::GAME($value)} return "$value of $::GAME($suit)" } proc NewGame {} { global ROUND GAME S destroy .top array set GAME { total,s 0 total,w 0 total,n 0 total,e 0 score,s 0 score,w 0 score,n 0 score,e 0 held,s 0 held,w 0 held,n 0 held,e 0 leader s } .c itemconfig txt,s -text "$GAME(name,s) - $GAME(total,s)" .c itemconfig txt,n -text "$GAME(name,n) - $GAME(total,n)" .c itemconfig txt,e -text "$GAME(name,e)\n$GAME(total,e)" .c itemconfig txt,w -text "$GAME(name,w)\n$GAME(total,w)" ClearMessage n e w s StartRound s MoveNext return 1 } proc NewGameCmd {} { # We have an "update is evil" problem. To avoid it, we only allow # new game to be done during the user's turn. if {$::ROUND(turn) eq "over"} { NewGame return } if {$::ROUND(turn) ne "s"} return #set n [tk_messageBox -message "Start new game?" -type yesno -icon question] set n [YesNo "Start new game?"] if {$n eq "no"} { ;# Continue existing game if {$::ROUND(turn) ne "s"} MoveNext return } NewGame } proc MenuUpdate {} { set state [expr {$::ROUND(turn) eq "s" ? "normal" : "disabled"}] if {$::ROUND(turn) eq "over"} { set state normal } .m.game entryconfig 0 -state $state .m.rules entryconfig 0 -state $state .m.rules entryconfig 1 -state $state .m.rules entryconfig 2 -state $state .m.rules entryconfig 3 -state $state } proc StartRound {lastDealer} { global ROUND CARDS S unset -nocomplain ROUND set ROUND(turn) $lastDealer set ROUND(dir) c set ROUND(dealer) $lastDealer ClearHistory Deal ShowCards MenuUpdate foreach {ROUND(value) ROUND(suit)} [split $CARDS(discard) ""] break .c itemconfig suit -image ::img::$ROUND(suit) } proc Shuffle {what} { global S CARDS set len [llength $what] set len2 $len for {set i 0} {$i < $len-1} {incr i} { set n [expr {int($i + $len2 * rand())}] incr len2 -1 # Swap elements at i & n set temp [lindex $what $i] lset what $i [lindex $what $n] lset what $n $temp } return $what } ##+########################################################################## # # DealACard -- pops the next card off the deck # proc DealACard {} { global CARDS set card [lindex $CARDS(deck) 0] set CARDS(deck) [lrange $CARDS(deck) 1 end] return $card } proc Deal {} { global CARDS RULES unset -nocomplain CARDS set CARDS(deck) [Shuffle $::S(cards)] for {set i 0} {$i < $RULES(StartingHandSize)} {incr i} { foreach who {n e s w} { lappend CARDS($who) [DealACard] } } foreach who {w n e s} { SortHand $who } set CARDS(discard) [DealACard] } proc SortHand {who} { set ::CARDS($who) [lsort -command SortHandCmd $::CARDS($who)] } proc SortHandCmd {c1 c2} { set p1 [lsearch $::S(cards) $c1] set p2 [lsearch $::S(cards) $c2] return [expr {$p1 - $p2}] } proc ShowCards {{reveal 0}} { ShowOneHand s 1 ;# Always reveal south's hand ShowOneHand n $reveal ShowOneHand w $reveal ShowOneHand e $reveal ShowStock if {$reveal > 1} { ;# Cheat .c itemconfig stock -image [Card2Image [lindex $::CARDS(deck) 0] 1] } } proc Cheat {} { ShowCards set ::S(msg) $::CARDS(deck) if {$::ROUND(turn) eq "s"} { ShowLegalMoves s } } proc ShowOneHand {who reveal} { if {$::S(cheat)} { set reveal 1 } if {$who eq "s" || $who eq "n"} { ShowHandHorizontal $who $reveal } else { ShowHandVertical $who $reveal } } proc ShowHandHorizontal {who reveal} { global S CARDS .c delete hand,$who set w2 [expr {[winfo width .c] / 2}] set left [expr {-$w2 + 2*$S(margin) + $S(cw) + $S(cw)/2}] set right [expr {-$left}] set y [expr {([winfo height .c]/2 - $S(margin) - $S(ch)/2) * ($who eq "s" ? 1 : -1)}] set maxDelta [expr {$S(cw) + $S(cs)}] set num1 [expr {[llength $CARDS($who)]-1}] set total [expr {$right - $left}] set need [expr {$S(cw) + $num1 * $maxDelta}] set excess [expr {$need - $total}] set delta $maxDelta if {$excess > 0} { ;# Need to overlap set delta [expr {($total - $S(cw)) / double($num1)}] } set left [expr {$left + $S(cw)/2}] ;# For center anchor foreach card $CARDS($who) { set img [Card2Image $card $reveal] .c create image $left $y -anchor c -image $img \ -tag [list hand,$who hand,$card] if {$who eq "s"} { .c bind hand,$card <Button-1> [list UserMove $card] } set left [expr {$left + $delta}] } } proc ShowHandVertical {who reveal} { global S CARDS .c delete hand,$who set h2 [expr {[winfo height .c] / 2}] set top [expr {-$h2 + $S(margin)}] set bottom [expr {$h2 - 2*$S(margin) - $S(ch) + $S(ch)/2}] set x [expr {([winfo width .c]/2 - $S(margin) - $S(cw)/2) * ($who eq "e" ? 1 : -1)}] set maxDelta [expr {$S(ch) + $S(cs)}] set num1 [expr {[llength $CARDS($who)]-1}] set total [expr {$bottom - $top}] set need [expr {$S(ch) + $num1 * $maxDelta}] set excess [expr {$need - $total}] set delta $maxDelta if {$excess > 0} { ;# Need to overlap set delta [expr {($total - $S(ch)) / double($num1)}] } set top [expr {$top + $S(ch)/2}] ;# For center anchor foreach card $CARDS($who) { set img [Card2Image $card $reveal] .c create image $x $top -anchor c -image $img \ -tag [list hand,$who hand,$card] set top [expr {$top + $delta}] } } proc ShowStock {} { array set TAGS {0 stock 1 stock1 2 stock2 3 stock3} .c itemconfig discard -image [Card2Image [lindex $::CARDS(discard) end] 1] set img [Card2Image back 0] set len [llength $::CARDS(deck)] foreach i {0 1 2 3} { set img [expr {$len > $i ? $img : ""}] .c itemconfig $TAGS($i) -image $img } } proc Draw {who} { set newCard [DealACard] if {$newCard eq {}} {return $newCard} foreach card $::CARDS($who) { ;# Find card position if {[SortHandCmd $newCard $card] <= 0} break } AnimateCard stock hand,$card back lappend ::CARDS($who) $newCard SortHand $who ShowOneHand $who [expr {$who eq "s"}] if {$who eq "s"} { ShowLegalMoves s } return $newCard } proc Discard {who card {newSuit "?"}} { global CARDS ROUND lappend CARDS(discard) $card foreach {ROUND(value) ROUND(suit)} [split $card ""] break if {$newSuit ne "?"} {set ROUND(suit) $newSuit} .c itemconfig suit -image ::img::$ROUND(suit) set which [lsearch $CARDS($who) $card] set CARDS($who) [lreplace $CARDS($who) $which $which] ShowOneHand $who [string match s $who] ShowStock } proc ShowLegalMoves {who} { array set dxy {s {0 -10} n {0 10} w {10 0} e {-10 0}} foreach {all suits values eights} [GetLegalMoves $who] break foreach {dx dy} $dxy($who) break foreach card $all { .c move hand,$card $dx $dy } return [llength $all] } proc IsEndRound {} { global CARDS ROUND if {$CARDS($ROUND(turn)) eq {}} { return 1 } if {$CARDS(deck) ne {}} { return 0} foreach i {0 1 2 3} { if {[lindex $ROUND(moves) end-$i 1] ne "cant"} { return 0 } } return 1 } proc MoveNext {} { global ROUND CARDS GAME S RULES set value [string index [lindex $ROUND(moves) end 1] 0] ;# Last card played if {$RULES(2Draw2) && $value eq "2"} { ;# 2 => draw 2 set next $GAME(next,$ROUND(dir),$ROUND(turn)) PlayerMessage $next draw2 Draw $next Draw $next } if {[IsEndRound]} { set winner [ScoreHands] set S(msg) "$GAME(name,$winner) won this round" set ROUND(turn) over ClearMessage n e w s ShowCards 1 ShowScore # Check for victory if {$GAME(total,$GAME(leader)) >= $RULES(win)} { Winner $GAME(leader) set n [YesNo "Play again?"] if {$n eq "yes"} { NewGame } else { MenuUpdate } return } StartRound $GAME(next,$ROUND(dir),$ROUND(dealer)) } # Special card check if {$RULES(KReverse) && $value eq "k"} { ;# K => reverse PlayerMessage $ROUND(turn) reverse set ROUND(dir) [expr {$ROUND(dir) eq "c" ? "cc" : "c"}] } set ROUND(turn) $GAME(next,$ROUND(dir),$ROUND(turn)) if {$RULES(JSkip) && $value eq "j"} { ;# J => skip PlayerMessage $ROUND(turn) skip set ROUND(turn) $GAME(next,$ROUND(dir),$ROUND(turn)) } MenuUpdate set S(msg) "$GAME(name,$ROUND(turn))'s turn" if {$ROUND(turn) ne "s"} { after $S(pause) ComputerMove } else { set ROUND(drawn) 0 ClearMessage $ROUND(turn) # See if the user can move or draw if {[ShowLegalMoves $ROUND(turn)]} return if {$CARDS(deck) ne ""} return AddHistory s cant 0 ? MustPass MoveNext } } ##+########################################################################## # # UserMove -- handles the user's turn # proc UserMove {which} { global ROUND S CARDS RULES if {$ROUND(turn) != "s"} return ;# Not our turn if {$S(animate)} return ;# In the middle of animation if {$which eq "xstock"} { ;# Draw only if user has no move foreach {all . . . .} [GetLegalMoves s] break if {$all ne {}} return set which "stock" } if {$which eq "stock"} { if {$RULES(Draw1) && $ROUND(drawn) > 0} return set newCard [Draw s] if {$newCard eq {}} return ;# Empty deck -- can't happen incr ROUND(drawn) foreach {all suits values eights} [GetLegalMoves s] break if {$all ne {}} return ;# Has a legal move if {$RULES(Draw1) || [llength $CARDS(deck)] == 0} { PlayerMessage s cantmove AddHistory s cant $ROUND(drawn) ? MoveNext } return } foreach {all suits values eights} [GetLegalMoves s] break if {[lsearch $all $which] == -1} return ;# Not legal move set newSuit "?" if {[string match 8* $which] && [llength $CARDS(s)] > 1} { ;# 8 needs suit set newSuit [PickSuit] if {$newSuit eq "x"} return } AddHistory s $which $ROUND(drawn) $newSuit AnimateCard hand,$which discard $which Discard $ROUND(turn) $which $newSuit MoveNext } proc ComputerMove {} { global ROUND if {$ROUND(turn) eq "s"} { puts "BAD TURN" StackTrace return } ClearMessage $ROUND(turn) foreach {move draws newSuit} [GetBestMove $ROUND(turn)] break AddHistory $ROUND(turn) $move $draws $newSuit if {$move ne "cant"} { ;# Did a move AnimateCard hand,$move discard $move Discard $ROUND(turn) $move $newSuit } else { PlayerMessage $ROUND(turn) cantmove } MoveNext } proc AnimateCard {from to card} { global S CARDS set S(animate) 1 ;# We're animating foreach {x0 y0} [.c coords $from] break foreach {x1 y1} [.c coords $to] break set dx [expr {$x1 - $x0}] set dy [expr {$y1 - $y0}] set dist [expr {hypot($dx,$dy)}] set dx [expr {$S(anim,step) * $dx / $dist}] set dy [expr {$S(anim,step) * $dy / $dist}] .c create image $x0 $y0 -tag animate -image [Card2Image $card 1] if {$from ne "stock"} { .c delete $from } if {$from eq "stock"} { .c itemconfig stock[llength $CARDS(deck)] -image {}} set steps [expr {int($dist / $S(anim,step))}] _AnimateCard $dx $dy $steps tkwait variable S(animate) return } proc _AnimateCard {dx dy steps} { if {$steps == 0 || ! $::S(animate)} { .c delete animate set ::S(animate) 0 return } .c move animate $dx $dy after $::S(anim,delay) _AnimateCard $dx $dy [incr steps -1] } proc GetLegalMoves {who} { global ROUND CARDS set suits {} set values {} set eights {} foreach card $CARDS($who) { foreach {value suit} [split $card ""] break if {$value == 8} { lappend eights $card; continue } if {$value == $ROUND(value)} { lappend values $card } if {$suit eq $ROUND(suit)} { lappend suits $card } } set all [concat $suits $values $eights] return [list $all $suits $values $eights] } ##+########################################################################## # # SuitTally - return sorted list of the points for each suit (sans 8) # proc SuitTally {who} { global CARDS foreach suit {s h d c} { set which($suit) {} } foreach card $CARDS($who) { foreach {value suit} [split $card ""] break if {$value == 8} continue lappend which($suit) $card } set all {} foreach suit {s h d c} { set len [format %02d [llength $which($suit)]] ;# To break ties lappend all [list $suit "[ScoreOneHand $which($suit)].$len"] } set all [lsort -decreasing -index 1 -real $all] return $all } ##+########################################################################## # # SortHandByScore -- returns hand sorted with highest scoring cards first # proc SortHandByScore {hand} { set l {} set l2 {} foreach card $hand { lappend l [list $card [ScoreOneHand $card]] } set l [lsort -decreasing -index 1 -integer $l] foreach a $l { lappend l2 [lindex $a 0] } return $l2 } proc PlayerMessage {who type {debug 0}} { array set dxy {n {0 35} s {0 0} e {15 65} w {-10 65}} array set msgs {cantmove "%w\ncan't move" skip "Skipping\n%w" reverse "%w\nreverses" draw2 "%w\ndraws 2"} regsub -all {%w} $msgs($type) $::GAME(name,$who) txt if {$who eq "s" || $who eq "n"} {set txt [string map {\n " "} $txt]} ClearMessage $who foreach {x y} [.c coords txt,$who] break foreach {dx dy} $dxy($who) break set x [expr {$x + $dx}] set y [expr {$y + $dy}] label .c.$who -text $txt -font {Times 18 bold} -bd 2 -relief raised -padx 5 .c create window $x $y -window .c.$who -tag .c.$who if {! $debug} { after 3000 ClearMessage $who } } proc ClearMessage {args} { foreach who $args { destroy .c.$who ; .c delete .c.$who } } proc ShowScore {} { .c itemconfig txt,s -text "$::GAME(name,s) - $::GAME(total,s)" .c itemconfig txt,n -text "$::GAME(name,n) - $::GAME(total,n)" .c itemconfig txt,e -text "$::GAME(name,e)\n$::GAME(total,e)" .c itemconfig txt,w -text "$::GAME(name,w)\n$::GAME(total,w)" set W .top destroy $W set font {Times 12 bold} set leaders [FindLeader] toplevel $W -padx 15 wm withdraw $W wm title $W "$::S(title) Score" wm attributes $W -toolwindow 1 wm transient $W . wm resizable $W 0 0 label $W.title -text "$::S(title) Score" -font {Times 24 bold} -fg red ;#-bg $bg label $W.c1 -text "Held in hand" -font $font label $W.c2 -text "Score" -font $font label $W.c3 -text "Total" -font $font grid $W.title - - - -pady 5 -padx 15 catch {grid [::ttk::separator $W.sep] - - - -pady 5 -sticky ew} grid x $W.c1 $W.c2 $W.c3 foreach who {s w n e} { set fg [expr {$::GAME(score,$who) > 0 ? "blue" : "black"}] if {[lsearch $leaders $who] > -1} {set fg "red"} set winner [expr {$::GAME(total,$who) > $::RULES(win)}] foreach what {name held score total} { set txt $::GAME($what,$who) if {$what ne "total" && $txt == 0} { set txt "" } label $W.$what,$who -text $txt -font $font -fg $fg -bd 0 if {$winner} { $W.$what,$who config -fg blue -bg magenta } } $W.name,$who config -anchor w grid $W.name,$who $W.held,$who $W.score,$who $W.total,$who -sticky ew } button $W.ok -text OK -command [list destroy $W] bind $W <space> [list $W.ok invoke] grid $W.ok - - - -pady 15 CenterWindow $W wm deiconify $W grab $W tkwait window $W } proc FindLeader {} { global GAME set leader {} set best 0 foreach who {n e w s} { if {$GAME(total,$who) < $best} continue if {$GAME(total,$who) > $best} { set leader {} } lappend leader $who set best $GAME(total,$who) } return $leader } proc PickSuit {} { set W .top destroy $W #set bg $::CLRS(tableau) set ::ROUND(newSuit) "x" toplevel $W -padx 15 ;#-bg $bg wm withdraw $W wm title $W "Choose Suit" wm attributes $W -toolwindow 1 wm transient $W . wm resizable $W 0 0 label $W.title -text "Choose Suit" -font {Times 24 bold} -fg red ;#-bg $bg foreach suit {h d c s} { label $W.a$suit -image ::img::a$suit ;#-bg $bg bind $W.a$suit <1> "set ::ROUND(newSuit) $suit ; destroy $W" } grid $W.title - -pady 5 -padx 15 catch {grid [::ttk::separator $W.sep] - -pady 5 -sticky ew} grid $W.ah $W.ad -padx 5 -pady 10 grid $W.ac $W.as -padx 5 -pady 10 button $W.cancel -text Cancel -command [list destroy $W] bind $W <space> [list $W.cancel invoke] bind $W <Escape> [list $W.cancel invoke] grid $W.cancel - -pady 15 CenterWindow $W wm deiconify $W grab $W tkwait window $W return $::ROUND(newSuit) } proc Winner {who} { set W .top destroy $W set ::ROUND(newSuit) "x" toplevel $W wm withdraw $W wm title $W "Winner" wm transient $W . wm resizable $W 0 0 set txt "$::GAME(name,$who) Wins!" label $W.title -text $txt -font {Times 24 bold} -fg red button $W.ok -text "OK" -command [list destroy $W] bind $W <space> [list $W.ok invoke] grid $W.title -pady 15 -padx 15 grid $W.ok -pady {0 15} CenterWindow $W wm deiconify $W #grab $W tkwait window $W return } proc MustPass {} { set W .top destroy $W #set bg $::CLRS(tableau) toplevel $W ;#-bg $bg wm withdraw $W wm title $W "Pass" wm attributes $W -toolwindow 1 wm transient $W . wm resizable $W 0 0 set txt "You must pass" label $W.title -text $txt -font {Times 24 bold} -fg red ;#-bg $bg button $W.ok -text "OK" -command [list destroy $W] bind $W <space> [list $W.ok invoke] grid $W.title -pady 10 -padx 15 grid $W.ok -pady {0 15} CenterWindow $W wm deiconify $W grab $W tkwait window $W return } proc YesNo {msg} { set W .top destroy $W #set bg $::CLRS(tableau) set ::S(yesno) yes toplevel $W ;#-bg $bg wm withdraw $W wm title $W " " #wm attributes $W -toolwindow 1 wm transient $W . wm resizable $W 0 0 label $W.icon -image ::img::quest ;#-bg $bg label $W.title -text $msg -font {Helvetica 12} ;#-bg $bg frame $W.buttons ;#-bg $bg button $W.yes -text "Yes" -command "set ::S(yesno) yes; destroy $W" button $W.no -text "No" -command "set ::S(yesno) no; destroy $W" bind $W <space> [list $W.yes invoke] bind $W <y> [list $W.yes invoke] bind $W <n> [list $W.no invoke] bind $W <Escape> [list $W.no invoke] grid $W.icon $W.title -pady 10 -padx 5 -sticky w grid $W.buttons - grid $W.yes $W.no -pady {10 15} -padx 5 -in $W.buttons grid columnconfigure $W 1 -weight 1 CenterWindow $W wm deiconify $W grab $W tkwait window $W return $::S(yesno) } proc CenterWindow {w {W .}} { update idletasks ;# Need to get geometry correct set wh [winfo reqheight $w] ; set ww [winfo reqwidth $w] set sw [winfo width $W] ; set sh [winfo height $W] set sy [winfo y $W] ; set sx [winfo x $W] set x [expr {$sx + ($sw - $ww)/2}] ; set y [expr {$sy + ($sh - $wh)/2}] incr y -130 if {$x < 0} { set x 0 } ; if {$y < 0} {set y 0} wm geometry $w +$x+$y } proc ScoreHands {} { global CARDS GAME set winner {} set best 99999 set sum 0 foreach who {s w n e} { set GAME(score,$who) 0 set GAME(held,$who) [ScoreOneHand $CARDS($who)] incr sum $GAME(held,$who) if {$GAME(held,$who) < $best} { set winner $who set best $GAME(held,$who) } } incr sum -$GAME(held,$winner) ;# Possibly non-zero set GAME(score,$winner) $sum incr GAME(total,$winner) $sum if {$GAME(total,$winner) > $GAME(total,$GAME(leader))} { set GAME(leader) $winner } return $winner } proc ScoreOneHand {cards} { global RULES set total 0 foreach card $cards { foreach {value suit} [split $card ""] break switch -- $value { a { incr total 1 } 2 { incr total [expr {$RULES(2Draw2) ? 25 : 2}] } 8 { incr total 50 } t { incr total 10 } j { incr total [expr {$RULES(JSkip) ? 25 : 10}] } q { incr total 10 } k { incr total [expr {$RULES(KReverse) ? 25 : 10}] } default { incr total $value } } } return $total } ##+########################################################################## # # Help -- a simple help screen # proc Help {} { catch {destroy .help} toplevel .help wm title .help "$::S(title) Help" wm transient .help . set t .help.t text $t -relief raised -wrap word -width 70 -height 29 \ -padx 10 -pady 10 -cursor {} -yscrollcommand {.help.sb set} scrollbar .help.sb -orient vertical -command [list $t yview] button .help.dismiss -text Dismiss -command {destroy .help} pack .help.dismiss -side bottom -pady 10 pack .help.sb -side right -fill y pack $t -side top -expand 1 -fill both set bold "[font actual [$t cget -font]] -weight bold" set italic "[font actual [$t cget -font]] -slant italic" $t tag config title -justify center -foregr red -font "Times 20 bold" $t tag configure title2 -justify center -font "Times 12 bold" $t tag configure header -font $bold -spacing3 5 $t tag configure bold -font $bold $t tag configure italic -font $italic $t tag configure n -lmargin1 10 -lmargin2 10 $t tag configure bullet -lmargin1 20 -lmargin2 35 -tabs 35 $t insert end "$::S(title)\n" title "by Keith Vetter\n\n" title2 set txt "$::S(title) is a card game for two or more players. " append txt "The object is to get rid of all your cards to the " append txt "discard pile by matching the suit or rank of the " append txt "previous discard.\n\n" $t insert end "Introduction\n" header $txt set txt "There are a huge number of variations of this game, with " append txt "almost as many different names, such as Crates, Switch, " append txt "Swedish Rummy, Last One, Mau-Mau, Tschausepp or Pesten. " append txt "Uno is a specialized version of this game.\n\n" $t insert end $txt set txt "Starting with the player to dealer's left, and continuing " append txt "clockwise, each player in turn must either play a legal card " append txt "face up on top of the discard pile, or draw a card from the " append txt "undealt stock. Legal plays are:\n\n" $t insert end "Basic Game\n" header $txt set txt "if the top card of the discard pile is not an eight, you may play " append txt "any card which matches the rank or suit of the previous card " append txt "(for example if the top card was the jack of spades you could " append txt "play any jack or any spade)\n" $t insert end \u25cf\t$txt bullet set txt "an eight may be played on any card, and the player of the eight " append txt "must nominate a suit, which must be played next\n" $t insert end \u25cf\t$txt bullet set txt "if an eight is on top of the pile, you may play any card of the " append txt "suit nominated by the person who played the eight\n" $t insert end \u25cf\t$txt bullet $t insert end \n set txt "This program implements a few of the more common variations " append txt "of the game.\n" $t insert end "Variations\n" header $txt set txt "Only draw once if you cannot play\n" $t insert end \u25cf\t$txt bullet set txt "Jack played skips next player's turn\n" $t insert end \u25cf\t$txt bullet set txt "King changes direction\n" $t insert end \u25cf\t$txt bullet set txt "Two makes next player draw two cards\n\n" $t insert end \u25cf\t$txt bullet set txt "Use the right button to draw a card because it will not " append txt "draw if you already have a card you can play.\n" $t insert end "Inside Information\n" header $txt $t config -state disabled } proc About {} { set txt "$::S(title)\n\nby Keith Vetter\nJanuary 2007" tk_messageBox -icon info -message $txt -title "About $::S(title)" } proc ShowHistory {} { if {[winfo exists .history]} return toplevel .history wm title .history "$::S(title) History" wm transient .history . set t .history.t text $t -relief raised -wrap word -width 50 -height 29 \ -padx 10 -pady 10 -cursor {} -yscrollcommand {.history.sb set} scrollbar .history.sb -orient vertical -command [list $t yview] button .history.dismiss -text Dismiss -command {destroy .history} pack .history.dismiss -side bottom -pady 10 pack .history.sb -side right -fill y pack $t -side top -expand 1 -fill both set bold "[font actual [$t cget -font]] -weight bold" set tabs {1.1i center 2i center 2.5i center} set tabs2 {.75i left 2i center 2.5i center} $t tag configure colHeader -font $bold -underline 1 -tabs $tabs $t tag configure data -tabs $tabs2 $t delete 0.0 end $t insert end "Player\tCard Played\tNext Suit\tDraws\n" colHeader foreach move $::ROUND(moves) { foreach {who card draws suit} $move break set name $::GAME(name,$who) if {$draws == 0} {set draws ""} set card [Card2Name $card] set suit $::GAME($suit) $t insert end "$name\t$card\t$suit\t$draws\n" data } $t see end $t config -state disabled set x [expr {[winfo x .]+[winfo width .]+10}] if {$x < [winfo screenwidth .] - 100} { wm geom .history "+$x+[winfo y .]" } } proc AddHistory {who card draws suit} { lappend ::ROUND(moves) [list $who $card $draws $suit] set t .history.t if {! [winfo exists $t]} return set name $::GAME(name,$who) if {$draws == 0} {set draws ""} set card [Card2Name $card] set suit $::GAME($suit) $t config -state normal $t insert end "$name\t$card\t$suit\t$draws\n" data $t see end $t config -state disabled } proc ClearHistory {} { set ::ROUND(moves) {} set t .history.t if {! [winfo exists $t]} return $t config -state normal $t delete 0.0 end $t insert end "Player\tCard Played\tNext Suit\tDraws\n" colHeader $t config -state disabled } ################################################################ # Card images from Patience card game, see # http://uebb.cs.tu-berlin.de/~krischan/patience/patience-english.html # https://www.tcl-lang.org/starkits/patience.kit namespace eval ::img {} image create photo ::img::2c -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt lhiecEi65QQaolI3Kh6byygLeqJKryar84jtIrlbr/hb1QotY2fW3LukoWjyMCmGP8HMzNgenOvr d31+cYBeaIdsRIlnHnhKWoQ2jYs7VoI0k5R5ZZEzmY5+nJoubjGXUXZfpqArcTmdqK8dg2lyHoyw V023tY+BSKq9S5CjwjLErMaSym/JzIrOz4zShtHUm9e61tme29wtxd9T3uIq4eUp5+hl66Htbe/w 8djzmOTz6vH57/vt/ev/0AUsN1BcwW8HuSXMtvBaQ2oPpUV8NpFZRWUXjWUUtrFXx1ofgYcRq0cK T0hcwAidrDRLDqBcx1pehBmTg5oursJsQgTkHrhSqvKdWviJZSeimYxa8tkqqVFSOBtFrbaqarVm NLsJmkgHl5ubVL9OA8v1z1iVTLUejDRz7VKSnKDC1clursu6c1OBhdvViN2gTyj8NYdjcBUYaSH6 CCHik+PHjUJEAAA7} image create photo ::img::2d -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt loNgkEcskm45gXBpbOpGpGF04KzKoCipdetKmoTcsAkL1IrDZKW5ST2XyGBr3I2Nr3fL9rmuv9fy flV8eUWAc1yDTESGgU1pVYyHVo9skZJOaXqFlmJwjTSRe0mERqGdOYaVpKdTq5uXW1CpTrCxo4qQ bm9etbqOXkq+osLElMSIwMdoycq2zXTMz5jR0kbG1UXX2D3U2zva3jbd4TTg5Ffj5y3m6ivs7Snv 8Cfy87v23+n4Y/r7R/3+6uETaI/gPIPwELZTqI7hOYfkIIaT6I3iNovYMFbTKI3jM4/NiEAqE3mM ZDGA+0yG0SRA5ZZDJFmWwiWy1x9A/3S5WoSzJcqbO/H05GjqlRaijGiZ0WhJJh56P1s0/cRNTFNW VpPyXIV0Fg+vHr1+7aMHZFAdUubUpAqUnzCnW6H6O3HJpap4UasFsjuzzL25rWj+AKxGLQXC7nAg dgEjb0YfIUR4mEy5cocQEQAAOw==} image create photo ::img::2h -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt loNgkEcskm45gXBpbOpGpGF04KzKoCipdetKmoTcsAkL1IrDZKWZx5yunWSwcTmkU7dY+Vtmp/bx SVp7LX2FgGV0bIV2h25tOouMVmlOkYmTXlaWg0SUlZtceXWchJFoOUyPO4tiUKxFf62ohnOqobOx tXdnopeVZyVxtsBVaXLEt1nIssvNns3J0MTP0sWZ1Y3Yp9rM3NHemODZ4k3U5DbX5zvm6lfp7TTs 8Cvy8yn19if4+cHv/Cr7/gXkNzBfQXsH5yWEt7BdQ3UPz0UkN1FcRXAXvWXktlFbR2wfk6uFlDYS Wkln/vjt6vcvxbEjKef5EnByJZFcJV+uojVyJiSeMXUNm/Hq46ufo6R0tKTIj5aNm2yWC7qT6bgq UUk9oVojq1QWOLnS8Ir0UUayXXc9FUuUUa62bliGcesz7cqlx4a2tXlS05u+n74CbjJocK0ycls6 OoZEMaKnFByz8PFDsgsYbClSxuyhs+fPHEJEAAA7} image create photo ::img::2s -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt lhiecEi65QQaolI3Kh6byygLeqJKryar84jtIrlbr/hb1Q7BXqrluh6Tw+/zxQ2to22ZsT0o5Ij3 cz0daXdEHmaGhXIeXYh9h46CLouHWFZtO5CRmVx8TEExeWxPop9NOYGjW6WPilGnG4mYhKuebkt2 SHG3uGCzvL1lrsCfxLebxonJesPLj8600JbN0njVqtev1NktyNzd298q3uLj4eVl6M/qnOzt7tbw NOTy9PD27vjs+ur86P7lAIoT+I0gN4PZEF5TWI2hNIfQIDqTuIxiMovGMDa6dC4hR3lZfELF0agt ya6Nv0yJwphSJR+HgVC1BOeJYZ5QtualOqlEU0c4QH6u8HnGhVBzkKahHKR0GqOmTmMJqnl0itSp qSiaXDeyKk2BsEgdUzhLo9eQvs5m1EKyZIq2wd6qBZbLCcigNX/c/YLJx9yHOPa+hfGXro8QInwq XnwoRAQAOw==} image create photo ::img::3c -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt khqecCi45YoZolI3Auaay2gLWqJKr66jE8tNUTHdMNKUVFrEW6+2d0Fbq2tmuQutx21zrh08DIa/ bWaBf3eCMWdneoV9HotCb4lyjY47Vnx4k1iWgzSTb0SbkZgjh5xRdkillU1Pn4JOHIyUr6kbj6aa rbFoS3tFqbyncaLBtGSuxavJvMjLvbPOt9GE03TQ1XjYudpXzdzZ38/h4uOg17fnbG643emjxO1i ftbyedv18PGKpfz0uR6K/jW6J8WTOxbeJA3U1w5RrYMIIUZ8AssfPmYSZVyyWE5dR2kfmz2GlDNS WUlwJ2ckTJmG5ZSM5VaylBkOHs1vNmEWcxjp5jSAY/D5hGUr6EV0RYe+pAiMJKIjSleA4Td0o1Fh mRSuiaom67sTXLN4xZRlX4eA+4DlM2Zt7Vc4Qt1qnBNWqj2SLeuqmCcSrE67cufu/Qv4GSe9yTYi XrbJ5bGyjoOicjzPCOUyPghj8/EjMlgYmndyBm2wtGkPISIAADs=} image create photo ::img::3d -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt koOgcMArGgW3nGAoPDp1IyBxOX1aW1FT8MplZaXdcOrLFJuRSurQWj1/te1i84xWbY9lt/JOxTPj XFl/gDSDfF1ka0aGhE9vbIyNR49OkXOBaUtPlmKJkoWGZoKKi6GdOYOVf3pSeX6Xp62kr3R1sp86 uI5psLVXb7q+O5TCiJnFYcTIVsrLTs3ORtDRPcfUz9bX0tna1d2/3N824eIz0+Ve5OjpvsGT6rR0 53KzyfA8qaL3uab2Zoz6xHDy18XSIWb7QAEkGGYhw4L9jJ3JF2tiPYl0ej3852veOhcJoD+W8Chy ZMiSJEvaUkkjJcqTIl3GhPlRZk2a62zmxHktjk5qsH7KcDeUlFAWGvGtWinw4o58R1NQpJcn6gmH VPlYhTOVqomtt5biOQHWIFFzPKVGqtgw4tNZYMMmnUExrlw/JbSmXeGKngq7eQ8q/bsXKSS4hYX1 BWyRbGLFgBi3BUNCMpe6P1gGrkpBswwfmT2PgfG4I2jSHlKrXs0hRAQAOw==} image create photo ::img::3h -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt koOgcMArGgW3nGAoPDp1IyBxOX1aW1FT8MplZaXdcOrLFJuRSurQuJZuu19tVcck1uFpOa9uv1+z b1R7fHxcgH50hIhPZG07iotOcU+QZX95VpWBVpOUmnglTU1FlWFRa46PhGKnq2yRl26wiaOsOYqe c6ZKhZlnJI21v7FyusOMmMbHkpjLu87DndDE07bVZtLXR9naRdzdO9/gNs3jPeXmUOjpNOLsXuuv gamc8YOoltRXhb31YZrCmP0DqMybPVqf9GUiaOggQlwNxQAEJRHSMzMQKWKchWxYvou/swJqDBnN 4bsxJk+ecKfSRcqWwF7CZAmzBM2aaHCS09lOZsubNYHO9AnOmNCim3LyDJXqKJ1cjpzSEFkDolQZ Hx+2ucqin9ZRXFVkrCoKLNGuFlX1qRL2xMSIA0vB5UKw4Lm4CckKa8v07VREfGXJ/cvU5tkU/DiK LRhY8FqqaFU0ltXX7opFk898zBxSF+eNLpcWFhRTtJqoP5b28nHYnI/Upk28ptB62osQtD3o3s2b Q4gIADs=} image create photo ::img::3s -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt khqecCi45YoZolI3Auaay2gLWqJKr66jE8tNUTHdMNKUXGrD1uq5l8a2x0SwGEpf28rdupwdzGv3 Ox5+XB5vQ4ZChXZxi4mKjWwuh49uZxaOipVkF3yXMXhRepyBl0VOiJFIfZOQZk8bjKVor6tioUcj n622TJaovKQnssC3xMC/xozJtsjLqc6Eu9DB05rVV83XMtnaLNzdKt/gWcfH0qy84jSA0XOg1tG1 2Od3HIOVgvBSmfqu/Pv0tlGah69QPyVJdI0CGO/JqYAC06lbB7HexIjjlGWctJFjx2cfku+EpDaS YkmRJ2dczLhyXMtlw+CkVONr5hZdamzak+knZq8+L1f4/FkmKE2HqiquMpo0V1OlC3n6M8hHWEWh A3uQm/evWMGdBL/COjhVnsU/V6eM7SSL6SZ2vXJucTcU5Va6rsKlXXcrqltmfvdOs/IX8N2ZTerY fIrrB+KiFBaHwyFZGAzBzl6EoPCos+fOISIAADs=} image create photo ::img::4c -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt ujmecHgLlizDpHBkuiifNiMGSm0xBchrddvMIbFGLpfJYX2JWh15s5ounb0wKX3SxN1qOdicucPz QHRHfTt2hXJ/KXiHZ4B5MVmCiiORem2WKh6SXR5RgYGafJqYdWGLYKOioTNpp6ObqKsyrYlzTpC1 k1mxpKWDqHucc7a9g17Ejp26So3JHbqwqsWTxGxiVVe7zdfMiNHccZ/gW9/jUOXm3enm6Otv7uDt 8I7zY9P19PhU8vpW9/2z/gHkM/CcwILUECbhp7BLQzQP30U8NJFiRU8XaTCMuPFhx4YfuBWGRDiy YMmBJwGm7LdSX0t8L+vFnDcTXk13N9flxEZn576eB2VSAmYrIy9CHU9F2abs47ZH0Azx++IFHVVk vyL9WjpUKShIvEo1a/eKVFlOtLgqy/QKral/Zy+lEuZLrTVpdwMyAvZ0WaV8j5LmMubtjVd/h3Nt NBS4b7C6jAYjlvzYoWHBfctU3rtwk2afBrGCfkIpW1CXiUZ3S2vUmIsfrTdjoRC7DY7ar0Go7hYC R9nfwDWFiAAAOw==} image create photo ::img::4d -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt ooMBb0gk3XKmoLDI1I2SyqZ09iQpg9PsqhrFar+mZ1TgBYPF1ytr2WT3cmm1alyk76rQtXyYHuJL ZUBxfIN3SIB2iHFuM4uBVIdWiZKLO46MMn8tl496l06RnpyNnJ1bkZhQnzSloKqifTqrNkixKbOs joaUe4K2soWuZMG3vZbGNGi/xanAzZm1yLdTz9CvZth/1dhMmtzZod9m3uJf5OVZ5+hS6uvd4e7s 8PHv9Gfz9n74+bv8U+3+ku0LCIlgE4AGWSBMqGIhQxcDH6ZwKLEExYoCLlbUKJHjQ48Mu0EmFGmQ JEGTAVH6U8mPZT6X9mDSkxmPpjub63Ci01mOpzif34ByE0rtBNE2gUBuY0WKjsdJx7ZVyhjRl6lc UBXJ0Tg1qjReYy7iakrshC2xupyVNZu0Kti1K1rFNeq21FW2cgvWyCuDrzW1y/qmxYsJbVescJFx hSs4MKKJblXdbTzZ1NPJTeOmVVpU89SjRLyEjewPi1PS/H6BJvRoNY9JRzAKckFBNhUcthXCQN3S RwgRHoILH94hRAQAOw==} image create photo ::img::4h -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt ooMBb0gk3XKmoLDI1I2SyqZ09iQpg9PsqhrFar+mZ1TgBYPF1+tJbR3P2GQ3NZeGx9X1d/oub1Wh a3l1SyuDfH1bSIBQg3ksjYZzQHKQjoWVdix/bWWHlS2YmYk0oYiBpTSbj6F6mDaKoKwyqKlIXZ2c jTWur7l8k5G7uk50w6eirch+xcHHhDx7PcyWwE2mkrnXJc9F3MSMuGZTm9riRare5lKq6mbs7V/v 8Fny8+uw9lr1+ef4/Pf/zvgL2I+gvoEGpSUch3BhL4dM9kFcNrFgxSESL6bIqPEEx44l0j6CFCAS ZMmOJzWmvLiyYsuJLyHGdDhzYc2ENw3mJLgzYM9/P/kFzTfUXtF5R+El1eJt6ZQ+Tq3ZaZkOWqxo JBuuqiqMKyQjWlVghabsa1ayY7siM1vSrNq0v9iI5JWsGac7IcNuk3X1U623xrb6xTarFNdsgynW TZzC8DNRHB33pfvLo15PbsUaDrTxsiG7wPBQi9MZsKfFp/dGmutGWePWfdheduhlTFQmWNzc7jZ1 9sJMu4kgOjKSs0cKxWX4+JFcxXIKvm0+B+GhuvXrHkJEAAA7} image create photo ::img::4s -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt ujmecHgLlizDpHBkuiifNiMGSm0xBchrddvMIbFGLpfJYYWJSfJm9U1rdW9SvNvuOe2puTyz5O/i dydlcGuEQIAdUYM0enkeZ44eUYqJMo+QKo2Cl5hHnIxnkJyde5egm6GfZqqWUoGlWWCvkbF+rZ5T dF6wM3dedVa/GmyavcXEsLmHx8TAp7K2YlVXIzHM0oZ02NJvzttP199K4eJEpOVQ5Oh/5+tu7tjq 8MbzYvL1q/hb9/qO/VT8/nURCK4dwXwHzSVUuBBPQ3YPIUacNPFZxVsXMWZEuBFZR48fr/2FFDly U0kgJ02m9LSSZUswL2G+DHiQJjxgNt3hNCiwmsyfFQfdU2bHG7Rc/IwqauYnnC9erchAxRXoGh9r RGn5jHZ0oDFTq8Bq8xr1UTCxTVB+NRuWrcayi9rGDUZpbia3b+Fylbt3FtC1WfV68ytvWFG/LlWy UwqXI9nFBTsJ5ZkHIN8vOdGp+fWxGjXK/4hmLjdrtDhnRToCotDSx4+TrimADh0bxKjbuC+FiAAA Ow==} image create photo ::img::5c -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt khqecCi45YoZolI3Ah6XUFoTGa3Opkmr1oTNbrXTUzhlUZaF41Kaexli0MfuKrijM+P4ude2l+Lf KnZ8gHdsZ3qHdW09T1cjZYkskI9renceMh6VZI1InZqRYqCdgY2ETqCSo36ikaOkaquOrWlvMael kJ6bLnmTrUCofjnEvL2oG7lmxpa7grGhw8ycyM9fRF23ntdVtdPcfL2w4HDk5t/mbuPpUOjsiu/X 7vGs9GDr9oz5VvP7zf5L+gE8Bi5aFIHS8KnjZq2dQnW4Dj6EE9FhwUVbEKq6RWliPX6a0kDeSyVx ZMiSIElaNKmt4sKMTYp5nHVxZiGGGO8NDGhzpyif2HoCdTK0XFF4R28m/bg0k9ChGn1GfRdqKruq T68+2ka0KSYqFBFG/KrR4DBOHLoOCsbVKTFhsbbJGbTVpaG6OZ39TNhh48lqex2pRPtXLxu6X3MV bhsXcbIWgyHbnMRxImXGTiGKzUvricCGkl3a+dxHMGe1cxXZRXQarOvNZkNvqlQ2amzaWal6sZpu d+58qZsSdC189A/hzmJSQC4JB3MyMH7rDoHjlfXrmkJEAAA7} image create photo ::img::5d -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt CoOgcMArGkm33FB4bO5GQKJz+lRKqVgZdHnNektb7ncsgJ6Csu5RrTOb0CxmU96zluCq5XpYDN/Z f3o8XIAtYYIohHg0ioUrZoiJijuNVTqNiy2YjilumpucgZg2OXdxo4yoNG50KZWXk22lkWexNa+k JIQru4NillG0ta2UfHW6v7yZvqGPs8aaVM3Ob8tkVJ7T18fb3WWl3mSe4V7j5Fjm51Pp6k3s7Ubv 8Nzz2OD17vf48fr79P78umkLeI1YuX7SoH2RZ6TXQoRzbGVhyCzZRIgNVaHDWBGXvS+byx6O8bhx pMSSJoV9JKNyJUtrKAt2owiQWk2CN//lzLUTWE+eP1dxDGqCJlGjQZH+VNqT6U6nOaHWUyMVXiup A+PMQATVYLFQvZy23KpQkiCmDmGNDTt0mEWyad1eUUoyzclhRduKinuq7psTRkFNEwwU7l1lfm3e Otz37d68Xx1/4hsMGlrJdlviwSO2rFqYUf6A0WvWiVfRnUgnkvZJRVVyDl/D5qq6JufaAG8Trcb1 x+7KcnzgvunD928XMIbPexGCgofn0KN3CBEBADs=} image create photo ::img::5h -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt koOgcMArGgW3nGAoPDp1IyDxSYUqg9XsLLpkar8nLhMLBnNPZNOwtKa1u+mtEj1le8czPJ4mrsfH RIAtgoJydod2gHsrioUyfV6JjU0sk5GPc5dSlnEpnJSYbp91KqOkLGeDnHmrfHOqlqyxrolwKLOy ilabgaCSmrnAoXCLasU1jjY5jaVvPMKGxNCbT767vNa3VafX2GVlqdnfVKlL4+Cv59/l6mbp7V/s 8Fny8+Tv9vf56Pvu/fH4/hWpJ3AHwYLKEOr78sZZlYM79EwzAhGZxIk9Aj4bpaWiqE8d5jVG5EhP pA5TIRm2KqkS10OTI5kBLCNzJs1jLL9hdOKxiLic47jZVHikJ9EURo+GgakUKdOmS6FmlGrwKVUk VqkmlboVatemX/9xC7vPGll7msIKfQbrzdefFtdKa9N1ZyWHv+hmnSv3LjSZSWt+xLlG78lJcXXR 6VWnJ0gZj6MFU9xWcAuPKP2uvMw0MyOSv0xgBt0sMt8So017Ip0mTerCOBfD1tS68dOLcI3NttYJ tdWGuWVLurX2LDxHxo9fSp7P9V6Fzq/KBpVEet4pPp4f9fHDugruFLT3exEivIfz6NNzCBEBADs=} image create photo ::img::5s -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt ChqecEi65YLEpG4EzCmfy6MTSm0xM9WsS4rRepspJmtKJEfD5pNFuRZenWJ0232hF+Hpe7eH3b33 W0g2G354c2odgxxnNB5xK455aIqJMpGDjZGSeo6ZLnKdY5qeJoecHlajM3GApzGvraAjsHWrhrUl tVybuW27mE2CgWyPwIuyZbiMx19QYrNgzVSPptLEiLzWjNrNxdxV3t/O2eJ25Vrh58nqWensfO/T 5PGW80P25l/V4PhR++P6+qDrZ0uYvIHMDvJDxa9dKIXjLkF8ookgJIsqKjaUV4fWv3wRwo9wcijt I0WM9UwmcUePVMt1L2HGBDlzW02bN13m1LmzXk9gP30GFTpUVNFeZFjWNKX0JbRnKL8daxqIKjJZ ujCqTHkRiVVdI1OKDJZUIFUsHlmiJUtN2VlVXR8iRZRJYlyGarbUlYs1odG9fjPy/VuwUiq8RAsb FBWYbal+jRkLfAzIKlJllP5B7UVn692LnO/csyyHMN17zlIJPiqI9DuzUdltPvo49NDWP2738RE7 no/ctHPB6C319/CKyJN7CBEBADs=} image create photo ::img::6c -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt mheecEi65YpBolI3Qh6X0FlTMI1aWdPMdXvKarlcb6masijNQjESm+y1mUd1+QvHuMfxZ5du49O8 dioaboFwQG9zaIRkf3oyZpCMgiORjmx1HY8elpMujJuKiZuNe6FUoJxOo1J6haoebKCkh6ankLaS pZS4qZ54tqelRU6NOca5nbx+eL2azStNsJ61xciXyq5gZ3kx3dbahsLgV5/f4+Hn4+bp2+zqz+5D 6/F39GHw9uj5UfP7rP5W+gG8NrCdPIHTDh6kxophC4SvIA7aARHbIofQ8OnCOCnbvzSI6PpwTCYS 2EhilfQ5y/Rw1ceGLkVJ0yQy5jSbGWvOlMmSpk4qvFZ2CzqrJFBgDYchLUpom8Y9CysSpfi04Byr BrGC1KqQaz2vKsH6FMuUbEuzZdGSVFtLqr22Vd/uUuQ2nTSpHqs5uhuXmVOegRCiOYZvMLFfkX79 9DbSDmMy2fqh6jWZFmSNlTPKYnZZZ0/AG8QdwsRBaOi0LRkvTW1SIN6QemNVqTiRdK7atJeZ5iQn d97UsIOtGX4xaqrefQ8vJCgHLe7kctvU3ddcrfLp7lwZsY4LCAXugnCA7wIDutwQOCarX78pRAQA Ow==} image create photo ::img::6d -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt moPggEcskm45kjBobO5GSqZzaktKqdgWVLC8Zr9Ha3cIBm+vXhSZun6KS2lgnCgkntdz7tLZ7b2j KWNtO4JucGNqgoM0iossW3p1iYU8jTqQLY15K5qOKpicnTqdmyeYnpGKhJpVcqiWlaqtUZKTiLGU NFC5J7yrfZc5vq6lM8DBtHuhqKPFn2K1nFnMj0mRZdgCp9nYoNxl3t9f4eJY5OVT5+hN6utF7e5+ 8WbW8+n19uz4+e/7/PL/nMALWK0ItVH96DgzttCFPxbHDCpD1izir4m6HgaSddGiFo226TwyHFaQ EauKHGUMJIUSlkqQxEhCPDljYDKRMlzWhBkTYw2dLzs23Ihzhc1D0RQm3amUzVATR4FMS0jQSNSq UHliTXF1qzatXrOGNTR2VlmmZ9Gm/bg2aNuSb5/FhWMKLMFoXblMzTSx69Kmy5RdLWry700pUWWO 9IlUsF2ghW+FLHEU8uKieMGKailZTd3IKXOyVCva8kzTXB+HBs04VZvKqy8zzpW4s1BHaNYMbt1S RW7KdpE6fYVHd3C6WJj9DvOW9nF7kvPyuyIdOvXn8yIiaY6XwlwXOL5ThoF93osQFDyoX8++Q4gI ADs=} image create photo ::img::6h -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt moPggEcskm45kjBobO5GSqZzaktKqdgWVLC8Zr9Ha3cIBm+v3ihaWFuW3NU3mTtXs8czPJ52nnvH Q4AtgoIzfXJAgIUriotaYl2JjXCMk5SPkmmWlymbbIZJg551naN8oaKWeZtxNJ6rqqdygWl0jW2T OlBunLZ7uI6gdpEowa6/rbeln0TETznKy07Mz7O9J6RF2a3DZWVbat7fqFzi4+boYeno4Otm5O5Y 7fHy8PRO8/f49vpF+f3++AGsNnDKv4K6BCIUBswPtVQOa7E4WCwSskq8nMmgmOnOxYoW/z+q4Ggt FkZWDGWM2tYxV0qIJlWslAUL5cmYExW2NLbM5UuYimpG26hz5zWZPn+qDKpjqNKlGhs+fApV4rGp VKFOs0rUCMsdX7suNEJy7IqyZlOgTXtiLdsSbt8KiPuWLlu7afGa1TuW70K/9LIBdvdwcDqNesO2 AToHL9amXJXZjQr5seSi2ERWxXoZLFOpvTJKcYuTRWmPjTH7coq09FnVrzZ/FiubdebYtBnP7okT MeaZpk2VvIIW+M2ka+D+1qN5OC2NydVdRf34NnVNDpVXjqg4k7WKiKTL3al9vHXiqs2iN9+6PPtu cH+892XCR/q7OOarhXF/4IsQFHgg4AaABHYQQgQAOw==} image create photo ::img::6s -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt mheecEi65YpBolI3Qh6X0FlTMI1aWdPMdXvKarlcb6maehLNzKN4ZVm2hWsqepyE19P0fPm70/TU fEAbfYN4dG9dHTaKi4seUh5zKmRYkZCPNJSTkZqCnJloc5ydh5aQiaGjLaOSLk8YqG0xgXtBs7Cn TndyTTm7m726jby0nm6kq76Froh/zcMcYFtit9LTZs/WUGTZ2krI3lHg4cfk2uPmQ+jpf+xg6+7D 8Vbw8zL19pVn4metyf6X1AEEhs9TQTnOfl1SmIyQnzQP5S2MeI8RKEcWK2HKNXGZxowN3ztG+7gx ZMVPJEGyGairZC1TFUHZIgZOyy2GrjAWEXbSF0+ODo+x3GOnm8yDB/PlVFqO6behTjdF7TdVYFU7 V9tlNbT1YlevX2OGFTvWSaKyh86WHVENydpCSHH2lDQyqVFHKx/CS6IMHd+fLeP8k0UToM3CsV4N ZTXYJS+1c1UmlpzqqOPJI8lGpphXslTLHjtn1rxZLmbTkEHfJYiLWZWCnFWzFowRqutWcewmTbtS D0J1/PS5HT42t217EXez46N8Hu23an5Az0IB7R0f0tECgXE834sQFFiJHx8pRAQAOw==} image create photo ::img::7c -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt khqecCi45YoZolI3Ah6byygLaqJKryerE8vNHkva7lUbdpVpliH5q8KoL0LrGZzcBe3sudON5zPz bCl3f342gDOFhHptgS1pj4t7SDFphoocMh6RW16BmpWMn2iAoHuaU5+NgqRyqaiiiKyecJRwjrST m0h0k7tVTTmlr0CSlrmDnUrCxh6ry6PPmcEdYmNPI7Wq1T2z2oTba97Qun/gdVzkl+mx5olS64bR S/C32b1Y9Cuw7+J9p/zoXAHEJzBKvlDYjhEUU2lav3Lb7jF8GEqfLTMUzbyRVw+ex3Px+y4a88cR YclVcUCOO6kxJUtnH/v0egnJ3shYzTpiGhUyp0lq7FYC/blTWs+hMH3eulREoc6m7izKbCqxHrGq Rjcqo8dVJFNuEcNyEmuObMSDZlGlrYZ2LUq3AeHGlWuNbl27BjPiXdaWLF+9cB9J7MsWaNeXGMNt GMsNcLLEd9I1LCYtGOVdkHj1hOo1KWdhiXSl8jb6F+iMpS3uc6oZ5z+ii023FIoMdlRGMmtCm0nu sO9+rVx2rjz8lxfhiOncbs34qOPas5tvRr70uFYiJ9fghWh8e1Dr3quDD497LOGz54yQV23Lh2Py Pn6sRwPjvdwXISiM3s9fU4gIADs=} image create photo ::img::7d -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt koOgcMArGgW3nGAoPDp1IyBR+qzKoqegdbvCmrTcsMlLFZuRyhKYNbW2d+TlO9Ws1uFpeYv55OOz c4B+RUxrNGSGgoWEhYktiIFqjZEyk5QqcSuWjnubNnmam5d0oqNjeZeiO6qHaXcoloyNUEqDirY1 sZ9SuJK9uYu0vEOhr7KcjzmzxW7Iyb7OalymXa7RZ0eIYdROmVvGYd52xGfiTsti5ka64aDj6Fzq PKzx7kel3Lvbnu1m7PX+JpmRdwycFYIFsSGUhQ1NwyUPF2aZZkSir2b5TliUY1DHr2ce9oMVvObC nop/wOBdMUlKJQ2UIGfQe8lvBsJSIWeyWKizUs2VOUUG/YiJJSyB85C2WiWUKdGiSTumJFmS4bsi G4FQxGr0YZWsXvWFLdd1bMWyZnugTSuMbT+3AOFuASu3at2va+9W0/uELtw5ftm+Apuxks87WaXm ZBNs41OZ5FqSs+hyasdlEmFCrsxxTWalQyMffcPz52bQE0/RNN2pJ9TVqA/H3mtZdG3Fhj5zbt0U kOrQhW9dy513WPDRJIlb7ZMccHFp3yBrfF43UWCzjq6PzU7d7Row2r1i/sGXdxMf3fn6IF/eBoz0 bF+EoOChvv37HUJEAAA7} image create photo ::img::7h -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt koOgcMArGgW3nGAoPDp1IyBR+qzKoqegdbvCmrTcsMlLFZuRyhIYNVQ3aW3pekZeTrNMe7zFJPZt aXYpfX5/LIR6ey1kc26EhiuPiHSBjXKSb5GYiiyMd1+bmSqhop2BmqR8pJ+mNakyr5SuoTOxV0pN pYmTtZhQOW2cu8KqvDRRkoOQOsbHwI+jxHDSi8/NoKw8us6O1EBW2YDYltNr3kWe4b3BeVx16rB/ 10d1R6vwPaf2q+76Rvf9uADcUm/fpjAF/9EKGOYgQn9OkolJGHEZQzPtzFB8so0gRHBn/0psDOmR WaZz47r9msUO5bCX3Na1PIdoXoqRlxyiWnirHM9otlrJ1An0p9B4Qdnwk+VTYjFfMYdCQwqVaVOL h6pavdpxZ8aoLF0q/Qo2LL6nZ1XgVJa2mJG1g0C+/UiyZN26cO+io6vXSd6+KwFr5Cs4X+GJhA+L U2yXcZW/jtUmjqzGxWTKpSAr/qr5W5WzvDp3Lec1jmayJjtKhGwTLbnVl4eNZot1Jom8RF2jzrUG blLaTntyxQp86tasv8fl7pJ4YOngbk6sdV50uaAxzZc+Nw5KevY8rXNqmdfIN3jUxWHisZz6jthE KpWxpzxtPn1VN2MzJtdZsLk7/QEW2h0P9z13GwUF9oBDgjbAoB9jL4RAgQcUVmhhByFEAAA7} image create photo ::img::7s -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt khqecCi45YoZolI3Ah6byygLaqJKryerE8vNHkva7lUbdkm/OzI6ZVm2hdZy9ULEwNFyp72XTOPX c0FMG35eKx42HYOJiDIeeYY0j4Auj4mSk5RgmZhmlZMtmZqRm2uioZwzVHulbTF9h3avrKitb61A eqO4RbqXSIJskI7DKk0cxnRDtL/IYlhQI7PPXHHFqtRbgWfXd9TM0LvLsNXifMHhXY3p4evc5e5R 3cSgY+aY9e/2+fL3qrLAbvWDl6OgwIHf5hVaNkWZsTr+vEQUNnHTnYODMP475zBjx04e9MGhQreR ESF8J0H+i5eMZSyTzkYqUinTZSBLJenhjMWvIUqbtmYS+/kqIKQksz6+RJkr4MqCvmhmdKPQIseK trxl24qE69aqXn+FFQN27FCz6rCi9bmWXVt9bxHGpTp36py6jEjhfTlN296WfcCK/Al4T1mNdikG 9qfMYLHGUYM+uYfU6K7K5IzefQpUF8uD10417Nl0s87OlmPWIkqycMqznF/zFAo79mDFrf1aham0 Zm/dwG1f/B1cMPHTq037UVsqufI0Z2rv/ptMGPWlla5Xt66d1CrmYdEZ6X7zlg/wc338ID8FBvqx L0JQEEW//qMQEQAAOw==} image create photo ::img::8c -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0IrtQpGXrni7Da4sS7RQ6zyHh+YdG6xK9jJ3cjtll+P9 ZW8uf35xNlaGg2prgkxcLWiRX5Ajko9Tl3UemVmbh4qdm5xOojSThqKTip4zp42po2ClrVyJQTGJ mpGyqm5kkiZqOYsywqSOpBt8vY6xvrx9gc5uxJ/QhGNpT5Wy2Veq1d7aoOLf0+VKzOjmcOqm7piM 4YfzxefB2PSN73e5tP6U+u17BzCewHurEOoh2K3eMlyV4HXSx+FfB2v2ZlFjZY8gR10f/w1mDJnw Ii2KSKBZxKWSH70ixxim7IaxkDaFC5tJ3IiTzjpvO38yEpotKFFkB4kUFGkzndGJL2c6JDfsqdFb LSntWgp1pAetJDV5/IpJY8CVJnmmPYs2mlq3TDM2vBoRIsKn0pQOPFlor1e8PnVOfZun72CQhwfJ A5y3cL+b7Y6KYSz5WeVmii9j7qq5bMpFlNeRZcy1LDiTlBN7LmnGapOq94zRbANsz8rPfkNxs7Uv KCywZJPVOvfbdPCstoGvfRgyHN3jb/PF1To3dt3ZfA3rnYoKJ9y2iOdQJC3dtvix5AHOSR+64Pqe 2OUZP9/ZOL762enjzxw4tND3+yn3xBwPAfIEBAUFyoFDgqbAAJ9kL4RAASwUVrhJCBEAADs=} image create photo ::img::8d -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtiEzQrHaMF3CU5pre/dGhg/nat3eRLcNrGd f3p0gyhsfTqGdVd7hoWJijOPkCtlgXaPRJJPSTKShy2ekyllLKGfKqaiJ6SioTuuNJWnZo08mjaM eZeJmZi4U5a7TEW8m8DDbsjEyrE5xaiziNGUudNKXaosstlpRaxi3E2k4NZG41zBYud4tWPrTbfq nOi+8mOwXe+9+Fb6+/Vc/P1L128eHIABDR4kWLAbw4YOy3lTGKlip4n7FhIR6EjXwB4U/1c8s9Wu mbSRNeLN4EgHJQ2Vi1J6ejXTZCRTJ2FSe8mvE86VITsi9Klzp0yXN5Ea5akU1FBtQZM9TMosJk2P JLFavaoRJDGLoDBGDCcWzVQnLK9WhUiuqbmoA9eihavW7Ua6R2smvKd3L1+7d80+nZsGcODCcquk zdpNDd6v2FY9bsyUzGQ/kZ3mWdyyK7RAnGmRFZm4GGfDn+WanlyUaEk/yBa31vwadpy0PV03rcMy Vd7Zkn/Xpo3acc6zpJEGkz2YeNVnp4czXcvnTWjkuqERMs6YXas3YEJHyZx682XKyduIR39p+3r2 28Ofhw/b/Xz6xzb/wP/xCAX++eAAoBJiMNwH4AshUODBggw22EEIEQAAOw==} image create photo ::img::8h -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtiEzQrHaMF3CQaep+0WE66lrd0nNlU/4/Pt SWBtent/K4Rmc1eBdYOEiCyPkItubCaShiqYljNlnJWbdZqhcStlkaSiKamqpkkypH2hNq9ys7C3 nYyFrZs1vrR0iSiSO8VPOcd5mb/MunSfy29E0cGJ1ZelxtrP0NxAVq3W0Gljp9PlXKdK6ea17Wjr 8GLy8+rvqILotvrfKfWrLDkLyGSgF3wECxoEdWZSC4DSco2K1Q0XxUOpANFgxU8iC4jZ/y5O9Oiq GbCOyihtJJkw5UOEIx2iXPgPZkxFK2Wq1KFTFradPHFu26eRmj+fRUBGCmdEqb2kNp82jSqViNOq yIyI47G14lAnRIsOPZqPbE2uNDH+fDl2rdq0LqiGfGSS7jiLmHzmFYvX5c2eB3OynHuSrd7CLfcC LYuYWEavjBX/tbv4bcO0iADHrTsE7jVeYQPXBTVa2F2sVa6ihrx6amuum1+bPKH6dbTaeZhGroO7 Ethvx3pf0yqU4ZzemncnfoPb70yiCqXUbmzZ2WXecr0lN76dTPbP3cF7PpKd427KhvtKXo5+eImr 5qunnAT/sXz0+t6X94OZf7T85HEGmj9Z/u0DoBrfDWOaXqRFNI1wWN2W4GoHQihVhROihqFsh4GB BId9vUcBiFbhQOITMGS42gshUODBizDG2EEIEQAAOw==} image create photo ::img::8s -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0IrtQpGXrni7DU6lXOZzPf0KLUOtc2V+h3vseSqJr9vW fmUZOxyEVoFOhTQean+MMh5ubY4dM5FpdJh7l5qCj5BpmJydiZGLXHBZnC2jpyaBgzGDbWGyiCpV sKk5d6y7pX+lt4lLqXjCvarGfZKWvBtjXmy20dLK1WJuy9hRzdzW39jelmhE476kzumZdttq7s7M 8KDDk++zlPW466+Vp4qu/vlDNxBUPmj0CvoS+GnfpYAJG256GE+dKVoXDVocYSvZRDgd/+e54AcM SUmCRU5q7FPsnD1DIiPaCSeOJM1jN8e4zDlTnjmPEGG2tKmKUkowO5HyUrlwoyylLmNBJZl0KkCH GZtGVDiS4kqCErtmfbmVD1iEFZ2axXhVq1qgmdq6fUvUalUyMOGWxZm3br+Y7NoNjeMXSDnCPLMV ThyYsdB+jllCjuyKmh7KZ3cV1gcWq5m715SIVHT3zrOkppmarSoVn+enrqFOLov2tdxtrFex5Wqy KN3YYsPuO7g2Lu/hDGsbl9v4t03hfkDbrct8td/iyTXJAdNO+t9x270TE30u/OLexTLjxSxzPfvG 298j535Z/qb14nmu/mHfMxAK/TGBQxKAlsBwnn4+hCDCKAw2GEkIEQAAOw==} image create photo ::img::9c -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0Irtap3dMNgZXFmWZyEUWU61exc1d6tKwt+09XZOjt/9 TFZ4JnY7hTaCaWaAf3wyei1nkpCLMZOOdZguHpp7HYibXJyKmaN5ooyjlISqp1mprVOxj6ikbJK3 q6+4g4t0k6w5wrqhRWSBfYd7aMSyyRmhzbK2rrnKYkRVlrfYV5DU3Urf0uGg5eXk59mdlczsmXLg p/KR77uMiL31jen39L6GoPGzxypev2gEC+bj9m8Xw4P9TNHyYG4ip2DBLs5Ip+oJoI7V/yxStNYE 5EaCQSx9FGgNScuQJ4Ud80QqzbCEBzGW0tUQYEBbl7hlTEgHi0RvRKdplJJT6UimSSstjdL0ZTKX b/Tti1fMpVCdcALJ/LrModeeCmOOUFkTFi98ztQ+3Tk3rshPTvHSmjfVzaytcjcEvuYz5kOUaxPj jKpVpJyBBtG+gkwZ2U+4g8M2Wid5MldxVdmoCxd69F7TnDehTu159UK2RV0P9lO1cT1qI0N3LuWX w5h5xsjeDt72YWzHbMmltHo17e2+CPUyFz2b8FDpeDj+7d0XN+K6dAXDnHj4tWLLl6M2l+qc726a PGFVFotZ+O989Z/LW1U7v+Pw7S0EmjImhZRm2hfUyVYRggqeFJuBoyEIoToF/tCge0BQcKE4OGyo BgzqufZCCBR0ZOKJnIQQAQA7} image create photo ::img::9d -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtj01YbH4/LSnGI73bZklqkSWu09uQl8Wr/p T3pTcHOAPGt8M1iFhIh4O46JLYuGe5FEkYQriy2Zkp2ecTSejzKknymcmoyIkKE0lKispTWZgUCV uI6Yl6Kzda1Fu7e/wLSHuVc5w8Z3sixqz1Fdq5Nyx2hcqtncnNzdgt9o3uJp4TPVkEXkptKj7qnn LH5N9MS1wbz2sPJtva7MFPVDYQtZQGX4Cib8hxDdqYUKrUHM9y6ixInY2h28WJFinxUW/zl2zDgH pMeGOvb1STYI3gl2oFZt1EUEZieTM6fVHKjvZBWbPXMaAQrwlTaeRYWuQ5qUZROiBn06gdpmnlSd efRZJVkya9KtW12SYarLqZKwXOOlZIhRrACqLVWONOuCLKmmcjcxPZXO0l2BbdMSNIrSoVKcV9UG Dkr3Jdm4blfmhfY47h/BdbVWwZwZE7Wl5cTBDe2V9LjKpus4Tn15rLDPMcGMprn52bDZjC7Lul35 MFpUvNf69pfT3uiQhq+Wgvs38O7VyZEbI0zZeV/JbKsvjjrZ0PHs0ZPtmz18OjZsuCdDBOYFddfW 5tngxrr5t5n5rMHIdp/fzH7WvOBSAid+qel3H38F5oMEgNwNSAGDVvjwA4RDwYAgay+EQIEHHHbo YQchRAAAOw==} image create photo ::img::9h -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtj01YbH4/LSDBS2wTLmFH5NZuVv95q92t/d NFgncHtUhS2HhzOCbyaFj4iPfot2a4OSliyYmXWOgJ6bdCihny2MfaR8o6mBdpGbM6Q2rpqhsbat jaVzkDSws7x/q4o1kjtQxsN4OsTAf5yXu8zLzskp0jvYlHnaQFaqzrzgaE6M3eRGp+PoTafsaO7v YvHyXPTXn9S1YPos99F6oKFiMmnbLUvN8CEsaIqWilTrxGHKdRDXQIsNfbHah9GfQ4Ud/5X96qRx JEdrJCuivLjS47SWLBmmLCkzTq9wxWqqFDUz5y481ARS5PFzYVCeBonwSSQzYkYuELv8exky3Uel G61M9Vm1yNaHIm9683r1FcCV51wSPYq2X8+dS8U+Q6qWq8CEMOvCZUvH5NuYePt2TfF1bkIlYQ+v +Br15MSkrwZLzOuiLCjJhuUutsztMWDNXjhPNhw5oNDQdg2dDjsXp01+aS/neSK6Hlnb6Arjpr3b iSrdvaOdAB5cHJna176VBkN8jm+6yZqvVvmwF3HFr/tFRz6ZbvXDBAHp9utYqOkShWVlp1w5Nfaz oFHvfd+d/nGa5OG3XMY46/eO0PSn3lFnzWAjYHjTjVbgOOkZFVtrTQXIHVAPBmPhZZ801xts6HFX 3Bkgargbh0d4WByJAoiIGzFIfEiVGT6Y6OJwOMzoFQwyFvdCCBR44OOPQHYQQgQAOw==} image create photo ::img::9s -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0Irtap3dMNgZnEq5TGtmCh1a3Ohxqiykp+dtU7K33rXt eht+gndbeYaEMx6Fih5xLo42j3iLMo6TkDSXh1mbmmhxm5hIno2doKUrop+Bb61vMX2qQbGAs4iu iEVko7y7pJwqTRyzvS25g7y2ykTLljnEYlhatdJeXMjWZ9jB2nDe4N2WZ83GlEvZknUX5emmg87H suppe5L2rPeJz9H5jZXyAD7T14+NQHmfLgWM9I4fQyCnHiL8JxHZqoYLR9Rix0xZLGDu//Do+8UR ZC6O0EKKXBdqn6FvfLIdjMfm2kF05hJ2uDYtVRRx8CTi7KnwCtB6sEzmHEgUmq+eLLuppHmLZTGp R4XlRPl0IUmVmShqVJrx47yaYncaFFrV4c2Ib1e6VXs1bti0+Oq6RIv3rFa7d/uCheuXr06qkPIy RTr4b0l6QZfCXQdHcmKYdchhBoeTG+dtnj+XQ0Jqi+jKfbImVk0pWDTWpzrrdcWaK0iKX/PYU71m 4+DeZF+pMXdx9l6ZxH22fovqMF3HgAMR3Lucutbpiqtnv479cVlnj2ErbUw4pB3x46Oa54TeZDus 3GPK1ivdjebZpk9TltNe/5fS+vGRHySAATLyX4HOPfEDggQBQQGD6OAAoRswWIbgCyFQIMqGHDoS QgQAOw==} image create photo ::img::ac -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt urygsHTLnYzDpA1Jsiifs9FRCq2mqM0Y1srdjrbcKpYKDivHGXPXyFGL2cyyu5e7EJ3zpNSeledp fn9QgYJnTAJ4hUNefIpBjImOO5CEkipkWl+Hlix7HZyAdZ+gMp5tpC2YWoiVqGCRqKmHsLErrbW2 m7ihu0K3vVPAdMKTusSXxscuycomv8fPxNHC0zq0b3MYatVRaWHcpd5rbhpm4OHXT+fIme3jax5W 61Me81nw9djy9fas33bt+vn7V6fPO3ICgyFMZ6hZN4fhIMqS2IkZxISWMErS6IijIo+FbkAKEvlm lkVctEjq+cIKTrN4A6GNUulr5klSmjLdkajN2U1Xje5dDBrTYcqfMinmepmID81HTfE8haqwqLQN O42Ks3o1q1CtVqfWDIsU56uyoI4q3VSE4iwKSl3giEsEBtq0PkKI4Me3r98XICIAADs=} image create photo ::img::ad -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt ngOecGi65UxBorJ3JA2eyyhthIRKryuqM2jFektaAbT79Wq75LL0/Gwn1Veqew6P59Lp+nDkLvX1 SnxtfoOARGGGX4iJWItvjIdNYnmQOmF0lUJsmJmWR3OUnSybf6JTTZymM4iFqqcoj64yi7KetZG3 e5K5r7w7tL6ju8HCxDbDxinAySfLzGDIz9DSxXqxZtFSrYrZS6mN3USg11HO4uPkgeFC6Om4X+2h uvDx8kxl9dhq7dz76P3+vq1ZN0TgQGv21AFyV46gMXPPIDKTmIziQ4fELGbEGExjR46+dDyGBMlL ZEmSuUyKuqYy0zYBLSGliplo3LRnNknQNJQTJspKM38CTbOTEUuhsoqaUoqv1R+m9NAUgkoPyBuq XvjpRLoQVBGuCAl9lTYmFtaqRMF2PUrtpU9qYpT9IOuCAty6du/qhKEW0IsQFDwIHky4Q4gIADs=} image create photo ::img::ah -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt ogOecFi65U5BonI3Qg6Sy2iraXpCpVjXkfQUdLPg4tYb/IbBVHLJfJamrfB2lgqvy91Htvq+bMa5 VnxKfoGAeoI6aYhhiotzY45YdF2FkT05cX+WiZh1lZs0hJ5XoDKinqU2eaipoVt2ra5OpLEsjbS1 K425qrxDu76mkMHCxEzDxrrIySnAzFrPM87RYtRTy9YC09bbQpqaeGGorOFZo2SwUd06o+2S2Dzt 5+VY8uR98Dv26fji+7i/8un79+jMPjQC47lDKGcew4bgCt759HDinXXPMDLTmIyjMY/Ef0AGE+mL JC+TuVDWUhmLZSuXi2jBFERx5kRwNts4zOlvHk8w8kj8NLdwaL1Af4weLWNGqSCnfKBeTAjqWyGp 3iolpVqVVFOum4IKBRv2HtYhZticRcv0xNqse6pZo6iNbFeZdqs2+zHXBYVse/8CLgIj76YXISh4 WMy4cYcQEQAAOw==} image create photo ::img::as -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt njmecEi6BUtHotKWtCyftJHJCa2upMUY1srNTrXJbhVLDouXZcyZK+Wsx7mtQP4eji5Iap141+P3 fGaAcINrdIVQdIKITECHjFFHapA9QRqUO20bmI1zm5wzmpdob2Vznk96XXKqga2EX4tMk2yyrmCP gWJ4uLaZvr99vVa5QrzHxTrJyk6Xf2jAoc3TwtEsy9LVp8jWKtgt3J7Dz8bdKeF94sN25o7ad6jh 5bfq8enyv+zvwuL15JHl9jVTN+4VuHbcqvVauA5gMILUtimM2GkWLoIStWCkZu1bnoX27kLeQ1Yx Ekhe/QpSlMZsHcmLf0iynJUy4caX3zzWVNnBH7+ZJnfePMnP4LluHD/C00hLpgydHJ0V7WnUBdKJ CbM6PdiSIVatDbm2zEIFpyhRJbOxinm2yb9rCD1YStMzrclPGMnidRjwHy29VeEayrCr3d3A7M64 qVV4MSxQSnRCPjo5smFKrSSDCqMZ0tK5leGO6oxoMelCpi+XJuwltOgtpxllVu3Zqut5t/PlZrZb qW9UvevpbR18bZ7ggJ/FBjSKeHHQx5F7MS495JfqZG1jf7Uc9bkf211QwO4NB3kgMGivDoFDrvv3 8D+AiAAAOw==} image create photo ::img::jc -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAD/AP//AAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt mheecEi65UpBolI3OjWXUNkTeYxaU9Ni9crVurbda1YwDkfHT4967Wk130ewdjAI0Ot4vJ1ul6v8 VF5kcX4VfId7fYhfcoCCGUh1WIZ1hheVfYxoboRTiU4EBHt3pKVZGk6cbndVAaJsaJBAqiyyAqFl ZAUBu7uaFqm1rZ4FxXG4hb28jUmzwlTAWsbQu8DWyr7QgzHRZLTbacXZSNXcIxXYnR1FtObc0uNF 463pWmvezxy601TzQPXg2jgaFDAIunnKkPxblg0WvhXnNuxDuMweOYZwrAVk94ygOXvz/9AlW8ar 4RuLHCFWMRDAwD9+JXl560YyJphuzlQC8SRSns0vvcrRbKawI0RxOUpWkxSJZLmZMwbmImcsqSU+ Flgh/VjJ6B+pFQfpGVWJVQZfZrHEm+TmoVhFxTB19Yh2QIEBBKmC5WRwLCl3XmIKsBs3INJvfx4p shM3aeDDcYsZ5qdTWNjFZNNwqxqD8N3Ja7+0vbyYMCaCdcTVvYsXw2Gvk2D6ZbVtsM0RpUDvraWL 21jGd88NUj2NDmvdiGMLxZRZUh9lwDy3vvC68lHOGEwv00N8WuQCyGG72Fo783aMGAaLk5ua8lc3 1ZNqR9r9sPFDhJXuvu6L0F8LxghlTf9WplT3Xi3kvQNce/Wp9oZxrDG43x+HKWhecOXsYlccpWBi IFsIVgXVfMYwRcZcRZjWlX7JjTeNgv9VKBwQpsz0oWghVjPTgjWdyMdDhjS2441OSLXVJY2dNIo5 JSbpmnsg8gfjXzuVtxWVChJZZY7mQGjiW00hZRpUB4VWJHycdRgHhgAyRglWZGoZCJd3xGWiUg02 GRyZLIrnhJimeBDUJWmx06d1FAbI2h7H4UmcftqldOiBUmIF3GdnnbcUbQPKKYiUQXw3kYPc8aiB p3mBGt164CjjXB6W9gGgjn6+JOBgdtExqohdOqlHb25FmeituVGnYXn//brPVJ8Om97/fa2R6lGQ wY3lU7A4qoobq7N+NIdZyvZYK1W3isriSSc2Zm1eE6qFXWfcvmiVb+BmYguliQ6jnq41WSWXurLO 0u54zNzRWwbg1jsXSS2eqdJ0w5UYKyJwoMostljs6FQmTfU5qbAZFzmUsQwXGWBST2kzJ0ST3HRb SO8MKg+UW1zcCUfR2JSQWjSlLBwcbW3kTsUYqVz0zP1JZHNB+vS2s6RP/6TP0g45HRbUxMiLCtVs +PQ0kGv9pDE+SzNtC0Y6Dng10uoQEnR5EdFTtNriLtv2yomJXAbahbgiCrnD6MvbTun9efQXoUCD E8gu6L242Rz8HcmP46ZkD1Fidai5Zd81U3453iETjoZclxD4+IltW/U24S7koYge+OWimWKrr7Kk 67AmUsicQFsGy+/3NCu8GWe4THwXsRzPRfLKW8F881A8Dz0RmBsxvRJE+TDQ9T3gwL3zMGz/vUoh 4AD8+eh/AEIEADs=} image create photo ::img::jd -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAP8A////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt moPggEcskm65knBobOpGp6BzSoMCmdSsyqrEar8lLkkKLgvEArL5i1Z73nBPC0p2rwJDYTrP36fR W3M5dVhJKXh+Uop5f4ZKh4JjS4VzWGp+jSl6J44uSUsmgKGTpEKde5thkSwWrHGdBJMEoat3AQWn Rxe4W4axpLNHtWOct7lnFbi8h76lwWfDqcjLh8rGyDG7g6Wbx7olvwPPyYbl1rjZIxa83JPQriTh QcHkYebG1O9ny+1k3siS3E1Llw/fNVVHqMkTMm7VQnq78u0zSCthkoXzENoCxzDMgAIg/1uFOpdE 5MF4sipu7OKFnMiRFKu9FKixVxROH9EkI2kvmwBl1KQJg+dK4j6S6DyFzOelJrNKRo1JxTWk3B+Q RosNYxYV6y2qpiwswXBnwD9RHqNq6Gc2G7pOUrcqLYenFYZSGXi93GdWLs5l6+rafTNwJ5S4RG29 1dZ2sAZs174KvtU38ZacGqhmgOZTrEtyppJa5uqZMRyzbUMerWC2QOWVttRNBs26LmrbdSeuC4kY diDOmk3jcU38o3G9qndTPstcdvDAbW9Lz204nUu/FQM/p117et/db/kyF8S6dWDh3qkT5N3bJiuA 5kM25n78eDrOX5W9dq8YTxCpw2EQXP96AH123WhzjWGQcQJONl2B0C2HXVr+mccacc4J9qA6S7mF 1jdFDbKgaxnkFB2GjoElIYJ/VQggZti4ZmJ3AlpTlWi+kaagjSVSNqNgkBkT2n5PsWLif4tZV5uM 2y0ppEXjhXgVgJ5F52N4yTQGVmtEegKVfwBCVtyS810YHyK6TagLcpIVOF1dSWVJImhIdqmVkZot 5iZuTl7AoI1QqlnYeXu+aeE6WrqII3+XARVngcWNCeddklFVoKCfeXUfboZSCaCKexVZll47YZle Y4c6GZ4+jJI2GG9nnKqhpxZChmlO7K3GV6T19emZXkPlOFd+2sTK6bGT+inbhwDhKVj/crzd9kaq ky0qai9bUolOY5zhp2ySiEY56q9sOrYZpeC2d62O07wVJ2HfmkTirQVxWCIpZJUGk7jYwlVPee1s 4MK8LI5yzF1hAdyao3BZ62XBYXhVFS0WotOVnaGcpQlMsBaDVFfMhoxCKpV6GzE+DmfpSFMiX0Fy PTJZ48mBAWU8hwkPwaRLSTxlnN9r4YyjMUrAnFyTQRJJdgHRHTV7B0dFW3R0z4EiVgqIT6PCjdTB TiSzPSfnkLPTgbAlRZivxtR1b0GD/Z7WV+u2rNcnDcyFNC0LgJE4Nscc6r439Z213s4IzkmSdzh8 5+CEL/FMT3C4wi8kLl/ikdkYux1QaCFDu8wME5eokXmwpGD9W+DFMLJIInl48wnoTOQtSB+rL9L6 4ISYzswrvMfRxcNraGE52cFPMTyzxetw/D/J17B881Q8D30ToITyw/RFVH8EBdizgUP3VPiAA/Pg 9xLC+L2nrz4GIUQAADs=} image create photo ::img::jh -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAP8A////AAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt moPggEcskm65knBobOpGp6BzSoMCmdSsyqrEar8lLkkKLgvEArL5i1Z73nBPC0p2rwJSYTo97OeT MoApdExuORYmeH57eXxpOUIEJQR6R3OQS1h4hwWAikpASiOZkpRLlixWp2EDnJ2smbFBo7F8mWeX c61HBa9HcbSytYIuxCcYZ71JAZ3NzIKYwrfGiZilZDF9vMvOzr+4ttJ61GHZeqfZe9/Jz94jMTmm 4gOS5N/SuPDb293EBpPzJIG7Y07WmQvJfLVbOIiEPGEC7R0U8DDSmV0JuS305WKMNIED/7dEW7WJ F8eNz8oJMKBKWKJcHitd5OSp3ytEIWOuCgMzZqJdOA+i5MgTxa1jPcccw5ioVyeU1ajJXJZ0EFOT KFMiVcGkQit9qSSWbMrMpiIvGazOyllMFzRlZZ+dnVVBmVNjY8WKvWrSrldhcbX+8nqoqgu+Qi/A lVX3btGZqAi6rdanrFO4iu0+jTyY7bG9hzAMaXy59OVRON/lM7wUJ12vQk3fDYYwMVjJqVqp4XOh 8gY/X/8WXh32koXdr/EwWi6ktyZkeufM/tSlt4bg1McgGo77juanyIMz3fT3CpTzrMneXeyFLtCv 4evqU108rPxe2JEThm/esic0n80RBv9+pJWnHXntkaZMPkGJ1BN5pmUnXnWy/RddKpZY8NR1omCB HQY3JZaeSgMSBUtnvA1CVIOD6DXfgtApsgxdtrHDIIDVGEdWRtvB846PjcGzIo4kEqRaSoF9c5aP v8AYYm3diXTkTXAp2dxEBzk531hRtliTkBsy2WNiWv4ygIlt2fcikD+udQSN0GF2JpoB2rfjYV0R gtdiVdZn5Jq/dSjKBuBhNiKKfZ2mxoQeWTbbnFA6qGY+pcE2KH+N+ocHZkSuY2RT7AGxn6WZeoXZ gn5uMZGQBmb6Xqu8BebfoeCcl12sXJJ362uaXXhHhqTiqqt1x7WH3WapNpRWqWcxx4j/c/2xmOav w8lYrG8c5mcsl5JSW5tzoylYKWrFDoZYndQyaG6WslWYzbLctiggi6HBxam4yvj2k6+qQhaZo+Bl EuSy+9J6CHZkafpXc+041prBb+7pF2VfNfMUqqzwq+yVxTD5mU3eFJxsR4RB8qsLZmEcMcSRyfSZ IP3M+nAoOWIYxU4vHWOWFdtd5XKnORm01XZm3cnlUVierBPSY/LDEFYrh1MJ0ElUdBQ1Q3Gj0C5W 05N0v10vEZGKUGVUIz5UOxTQYwOWrdV8UqMjFkXzBDG2mEUnrU1BwIUrYN1TY5l120qN5tE1ef4N eFc6l202MiMjtXi4wJR4sMYdGWTQdsLzaH35FYYIKDXi4yinFCiNGs1ULV83FBNI8rzpyCK0X5Va EnUkbvMMyp0zuy0p9uvI8FQDY3zlHk27Rha7ebo8Fc23/nwT0QM9fQ3VS3Q9Ddlv7wTOZ/zgfRE4 +6D9+E/ggD4VPuBw/vothuD+8fTXj0EIEQAAOw==} image create photo ::img::js -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AAAA/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt mheecEi65UpBolI3OjWXUNkTeYxaU9Ni9crVurbda1YwDkfHT4967Wk138d4fBAY2Ot1uv5+Z7pz cEhFBARzeXh8h31YKmBOgBiCAYUDhUh0FZiZFotfjo5AclMxk3WWl3apqqqfSUB/bmSUp1psnq5F sCyAhFu+hcClt5GCu75OVC5kvKXBjxzFK6Ojg7S5pKTBzrUducZUFpKzVQUu2sLc0GS6Gt6T1p/n p2yksNByr1jykGvr3/fV8C0TUK6ZwXTdQCUDWKpSFUgF9yFcl8GfNEgUAcky9dCcwV7Y/95w83bR hIEABl41hJemlzZC1pZ90lUr37tjQFzKo0UsX8ldMqedwLQTnRSajSyOuFBOAKtCBm/SUOgF6MCg F1ZVcPkO6lSkjPiFpFcx1jegITOSXSrT6k9pbYN8nHsubhmLjagu00QRq616m8DovXtpU1AyqxJr jZsqXNuzF/GwxVbJDgHLmCsDRsyJKOGqFz0fzuPwsulJje0e6vr5qjTPlgBzNE2odB/Ad27iwjJ4 a6mxKy2jrnx7qQWYIHv/OYcNqlzj2Poed+4brMdgF6DGls49A3KQMb8s/+1Zt+rRMrkeb80e5gg6 1KmT/Q6e/WDnd7S776HeNx3rz8QAn/9v/ilmIHz0bdVJXn8cop97a/kmHyX/QZbXZb8R6JxX+BhH HzCsAJhTKsAkGF0ay2xIYIH2uVEaBthF+B2LLe6C3YekHaiVig2lqNwuA67XC38QUkigiFQ8iFyE K/Yo4Y8XxaebbNDZVZ9k2CE5yFYzRrLZlxtl+GR4j7gxoXPSpRWOdx5GpWV6S665FInCXaaZfD6i aSFv02XyH262wWTbZBtBVeFbF4KUm5okonaanX+uaWiNUfrJyZfE2akpZoReSmle/KS2po6JjcUZ Hm8KJlmaa7GKSaqgxrXPrKauCWtkarWqJl68mWUMk3KKBGVSM3D5kp+NtXPVsIwUW5//djmSUMBz ktwqRYlz1VEmOGztqUyAcXCF7ZA+BUTSY6AR+4wTSx4LzojCVHFSSslYlYRYKUqEDBIYbjdQdK4l VRFwzNQ1rUb8Dpirl4P5pQ5dMRSEkbkLU4uWLYUe1CxoBMsZCz1b1vUtxWI5xh5Cyma8jQlNDaKw KGk07HBZKse7WU7zhPKQzDM7xu9cXqgazbkBb9zzdRoPLUvO3u7Lrc9Pt5FwvNY+jQWpqU3t70jp Gv3u1ZpoIhmqLlM9UdEjO+0EH3oo4ja/TC87MVw2sN12Io0dimJVgfwK7N8+o6GXGUIITngXhh8u htCKW5F441A8DjkRuxkxuRK4+DD4FeU7+PAD52fAsDnoeYWAA+Co0xNCBAA7} image create photo ::img::kc -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt XgIgb0i8xYBColI3CuaayyitOYJKryyqBcvNPq3dcEkLFne1TpNnzfa00GlSbjqoB+qDux3Pz6fm KnBxgGNlQXkViHcWe3aBb0dbSC5JagSXmJmXjIRqkE5Vkicafx6YnXJBn1mjGaVtr6hqsmOtGJSP t6NBBLRygFu1tmVHuaAuvL5xoFBzkqHOzMzFxbsBvavTwmy/z5Gq1Z7XylTHT9Md4MKp1Mjjnxzg sOHA6p1H2F7oom3tqbX+xOVbAc3VF35CqgWzp8rawEBf5P071jDYwUIMF4J7WMpEgQAF/zxRumex GcOGG8kBs0JSIztj9s6908dqShWU3yJF6lWFI66aMmRmTEMtEz6Vb6ZUzEjv2oBTybI98mLyaEWe 1wjUgTqTIDmIHXqd4mlUE6KoNAna2mQnEiJNmipoNZpS6h9LcdtykhtX7latMn22SuqEgADDiA+d XaRoU6KsUIkKnpXUAtxTehlnyJPJj7nJGLNgPUw6cS+9eTLbmbtJWleIb7BePnUHK6Lbfp/mQwL6 V2zLpYMz4pm6D2TAhXsiFW3ZqGW5ix5D58uV93KvbRGvvIDb+FzP09F6fcMna8TCp6WPc6pbp6Te yyDqxWYeXffVmPxsgG9oFqn61EX3Fv91rVnkW1oQOVZSN9wxht9T+m13HVikFNKGVu0R5cyEHVWU QWtj0HZBft8wyOFIzRyhG1bNPWSeKx7a9ZOGvGDI4hr+VTgeVSsdwpoeqUWnCxl89RfajhcdR5Z0 nDlWo3u67EjQjZKseNoe6r1Hn21nIfgHfbdktdV0Ar54oHnlyTgKmDzJAeGVeJQZJS+HJdKllIGA qaWItnGyZIsK8kcOm1VYCWScbykSnGnPqWmJe3JcMqacjb01m2wnrgkpZE/pwV2Qdl6zKGmNeumC nm4apQgnq+J3mSimajpIXs2x6pYfptV5TqyPVqTbpEr2+Wmw9fAaYlH5kXWpdE7g51L/pr0mEpdz Ym1CJYzIGBspPpK2Bx079OHkUrZ4fsntXFW1oxBKhJV76rnh5jTUrkE5eiwobSKEkzzKiOSurBGt K0s4FhLjH2XM7TtUNwyOdJe/B05JMD8SMezhrgsFPMigBL/UlFDaQMnOBvGZy67H7EYDZTorP/Pb yQtPRM08+4Ty8j0nycwvjjLdVPK7MKurkzY1D1nwhje7s/OmFppjkolH5tmxOTC/NAzOTUdtcks+ z3g0GNAWHAuOKD5rr9WnKhhP2WC75jJQLjR2KYhXu+NNiWr9gagifHPyysMpRjzVKH3sXdzh/foL h5Em9uO4GxgJYkYYCSU++RALXk55LeaaY2Hzz50XcR7joc+AhCQilK7E6RZQoDrlOLzuOQyWy15K CDg8rvvuH4AQAQA7} image create photo ::img::kd -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/wAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt DsCBICjkGY+3GHEYPDp7OSBJ+qzaokKqddsaMbXccMrbFJtdWPDZTM4WSZ643NPFTt+5LmFPCPD9 fIGCeSeEY3Z3cClvJYAWfRV7gIJ9jV5eKyNLS4ZfLkREkI5/jZUCAQOdhUpNnCegqxqhj5eScKl1 XSYFoAWxHKB5jreqJpgqebygA76NaKcacLYYuSaMpyXKvcbQzjHRp6ZZ2CzHZYpfy1oW5N/Y7jmY 48WW2UHN2OrLJAYu7//xTMGrpg1IszT60BUC+C9cJWrlEJZJpu4gMobupAnEFZFEQWYK/z8ahBOg n7+BGYed4piJ4kiFAj7iIzkiHkZy4eKxREboHM47PtGxU4QSJztU9Ei+WvhKTb2TNwvtPKQLxTVn sYgylJq0Wzma1RQWzWhs6rOv8I51M/TNZlGuYS/WbPiuE6axY8yuqoP3J5o5ZbuqfUaWpClLGWxp jJch7hi60Gh1gDYtksBpjv21uwAkkoXOR79Jqll5dGam0FL5QaV6dSrQcy6E83s2U2oiq9v26aya km9RjTtGDLYaEmzQN1MCly08E+5JfXanEmVD+iXBgkEHuiDqMJ2c1tueDrwdw8OH0CmJrjAg/OC9 Ef/I9kx/dOL1ktqzHtpSj31h9AXIWv9nl1mGSnjjleKeJd19Fsx53G2QoDRIwWaYZBoUyNluu2FX xx6vtRYZJNI9uB4t+qXo4XAg7ldTbsvRQiFrHQbXXzm8tdjBYTMC02JnE67E2yPaBcRWg5y99uOK LWEwXZE9RkhfZDkSoFqQSFnpx3QR3rYMjKHt1x4kWD65pXmMcYAkTUPySFVE98noGnG55YYYgW7W xhOB05Fo5HMCUkfTJEzytJ+WkkCYoZ9Tmmdac4Ye2ptovwGHJHd/6GWMh+xxKdBkPVoqH5CQvtnp alfMWdyoQRR6yH1ajeWii9F12qqrfyVWaXkh2ukZcbTBZxt6sTmYpbHG3YWlI5S2Ncz/i6fSB9uL ML1pm0rMNuvsBsttWpi1kQ6lkkMSGkMmN+KV+gkhxX6V3HubdqFXX17FKwxA3+qZl11RzYUuW3Pl KywyZuF171NNVqvvulANFJlmVj2mLlwL0RvvIk4Zcg28jeDCn8GIKQwLNyX4xDExFHrTb2SGyERy TPcgTHBAAiWXggFeiAQSOi7XO/NiKr+lmc74SETFySw3G+tWTOkzkUfb+PyYcm5FZYJJTrsC9UtS +zOOUja7JU/WMJks2BBo5zToUUYVRjRWJQ/8KmmfNjYYIW8rLDfD5HYMKAcn9Kz3xc7RzFh3f0NU 8hLcbNIE0kilrFF0iKvTSVD5tPL4Xoof/5Ztd3leRY4WR589xq5/pE6KDHlQUTpfxcb+XSKvr7EG 40jb7sREXeluBO69+66DFLULb4XrReRufAuOS5HE8rtr3hkF0LOBQ/Vc+IBD8NjzFML2socv/gsg RAAAOw==} image create photo ::img::kh -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt DsCBICjkGY+3GHEYPDp7OSBJ+qzaokKqddsaMbXccMrbFJtdWPDZTM4WSZ643NPFTt+5WYCwJ/D9 f359gHwqeYZ2d3AlQQUlBWUWfBWTe5KUhyeZaF9uUmlAjpBLAoOEp31eXiabmkpNS69EnqQBs0So cIKadV2dt7NwHLM5qautrMglssDBpYgbhaXFvUyiVMzNkYbPMcXSls8sI0uxAqPaodMW6yPe64KX 4ivkzeLozY7e7vzd8JOL5iH6Ze5cugH65h16x3BXQGXCDN5KSALfrUV5FvorliEgPVDb/xjZw7iM lT9xtoJQG5fHmUCCeBSu2thNw0tOIt/cdHmS20ZbQAcAhTjthM6bXzjty8SwFDB2LH2lwHPBY8mm 04hZHUMUogWh1DLSfFhBKJOuXbliABu2ZsZ3wlLO5Cp1WVmOQPaRdOuKLdSPdVWZFZaXY9FUD4UK rYTWFztvZvGyBUhpV7EBfCbPxfnRT2SncOVamkRoIeah8qKOI6Dy8kLRpEtnZA2UceNxhaECRdna lMNStMFirlSNnt/dcmsWPgUOdG5jxRFVUul0cPXFslGKLjv8Nj3Wp7lDzpvV927CfnF5NwQE0PGs YKehkrwW8+L1Y4ZnjqdqzvavuEgD2P9qgmhWlQkHadAedpu50gUgtpQm4BBytJNSEBDi5wKEmk2o CRGvcUdbhhpqwqGErbBD3VIRYshficmcaFtHa/FTI4nWDcSSKRzYNV9ccsk2VHT5YXJBLsJkFk43 zL1InmrG+dVkId/Udsx8l5w34EeTcehXktkBiYGQRLrQpZI0omZjNCPGU6YrlYFnH41N/MVKIJ4N AqNdetr3HhwgfmfJXRC+GaNnIPr31Z2mYOchZ9Lt9xyA2sBpZG2/6fidnJP+FweQebq3py4tHlcY mBnCt2aEiI4KXKLiZeRoge6smBt4jzpI4HOn1oQKdYBG1htAUEZ6QV6fATffqeNBVqP/oXzmGZSA vk33pLNiPrklNJgoRq15g/YKqGSnQUvqsXvkyONo4mH0GasNJlPHdOmGleqlvWK7FFLy7miJYish 1o+qshq2FaRqfTXXY3vVGh9oC5tLsFjHuHOSwh25IHFKEFtMElwXozbOxsG29vFNHP11VEnFqvXU WHzWhEIZvCCoK5dBDRnayIfwZBXNRfFsU1MhXpUTKSz/YpdUFw7WlkZ7wQQGSNikZaEqMCskTjqO LGKROvGyPBuVWVMskTZdZxOL1Rzx99M6cMfw9SxpSy1E2Bgx5jZDVWFwNtfPlFNnWksWnrVJdl+E xTVF4K3duRv4dFBB244RLTjE9Jh4fDCuMuWQb9pQTUudnZTu+Cb9CTJlaXc08nfjpa9d14aXVmI7 VK5XRHMiTEQ08hjM6Qnh8EQh3vvxpyuqfIUiIV/8GkfU8jz0RkQyPfU6SI+9GFJUvT0XVHj//ROC fyLC+E6ULxQF6LOBQ/tc+IDD9fCjEcL8y+ev/wsgRAAAOw==} image create photo ::img::ks -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt XgIgb0i8xYBColI3CuaayyitOYJKryyqBcvNPq3dcEkLFne1TpNnzfa00GlSbhYY2O/4fH5+4qfg cX5jf3oDdYeGiWWDXk5VW4KOf4iHBAGWmJeRjCuPnkcuSSWZmASmp6ebcqqrb30ZLqiWHJ2LaqxB txqvGCqLh7hgfnNug6CboH2GwXxbjGzGub1ILstvxElfxdLSR5+EtmPaQt7Q3Mly0crhrbTla+nH aupq1o3ujvDnuZzoY/a18k0TeKzXPmxP+NVjF6hgunwPsx0kxm0dMxMFAhSYF0oQpIlf/+LIAeir mRWPohLK+8OPGMlJrugcbBkt4UiGOGVAUplG3hdrwK7FLBk0Ik1nFoAWDZilpCECy3YeDfK0AlBL L0MNFWc1addd3qIq/Sq0qThFwKpSiuoVa5VUWV/FrGAKQ9Wnsy6gFfvW68Wml+x8BVbJFB67mq7C xclsQF29X/FCTerYLVlNfst2guq4q6K7lzjjqbtM8eK/mydDHsxWA+gjeQ0y7VTZcx3BpaFg4wv7 tmDGb+zERpvWZsvcvcUK1uyLs+07lQ7to3oZqyGq1xtlMQyZt/SH1C3TjS1JO+3Hn6HnVniEb1RZ omBu7+yVLXLXgzdwKvmGe3H1nhVyn/9s8WnlBWb1+dXaaonwxh5zLHWTG26BWZBKZJSR48xsRI3z W3Hj5dVZgyDSZJ4vxhBGIWEZ3EccXRvydyBCiE0m4IQrllYXhC5w5ReGG4zY3QVQWcIjL6FdSElX D/4H4DLcHalLPo915VY/3r1Ym5T/XHebJk6sdxBoT1rVGZcjfVhVmEw+SJ2KLDqHpiOHGcmabmcF +Nl42XE4SQZ2RrcgYnfqteOJk0i2I4aG5UFaYmvRJRxqThEZVlvOWXXagKHFdcs1il4qnpnCPVro pArJWMt7l2K44KOjhkbFnFYuKmiLS1o24Um0ssjmZRy4WCCliYL51ZUOfVKHZSgiGor/UlGtksy0 ebJD7LOtxnPOSp7o1GufPFE0kz9m+YntM6nOw60uZZhkEqjvkjFuu79gpNGnXvRZkzgzSWsTOe00 BG+P2uw7ThUEdQNWYx65qe20bSgMC2P6agtev20UtPDAfTiMccQHA1Lpn+X0VBFBu7CXDcME7/QR Oua4i++qDTdjMLsppzsMywZ2FB8t+8lXiyodwOdzjOn2rOofssBHytEtf5PTZpqQEmkkSMfjsjdb vbJnentE2KNIIoutzI1o48KRwCJ1mPHb+rQTkhlmaEg33UipfXcPee99Btdt+70EHAwJrtPWQYhg uBJIXEDB4mH4oDjkV0hOgd6UlxQCCQ5wd+75ByBEAAA7} image create photo ::img::qc -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt khiecFi65TTE5G4kYDZzymiL6XRKr64j1IrtPoFbqLdLDY/H5aLWw25zplo1cECv2wkVQnM/Evfg YHJPdoR4AXp9T34pFoyAihdATYQVA4aIgVxZjSeLnWGce5N1AZaXfJKeakEmqoKtVHN3l4hioZuR rY+fkrJ0BKeisCtIuixWt1sDlYaHYDEXeMS5xtOrVUXLpnmYZYeLjeHYx6Djpb/NesJh0tdvwiqx 4b3n24eYRWrtkB7wjNAb+Cy7x62XQQvt3EAD9KbSMmAIDSoCggcivw7+slycxw2hOlcE/y0GAcjJ VaAvAA96pAhKES2S9MZZK1EgQIFqLvVtefaNICxPJr+sqrZyULKBeTryBLcr3jNgTwhY0nbh4S+C 32QE1dTJJb5DpqiGtQQNYtaTOP/BSapBqilgbslGq3jEbFqN5MDSGal31sJS36T1tChRLbm9pGL2 7AmGqmC4hAvjJWYH8DI+feCSrBcKIcytWyHjIcVRquBJgCv5gUa6KSPRo6n+1Txor6GBE88lIjcF 9m3Sni04vi18by7QU8TeI17ZofFSxDmvy8jrsGXAZutRqmoWqbeFvI/JzgDMe4aB9kLuBj9zGnpC A8tXVQ1ds7pmI1270PbcOVbhqb2Fnf8AEO3DXjygPTeebeYhtY1xkLGC3DHNKPfeYtfVZ9lDJNCV T3jEdHeeY+gBSFZ/zmQnWXUhEsiNZsV9Yx50G4Zk34GGteiiOgTGllpVDUZDUYfUIAhHhF/g91CB miGmWzd6FDhhiPe4uIeP/C3J5I/OZAajfp/kQSSRAGKAIn9VEnnflE4FZh+WYHGZVH+iibmPkcc8 FaWZVtFn2Wi6makUiE6xtKaT8qmGlI/XjXdnjoViEOGTUs0nHKMZBgqmLltUtKeWDnIJEXD+XUao IxusCVmogdoDX4lsopqKmx6xqkF6gpraXpslWZpocfB51Ghqm+azE2epVeqcg6TEN+r/dcUq5h99 o9LJJ4SwxepCbZ8li2wTtAGEZrbR1nbZaqGeCy5ZmPlXZ7mfNbMKqeCKlEijiZ26bRHvykhsVMEd 4Yum+nZF0SVl+ctHeYX0AaRc2hoMBmG0RlOHaFe1VSSkjrA42GPoiFVeQj3OU/BdLrzkFqAmmjaC itQNk2eYVJilpC30dSivRMls9Y8tNh/HrxM7S1TTTa8UOpEo4QTtcKc5ZLcTSkJxZUx+I21JjM7C /hWQ1ca6Ue9ZyZBJkHEbOTxF2sUs9mEvNhPXbgZCba3Q0FNLEne+ApsMtrTvsJR31LXupVJnPj+T myZuU703YG+zUrfS7lApDuF5lPj2idJoUb7RrnBzU9mHXP3tTzE/D7P36Ewznrg7f4O3EC1ZmlqO GTP/ZLraV2a+rLqfT95xmFrdG8Mlr6Jddxq5C5HS7Jknbzvuuytk/d3Lx3EGGdQHtf0S3X+PRRXa ix8F+Z2bTwT6wqvvPN1N/OB+EhJSML8XPsh///kweL//NCHAwfUGSMAPgCACADs=} image create photo ::img::qd -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt koNgkEcslm45odLI3I0EQ+CgSZ09o9Bpdau6arPc8MlbworDZOn5nAYLPPC4p9WOxgKEvF4fCObu b3g5PXRJX3YkeHsVBH0DgJB5gypfJpMpXkpaf3uLfkd3jJcnQi6FZUuJR4uCn2+qFo2UqUenpIiJ nY19oZYXsicFmgWWtrequZKtj6NvzMAlwpoDxMgrT2Vjq6yPiSMXzIIm0sO1LNhZlYOKop+h737i UtOlr+eD5NX2b9zo+46xYtCbtq9LDnJBqnHa1chdsURCRM0baM3gxHoLlXUDZM3RM3z0//Q180UC ITVYkna5W/fEo8SSIc1dA5nQHDuAFccoeSnApL6CmCbV61jBFS9QdxrGg5bODFAXlyoVxOmtGzJB AOWhkvp0zEiZVPntmsTOGc9spu7RgRjuGx8MkgKdPWesizNmct8pUqZXK1Jtau/Fe3XBFzYLgZgy 2vVwJp2VeQt7fcd41WJIdTE9klX4GwfCPPfGlZsZqkQMoD0jXg0tYC5/UAsJ4ryasG3UN72Kha37 3lhgq2tn2I3YF+Ov3uioFNU3ePHZnpG2LD35I9+xwxOfru2No2PB7S4X93q9b3fbga99LJqYL9yx m/UCD9SV5D2szKb80sWwKNb203lnkf9v4fUBBVYZvKXfb9jdRp0lv/kHhXb7MbdgI3H18seDtYTS kIELCrSYgge+lV19oMgWUDf6ibMefv6NdduG6dkVCXshHigafPEhOBxy9N33C4gUbiAEAfH1OCOQ vBUDSSsTLkOPHkr2qAGH3SVoYDtUDuRiid+g991MmIXXEJLxbMDYFFZKNqaNarYTTifsffmRgzVi ktyTrfiHoEr8jKBfm02mSFeW+zWkI51bysImL8ehmNyhGu4W13ru/Tcoc34FtRafN8G4V5yPQsoc lniKpx2m/BWWH6eoVhooa7yIl6AyOsIYa2qIzpqbaTf1iFeepoyn16yVccCgqEwy2ev/ntD1ugGF dxKrzamGlfVjXqT5WtmbQWV4yWWROQhqoDJaaxwnxtJmXmfl+hhrS3RaFmYH9HX24a5J9beuasB2 docr4KblDa72dsutdKANpq5M542BHWUmHlvURrta0WCosYhrgVEZk+LCcrsZNtpd64S8lcQXv7TO sCg3BkRv19wy1KwRuXuEVVmlvLKhNUdTzmseWaUnymXtkw/QdsE0jUgqGXXYwNZx5rQQCjl7tRJQ X2x0ygOPOF9TGGk9EEZRf+2kHwyN7dOkNZ+9BIIEj1vrIjItDXfTcn+BXzikUY3VyUKZUag1JtVk b60Am7Wjz2gxfXRPMUEoIVRsj+izi1N7T0451yOjluLd9SJzc+cGX9SFjDQC1DbhW2Fx+FOnsxwd WzvyYTpBQQYt8jkZ3pb547ujgjpgPUT6B9v8We2GG7PLIf30dWwC5Bo8YGHH9djroL313XPx/fHh EzF+7+Uzcf7s6c9ATyI/tK9+Kj5wL78OPsR/PxX5U2D//kEJAQ6oR8ACfgAEEQAAOw==} image create photo ::img::qh -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt koNgkEcslm45odLI3I0EQ+CgSZ09o9Bpdau6arPc8MlbworDZOn5nAYLPPC4p9WO5lajWM4yIPj9 d1Z0SV92LHlviXwEAYBlQQUlBUJHg1JKWoFjFm93i3+EQpGTS4mHd5iVXYymngF9jaFLmEOaLraU preMgXmvfaxZtMO6XbZux28EA8cXwLLDS8lH0yTNjcyc2hVBjtHE1Z1So4Yuy9l6vnywAqTfkMUp I7OUthXnnibpr3fu0ZHxbgmjFRAbO2v6Oj0h4W8YwHDzohU8F6zYHk6P/qnCE6MhPHsU/y/2Urhw YKqNxi6V0mTQURdrF0wQS3gqIxaWIdUdCYZBZimaHH1+iWfw3p6dFTNklGdJ5pgxy2LF0gdooQYg L2seghqDl9R7XpP23KoVzyYCyiz88TrVVUlfKOVB1BdrmQC2GOx6RdmIkUuIc62tbaSMLai7G6gK yVc2q1qjdvt6q1rS4rK/Tc1KXuvXz5RXoNIhFH3BkZ7Mxh6DLR3a6OkjQSSrDriJDufBIl1LpRv7 cCdWgAfpbksSMiJu6DAWfh300O2qJGH6ffKL2eG8RxvLna5bnKLdenovfsPMO226tp+f5neRlzXx fbKJs4pabt3uRQWvh49OEcLz1KR3m/8vnpWH0S8tyYdIK/XtUhqBfSW3B38GUkddg1ANmA4vUfXl jHXxGagLPwDCNAiHe91jXYey8YOPTsjJp505g/WHTVGG4RXbPrQEd4pRsSmConUtAiIEcORhUplA zhm5428R1nXkOq0luWNFKTkXY4WS7WgQLIw8416MsmHIm5JCLlYVKGGuuR+RymWJR4++eLnaY92A xuNmWMo1yGL7KJRnNq09A8s+bvqoWXmjJXkZgmrxcuiYfLrUnFkKwRTelEEWJyaEs834FIN1htSp Nt1Q+lyfTGJ6FI+DijiVo4gat2RtZM2XTohhMuoaTLKuqmhW8xnIqazgmajafcMylVb/TLKNB6V7 0YE1oJmVeEjNh8cxC+2zw2E7GrXRyijdshauyiqumn0FSqejfbUZa+g264KQbM3XyoaexQBMZ9fa O2qEWLIU6WeDQcHdXiWaR2x1BWuAVourIZbwf5c6BoilI96jMAdogfmWuB07HNO4rFHGCrVxtUps asq5a5haaY2asbMoZKKUphxL1SZLJwzlMM5CbRuzpXtIehBKuZiYq01DjTVrpmrlafNJQ98r1E/F YUyj1TTNdCtQJnHdUy/UhXSvRwNEMvZGbDcdnUU7gZ3QN1mPGrcodC2IcUv2lF1PYHvD8542QP3C ciX01DJX4XwXBa06dofddjt2zPVOmioR2qiOns2Q7O/muUQZJ2zrmmJGgFuRXnqBcFGzuOVC5303 QWL71R+pqeuC9dv/YULOSmvtruvb0GROR0YAYX7Txjb6BzwhjziNKQ187r5eYFgo/6Mc4IOvxvjA r0FE9zqbHwb61qtPBfu2u88D/OXLTwP94dg/g9g/6M/EST7In/+cgIMBbsEHOBCgAY0RggSG74EQ 3EAIIgAAOw==} image create photo ::img::qs -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt khiecFi65TTE5G4kYDZzymiL6XRKr64j1IrtPoFbqLdLDY/H5aLWw25zplo1kDWqNwWDAKFC6O9t cGByd4QmQTEjeX16iylihoFPQYSPX4hHeIx+fycWjpGSVXOddpSKfJyGFy6gaph6j5eQAYp7jaqT Ra2DiKmWWQO1fmFIunSxnU2+tKGhwbCMaxvGK1aeurCGA5LctM+20m+FKlWrYMNF21u636lto9Xh ZeDphWLep2DvlaShh5pHgtmDFCyPvDf8VPlb1WuLujXanh2cllAOQmUOv5DD80yfp0sM/yPZKWMO JMh0MQpKG1WyVYEABVShY9YSiEGON0nxqyjI1SwqD7O52pNSIi4u4xzxfDJTHVGifGA1UrmUGrml qP5cWCQVGtd7/ARaVTqFW6hNGIZpyElColisWJvk6SZ1E7gyBRW1reUtaZayXutEA8dVX0GMOdw+ 3MUK1oCvWdGCzIuY6F6bcOE4fiyYsGULhxEDpERg7jHNe4JBtSD5CWWMBgGC9EX22ObCWQVT/rZh tdB4qItClaQV395TVK8Bof3XNlHVqxtVOJzct/LlmZ0jUs2au3GJrFOrdMG8n3bhT7lTv8Z6kpbS 2eNlm/7YlvptsXGJNwk6/lVockEXjf9AoPXU3lbFAKfdHfh8FZRHa6Q2WHuM6fRZgHmBF9wwrZ22 ICILudGbZOUpdB6DGaao4oqxhYeUefJpRddJHwlGY2TmKCifJsPVeOOPIQ7nYTyQ0cfikSmCGNWL JlbzlGQiesCgaBXKxOEiQsq3opLQ+OcIVLZIKKR7iYQ3XkNMDrLjgWz2lF87jJzZZZUoZRDgnK7g pwh3fRiFp47kcIaJP2NOh5Me3vX5UJZXTcEcPnxdIBBVpQmK6Fx/NkoHbb2BNqlEYW5V6ZJekgeW p8iJlVyXWxHIaG1OptXpp37KZuYpafYUa1oOCpVXZ2q1imupnQjKYLCcJMcUYWnxlqv/RtXc9FZg OOUXWbCo5EMsLoqdU5S1qHRV5FMgDnkVnGKJV2tUdt3FEKZ0jtKtGi2K6huUEG1rlVj9ZMAVs9F8 pFa8fp0LKsBL/oHpwOZ+opM1xpFqyHCmfYRLkxtlUYmRrq3TzMKFlfBSTGpmXFNJv5o2Y7l2/pIG HQsx6N5hFZVZhIwIxSUiGOP59IXK84UoGGBu8EwgJHN0pAxuFOlcNGxKw5PSFndB+HI1VhcT7tFS Z3JzyP6U7PA+Xcl5ksoYjXPds8RMs3RU4Jnk9c3ljsX2UbnwuN/GbKUdR3NY483FYBKqTUssMpqF scN4k0duxXNcx5Ir5ZSlseNoqSOIXizJUNLy3YyrcSVNXEpOia5XZywDjo5NOXTglUP7X5S0Swlt 6mdIEfuzuS9hhuy9K7F7VcHTMHzxuv/OO/Krf/4D80m4RwH0XvjwPPVRWE8B8dhfFQIOtYcvvgUh RAAAOw==} image create photo ::img::tc -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt CiOghUcsAn9C4cXItOVGwWBzuorGrNRsCovVekncZ+6rDYPHLmlxSDQnt8t1fOdWlzTtTE/8tp8x eYB0fHppgoOHTmd/aCeJiH4zkVVQlY0sQ5mTKpuGHZIel5SGjqGdSqE0dommp62icKVsjB4tr6qN j4BXc3+yUKiwsYuaJmxiub1KYL6KwYWynNDRebTTtHCP2HvW2jJ4ZFKZy4GnRn6ziMvpVOjm2Z9l wnum8vL1We/Zxq3885j/pKXbFcyfvlL0eh1r1o0bJHZ3JoHTcTCit4vXQJULSAmiRie8/0KCXFfx ID5bqXDhOikw5TeOzzigZAlwpcuWtT6CGufN05WCKkcCYfjyCdGXcmB2lLPxnLKgZKKmkUqVX9Wr Fa86fOjUI9JATbx+XcmM3M6yYoftBNbz18+2U9fm7Hizptx4dOeitKkXXt9RfDfcnTj2rCalh83q pPgUZNZFDyNhhCstodfLGQsHRrNQMWGojAcuCamGcmWwFm+mtduuXz6lResyeQzw71mEXhKvXoo7 XGPDZmnH3u2zEO3JjbXlFI65p8flsDuz0xWFqKU32IcPpZ6MpzLqmwXXVv0d5q3xesEPFp8X79Hs M923/8za8HWyiZ1xTbopTpfQv8X33FAufEQGW2oDElMggMQVJ0odB27T1DCVQEZPWP0RsqBW1STx H4cOVQgfiM6IKByIEJK4ES9gIKEigMRQ8GI+OMwYFgwR2vhCCBS84uOPoYQQAQA7} image create photo ::img::td -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt CoMBKRjkGY+CW65IJCKftqWwCBRCr6xRdcvFek9appX6LSelXLLZG56OrSn4Va5rp+kl51wdHbr9 cU1QTXgydlR8VYRIhIkth4smjXo7k44rdop4loUynHU5M5yXK6OdKVqepqcoq6wmqUOlo5W0NLGU rZZGn31+uZK7PL23UpG6x3EskzttySfP0KSar6jGgrOs0cHV1nnYy8uN4Ua406LCZbFAe8xm6+3p bKFYrur09bZf8DSnxK1H+Knq9I9bOXzogH3bRq0HwhbukF2KWExHwYUqLmZ5mG1cxo4M/1UIDKRR XElvCfUNVLmxhqlaJ11wzCjPZc1HM0l6hLlzxkiaIVcqxDkM3JGgInNmy9dN5tEvTZ2umYqSqlUS P69iyaoVCteuSL6CPfjUS1QwSoEyJcvzrE63Z9qeM2nUZ1puPW1SNHR3Yd5+N1sCjvn2L6a+9gaz PKw3MN29ghWH9Oc4qUXHQ6nVJXqZoWfDkRsTBI20amegpOeatghyc56AfUWDDhs7JeFmtW3Phr3m tie0vSsPhpX7dWttQkuIlabNNcbjWIsHzfyLlLvl1amzg17YCnbfEj9T+i78uHU1y192rkxHbGLd kC1L3t3d+WqI5VFHw0aFfHyhdY3TX1Ru/8GnCyADFqWdbYEg6F1xiqzV4BYJ8gLVLA5GN9ZRb3CB 3YbfZBgXiLWI+CGJiPwxIomyefgDi40B4gOEMIKBQ41hwUAjiS+EQIEHQAYpZAchRAAAOw==} image create photo ::img::th -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt CoMBKRjkGY+CW65IJCKftqWwCBRCr6xRdcvFek9appX6LSelXLLZG56OraVm3EmTD+m0dhpelTfV K39udjN6VGSCg4QqiX2LWWiHcImULZSNhZF/c5ePKJ2bmXd3aqCeJ6Z4LVoyqYCfrnk5M6m0plE1 ta23spx9sJe5nTptYq/BpJN4yLiOoaiCnE7Ryaq9zqfO0tPU2j1SmCmqrnzWzdh84tC6cUis3jrk X++/PPJss+1H7Fj0UPxX/P0bVkbgwHDz8u1CNK6bI2nEFLKI5vAZtovXFvqpWIqiQ0h1/2KZSHdP hkFgvAKJNCmR0UqXAFecXJcSZk2QIUHZ0plRI7OJN3HmrDQUIcsdP3d+PIp0qVJzTJtCLWpkJtB0 9l71RIoF67k1YMG0DLvGKtl+Y88mROLVnru0lrTGkxt17tSnVeHavHs1m9CifvcGTmF2JMGnTmXq NcwzbuO6jg/3Tfp3smRxLyurjEnzsWbBlDtfVgw4KcnMpBEraljOo8XPgjFWY8xtsInCEJPRZq2M LuHFWY2iNeM5IHBhxZ/gLp2YlovjqolKFfulJHI1yz+JNh0ZT3bGuyXfRfZ9djVjhF5vs1M+nOtl TslDPw+fof2lG6lkTw7aU+0Sy3GGUntoKgQYFGb8/caccNtJt8px1iFYkx36QYhag+5tUuGCzdEn nSRc4NYIg+GtxtAoGwImm2UrgpjiULkpFeMoW7yo1j5vhDjfjbCgaEV5PM7hIwlABrmHjkYa4RGR PyQpVY4+7OikTDhMCYUPOEhp5QshUODBl2CG2UEIEQAAOw==} image create photo ::img::ts -format gif -data { R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt CiOghUcsAn9C4cXItOVGwWBzuorGrNRsCovVekncZ+6rDYPHWyp6Z06qhkx4T+yWnjBG/PxcX5/1 bBl7SYJ3G4EagXxKfh5OHDp2LR6Sb5ROjx0zlH5VnVucnyWhooYuoJyToTSScqOrJmukrGiAf0NX tq6CuUubY4mxcGJ2usO3mIy2hp/BLpW0t8uvrtK+wtXRyteZzllSUG6Rl2Wy0L+O5cxEs9+liORq 7+Op7nnMuNt3efOW5lHIsBU5pyobNU8GZRBEyI0aNG/aujVUeGgcvYroMP6SCNGfpogU/9MV/Lgx o0iPJ1ksxBYPJUlVtOoxTOkpZr5CM6/oK5kRTMCRPhklm9NP5cqaRI/OZFeUjDynUJ9FnbqIKlSl zxKaZDoQK8KumYJORPXkJ0Wb4XC6BLLzrMmXZGlaQgs3a0ujdCEZlQkzr9qcHZG+DWxXL8/BY11O w3tx8d6/bhs/HEuYMTxRWh33JYpPbDWtm3vgS7usqVR3fJt4DXk3jumRckOaKhdbtjAvqTfmevWl NuAulwtPdKx3tcC45zJX9OqLWC1uzc1uA1aUV1slLEk3NOYX4r/Wn6vD+h24kfjco+vO7Z44feXT iDVn1xia9Xv3w4fRkQwaeTZe+/HH1ElibRgnDT8JFfjaQa5hRgdwok1RioJWucYHhBUqQkiAGWoI BYcdJvNhVSFKVAcSJYZFCAUpqoFDi3HAsGCLL4RAASk45khJCBEAADs=} image create photo ::img::back -format gif -data { R0lGODlhRwBgALMAAAQCBPz+BMTCxAQC/Pz+/Nza3PwC/AAAANAB344A2hYA1AAAd9gYAI7rABYS AAAAACH5BAEAAAUALAAAAABHAGAAAwT/sEgJqr046817nmBREWRpnmiqrixahUArz3QNTHGt7/wt 8sAg65YrDY7I5ECgbDKbySf0KJ2eRsZpVFvlerVIE5akzG6dTTOyS02Tk+IiAR4g1NFnun2u7LL3 d2ElY3wDdgMGA4F5fwGIioVrkmWOiYtxJkeHdY53kUxVc5ujhluhhp2khoNymgQGe7CGsFK1r6Kw dbK3tWu3s7FvmFmjqaWSp8WQx23JqcarJIRhlct9k3SPi9iN2oXDb5qckW151Ht42Ofb4OSi6b1l zNzqmvPRBNPy12Hm9vz/ysFxI01OKFnqfiVEKBCYOYVU2i0ZWO/exH4VyV0MOFHixngD/zWC/GNx pKuCmRpuXCcSIMt0Aj0K7GappUpU3uDBYZUSWchnyz6tFAXUk6kyPNXM/HVLFy4CI5nmkgo1Y9Jw zX5CMibU2dagR3eiVAOSWk6ANK0xEpuvlcpG6FyuFBfXnxSPJuXZ/JimJD18005lhClU78Mt7Q4W 1sRwaGPFDx/LxHh4sMvFlAWNxVpqb1l7nge7uxoJ0N6bpmHORVUXsFucNXVSOrt2duyTbVMqM+qz 3+53vUEX5eORxNRdtLhRdQosKvJgxEmL+8obNU5OYC9fVyXz0G1/ttVCSXtJ+ku5UFKDWa0etz7f sq1YrB0S6WaNpzWKBYOZo3uDcDwWoP9+AgjACxsOLfSJRIJZp4VS+1TWBl5/1SeffqDF94RMfqQx Djbt3fWhXHeZN5OHZxFXTSAq0lahaz1l5dtwJtBYwnDzgGJfbhDa8hxzy1EFDJDJoWaicj8K2ZSS xz31GYxK6TgjdSfYSAKOXe34Hl/hsTjdbS1+9yKH6IV43kbt1VPifSdah2FnD/rVJoMUOWgFZxEm hBhpkCk4nnEkIAiRYwse6d9Q/OFZJ3sE8cgZcPSlN9+LGbK1ZZo3edjaFHCxY6J34mVqlpiqwaZW cViCRxSVcgrHKpTCLPmcc08RWdVSScISHZvbcRWWq9hVN5FXwe7q6Dcrhtalstl8Nxn/pnN1ehp7 I/4XI5xoiaZhX6PxumhD/bWaY19aAhiGgOdiNmif4EomXYOMameZhB2Zl5eF9JHE7IYmdkjJptFq us1bmh0b6ZehctlswmVNNqxWxY5LLClZWvoakrVSReuQGlvlrYzAUvxrZ6kGZy1ZGSUb36gMJ9Rv mdWqKfC0axqssL7bGpZtOXRmRpK8btLLRGIDRqYuuowdXejHh8L7s9DkWnwtpBXivDOj3dpM18AB /8u1v3p46i2oX6fsYpsLl8frbxJDLLLJq0YMa3RNNocxx7PeLWusa5cMMsmsVhwyNN2pfDXLZaNm +Nxh0zyzatJKrVSP4xFUKnuPGsrpNRfrIShquSd0LjoYnle0Yz4/CKH66j7IsfrrOviQOuy0yyA7 Ba7XrntbIeDgwe/AB99BCBEAADs=} image create photo ::img::s -data { R0lGODlhDwAPALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAIALAAAAAAPAA8AAwQkUMgpAr00aHy155IncmLZlWaIouo6unAsz1ZtjlVrYR+o 75MIADs=} image create photo ::img::h -data { R0lGODlhDwAPALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAIALAAAAAAPAA8AAwQjUIhBh5z11rwp7l8njmRpnmRYSqjFmtc7xppIx+CNezrt 0hEAOw==} image create photo ::img::c -data { R0lGODlhDwAPALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAIALAAAAAAPAA8AAwQmUMgZ6ry3apz15oL3caIFhh64rSZaiu4rz7QcB+FNmbh7 jr/UJQIAOw==} image create photo ::img::d -data { R0lGODlhDwAPALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAACH5BAEAAAIALAAAAAAPAA8AAwQkUMgpBr10aHy155IncmKJlWOGptVqhu6mrqdLomD75To/ WZgIADs=} image create photo ::img::quest -data { R0lGODlhIAAgALMAAAAAAAAA/4SEhMbGxvf/Mf////////////////////////////////////// /////yH5BAEAAAQALAAAAAAgACAAAAS2kMhJibj41s0nHkUoDljXXaCoqqRgUkK6zqP7CnS+AiY+ D4GgUKbibXwrYEoYIIqMHmcoqGLSBlBLzlrgzgC22FZYAJKvYG3ODPLS0khd+awDX+Qieh2Dnzb7 dnE6VIAffYdldmo6bHiBFlJVej+PizRuXyUTAIxBkSGBNpuImZoVAJ9roSYAqH1YqzetrkmzGaI3 F7MyoaYvHhicoLe/sk8axcnCisnKBczNxa3I0cW+1bm/EQAAOw==} ##+########################################################################## # # GetBestMove -- computers AI for determining which card to play # # returns [list $move $draws $newSuit] # move : which card to move, e.g. kh # draws : how many cards were drawn from the deck # newSuit : for an 8, which suit should be current # # Data Structures: # CARD($who) : cards in players hand # ROUND(move) : list of every play so far, each entry is # [list who move draws suit] # # Possible ideas: # o don't reverse if previous player has 1 card and played an 8 # o change suit if any previous player has 1 card and played an 8 # o play card that has most like-value cards already played # o always play "special" card if possible proc GetBestMove {who} { global ROUND CARDS RULES S set draws 0 while {1} { foreach {all suits values eights} [GetLegalMoves $who] break if {$all ne {}} break ;# Move available if {$RULES(Draw1) && $draws > 0} break set newCard [Draw $who] if {$newCard eq {}} break ;# Empty deck incr draws } if {$all eq {}} {return [list cant $draws ?]} ;# No legal move if {[llength $all] - [llength $eights] == 1} { ;# Only 1 non-eight move return [list [lindex $all 0] $draws ?] } if {$values eq {} && $suits eq {}} { ;# Only eights # Pick suit with most points set newSuit [lindex [SuitTally $who] 0 0] return [list [lindex $eights 0] $draws $newSuit] } if {$values eq {}} { ;# Only suit match # TODO: pick best value of the cards in this suit set best [lindex [SortHandByScore $suits] 0] return [list [lindex $suits 0] $draws ?] ;# Return largest value } if {$suits eq {}} { ;# Only value match # TODO: pick best suit set best [lindex $values [expr {int(rand()*[llength $values])}]] return [list $best $draws ?] } # Here we have choice of both value and suit # Always switch to a new suit (for now) set best [lindex $values [expr {int(rand()*[llength $values])}]] return [list $best $draws ?] } ################################################################ DoDisplay NewGame return
uniquename 2013aug01
This GUI deserves an image to show the nice quality of the gameboard and the playing cards --- the backs of the cards as well as the faces.