Java StarLogo 1.1 `turtle` turtles-own [ sugar-holdings ; agent's current store of sugar sugar-metabolism ; rate at which agents use up their store of sugar vision-level ; how far an agent can see vision-acuity ; how many directions an agent can see ;; Variables used in finding best visible sugar neighbor max-so-far ; best sugar value found so far hd-of-max ; heading of that best sugar value r-of-max ; radius (distance) to that best sugar value r ; dummy variable used to check at different radii ] ;; Agent Rules ;; Decouple move choice from move to prevent bias toward agents ;; who find moves quickly and block them for agents requiring ;; more find time. to agent-choose-move-M find-max end to agent-move-and-eat-M ;;move to-best-sugar-level... move-to-max ;; metabolize sugar setsugar-holdings sugar-holdings - sugar-metabolism if sugar-holdings <= 0 [die] ;; (if still alive) eat all the sugar at new location ;; if we moved, old location if we did not move setsugar-holdings sugar-holdings + sugar-level-at 0 0 ask-patch-at 0 0 [setsugar-level 0] end to reproduce ;; reproduce if have enough sugar-holdings if sugar-holdings > hatch-threshold [ setsugar-holdings (sugar-holdings / 2) hatch [relocate move-to-max] ] end to relocate seth random 360 leap 1 if count-turtles-here > 1 [relocate] end to find-max ;; initialize variables used in finding and recording max setmax-so-far sugar-level-at 0 0 sethd-of-max heading ;; preserve present heading if no move is found setr-of-max 0 ;; start by guessing that we will not move ;; start facing random direction - to prevent biased handling of ties ifelse ( vision-acuity = 4 ) [ seth (90 * random 4) ] [ seth (45 * random 8) ] setr vision-level ;; work our way in from the outside, so that we move ;; preferentially farther in case of ties repeat vision-level ;; check at each distance [ repeat vision-acuity ;; and in each of the possible move directions [ if (;; unoccupied? ( (count-turtles-towards 0 r) < 1 ) and ;; and better than best so far ((sugar-level-towards 0 r ) > max-so-far)) [ setmax-so-far sugar-level-towards 0 r sethd-of-max heading setr-of-max r ] rt ( 360 / vision-acuity ) ] setr r - 1 ] seth hd-of-max ;; point toward selected landing spot end to move-to-max ;; check if better off than you are now? if (max-so-far > (sugar-level-at 0 0)) ;; better off? then move to the new spot [leap r-of-max] end ;; Visualizations to sugar-color scale-color red (sugar-holdings) -2 (hatch-threshold + 5) end to metab-color scale-color purple (sugar-metabolism) 0 5 end to vis-color ifelse ( vision-acuity = 4 ) [ scale-color blue vision-level 0 5 ] [ scale-color green vision-level 0 5 ] end to color-turtles ifelse (colorscheme = 0) [sugar-color] [ ifelse (colorscheme = 1) [metab-color] [vis-color] ] end `observer` patches-own [ sugar-level ; amount of sugar currently at the patch sugar-capacity ; upper limit on amount of sugar that can be at the patch ] globals [colorscheme averagesugar averagevision averagemetabolism nowshown] to setup ca setcolorscheme 0 setaveragesugar 0 setaveragevision 0 setaveragemetabolism 0 ;;Patches makecircles ;; Agents crt n-agents ask-turtles [ setvision-acuity (4 * ( 1 + random 2) ) setvision-level (1 + random 4) setsugar-metabolism (1 + random 4) setsugar-holdings 10 setxy random screen-width random screen-height sugar-color ] ave-sugar ave-metabolism ave-vision setnowshown true setupgraph end to go ask-turtles [agent-choose-move-M] ask-turtles [agent-move-and-eat-M color-turtles] ave-sugar ave-metabolism ave-vision ifelse alphinity = 0 [sugar-growback-Galpha] [sugar-growback-Ginfinity] if birth? = 1 [ask-turtles [reproduce]] graph-it end to growback ave-sugar ave-metabolism ave-vision ifelse alphinity = 0 [sugar-growback-Galpha] [sugar-growback-Ginfinity] graph-it end to makecircles ;create the initial distribution ca crt 249 ;; make some temporary turtles ask-patches [setsugar-capacity 0] ask-turtles [ ht ;; setup two groups of temporary turtles to draw the sugar ifelse (int (who / 2)) = (who / 2) [setxy screen-half-width / 2 screen-half-height / 2] [setxy (0 - screen-half-width) / 2 (0 - screen-half-height / 2)] setsugar-holdings capacity-constant repeat 12 ;; create the two circles [ ask-patch-at 0 0 [ setsugar-capacity (round sugar-holdings) ] setsugar-holdings (sugar-holdings - (capacity-constant / 12)) fd 1 ] ifelse ycor > 0 ;; have the turtles create the connecting section [ setsugar-holdings ( 1 - abs (225 - heading) / 45) if xcor > (screen-half-width) / 2 or ycor > (screen-half-height / 2) [die] hatch [ setx xcor - .5 seth 225 repeat 16 [ ask-patch-at 0 0 [ setsugar-capacity round (sugar-holdings) ] fd 1 ] die ] seth 225 repeat 16 [ ask-patch-at 0 0 [ setsugar-capacity round (sugar-holdings) ] fd 1 ] die ] [ setsugar-holdings ( 1 - abs (45 - heading) / 45) if xcor < (0 - screen-half-width) / 2 or ycor < (0 - screen-half-height / 2) [ die ] hatch [ setx xcor - .5 seth 45 repeat 16 [ ask-patch-at 0 0 [ setsugar-capacity round (sugar-holdings) ] fd 1 ] die ] seth 45 repeat 16 [ ask-patch-at 0 0 [ setsugar-capacity round (sugar-holdings) ] fd 1 ] die ] ] ask-patches [setsugar-level sugar-capacity] color-em end to sugar-growback-Galpha ask-patches [ ;; grow sugar by alpha up to level permitted by patch capacity setsugar-level sugar-level + (milli-alpha / 1000) if sugar-level > sugar-capacity [ setsugar-level sugar-capacity ] ] ;; color the patches appropriately color-em end to sugar-growback-Ginfinity ask-patches [ ;; grow sugar immediately to level permitted by patch capacity setsugar-level sugar-capacity ] ;; color the patches appropriately color-em end to color-em ask-patches [scale-pc yellow sugar-level (black-is) (white-is)] end ;;Visualizations to setupgraph pp1 ppreset setppc black ppd ;total agents pp2 ppreset setppc red ppd ;sugar pp3 ppreset setppc blue ppd ;vision pp4 ppreset setppc purple ppd ;metabolism setplot-xmax 8 setplot-ymax 100 setplot-title "Agents, Sugar, Vision, Metabolism" end to graph-it pp1 plot count-turtles ;total agents pp2 plot averagesugar ;sugar pp3 plot averagevision * 10 ;vision pp4 plot averagemetabolism * 10 ;metabolism end to ave-sugar setaveragesugar 0 ask-turtles[setaveragesugar (averagesugar + sugar-holdings)] setaveragesugar (averagesugar / count-turtles) end to ave-vision setaveragevision 0 ask-turtles[setaveragevision (averagevision + vision-level)] setaveragevision (averagevision / count-turtles) end to ave-metabolism setaveragemetabolism 0 ask-turtles[setaveragemetabolism (averagemetabolism + sugar-metabolism)] setaveragemetabolism (averagemetabolism / count-turtles) end `information` WHAT IS IT? ----------- This project explores an artificial society known as Sugarscape. This society was conceived of by Joshua Epstein and Robert Axtell (http://www.brook.edu/SUGARSCAPE/) In this society, agents (red) wander around on a landscape consisting of two connected mounds of sugar (yellow). As the agents move around on the landscape they metabolize some of their existing sugar. The agents are constantly looking for new sugar, and when they find it they add it to their resources. If the agents ever eat all of their sugar, then they will die. If they get enough sugar, then they can reproduce. Each agent has a random value for its metabolism, initial quantity of sugar, and vision level (that controls how far around it can look for more sugar). The sugar itself can grow back at different rates. For a more thorough description of Sugarscape, check out the Sugarscape web site (http://www.brook.edu/SUGARSCAPE/). HOW TO USE IT ------------- Click the SETUP button to setup the agents (red). Click the GO button to start the simulation. The N-AGENTS slider controls the initial number of agents. The HATCH-THRESHOLD slider sets the sugar level at which the agents reproduce. The CAPCITY-CONSTANT slider controls how much sugar there is initially. The MILLI-ALPHA slider controls how fast the sugar grows back if it is not growing back instantly (controlled by the INSTANT-GROWBACK? slider). The BLACK-IS and WHITE-IS sliders control the color coding of the sugar. The BIRTH slider controls whether (1) or not (0) the agents can give birth. The SHOW SUGAR button colors the turtles based on how much sugar they have. The SHOW VISION button colors the turtles based on how far their vision is. The SHOW METABOLISM button colors the turtles based on the value of their metabolism. THINGS TO NOTICE ---------------- Watch the COUNT-TURTLES monitor to see how the agent population changes over time. You can also watch the AVERAGESUGAR, AVERAGEVISION and AVERAGEMETABOLISM monitors to see how the average values of these turtle traits change over time. The plot window graphs the total number of agents, as well as these average values, over time. The value of these traits can be influenced by the environmental conditions. Sometimes coniditions will strongly select for longer range vision, or lower metabolism. EXPLORATIONS ------------- Under the current setting, the agents can survive and reproduce. Is the current Sugarscape capable of supporting an infinite number of agents, or is there a limit? How is that limit determined? How does the growback rate affect turtle vision and metabolism? How are these two quantities related in the population of turtles and within individual turtles? There are many extensions of this model that are described in the Artificial Societies book. Can you implement some of them? STARLOGO FEATURES ------------------- The turtles in Sugarscape are all called from an "ask-turtles" inside of an Observer procedure. This keeps the turtles in sync with each other. This also keeps them in sync with the patch procedures that are growing back the sugar. The turtles also make use of the "leap" command. This command is like the jump command, except that turtles will not execute it unless there are no other turtles on the patch they are trying to get to. By calling leap within the recursive turtle procedure "relocate", it is ensured that no two turtles stay on the same patch. `SLPlot` title "Agents, Sugar, Vision, Metabolism" xlabel "Time" ylabel "" xmin 0 xmax 3444 ymin 0 ymax 100 pen 1 0 0 pen 2 0 25 pen 3 0 105 pen 4 0 45 pen 5 0 55 pen 6 0 65 pen 7 0 75 pen 8 0 85 pen 9 0 95 pen 10 0 105 `interface` SLSlider top-left 176 56 width-height 118 25 name "instant growback?" variable "alphinity" min-value 0 max-value 1 current-value 0 slider-number 6 show-name? true SLMonitor top-left 286 123 width-height 80 36 name "monitor3" list-to-run "averagevision" digits 2 delay 0.5 monitor-number 4 show-name? false SLMonitor top-left 324 18 width-height 77 36 name "monitor1" list-to-run "count-turtles" digits 0 delay 0.5 monitor-number 2 show-name? false SLMonitor top-left 285 17 width-height 77 36 name "monitor2" list-to-run "averagesugar" digits 1 delay 0.5 monitor-number 3 show-name? false SLSlider top-left 108 58 width-height 113 25 name "capacity-constant" variable "capacity-constant" min-value 1 max-value 10 current-value 10 slider-number 1 show-name? false SLSlider top-left 207 83 width-height 62 25 name "slider8" variable "birth?" min-value 0 max-value 1 current-value 1 slider-number 7 show-name? false SLSlider top-left 139 135 width-height 93 25 name "slider5" variable "white-is" min-value 1 max-value 10 current-value 10 slider-number 5 show-name? false SLSlider top-left 140 6 width-height 92 25 name "slider4" variable "black-is" min-value 1 max-value 10 current-value 1 slider-number 4 show-name? false SLMonitor top-left 325 124 width-height 78 36 name "monitor4" list-to-run "averagemetabolism" digits 2 delay 0.5 monitor-number 5 show-name? false SLSlider top-left 45 5 width-height 223 25 name "slider2" variable "hatch-threshold" min-value 0 max-value 99 current-value 99 slider-number 2 show-name? false SLButton turtle-or-observer? turtle top-left 370 19 width-height 75 30 name "Show Sugar" line-to-run "setcolorscheme 0 sugar-color" forever? false button-number 8 show-name? true SLButton turtle-or-observer? turtle top-left 406 20 width-height 74 30 name "toggle-turtles" line-to-run "ifelse shown? [ht] [st]" forever? false button-number 9 show-name? true SLSlider top-left 12 4 width-height 226 25 name "slider0" variable "n-agents" min-value 1 max-value 400 current-value 39 slider-number 0 show-name? false SLButton turtle-or-observer? turtle top-left 406 117 width-height 96 30 name "Show Metabolism" line-to-run "setcolorscheme 1 metab-color" forever? false button-number 6 show-name? true SLSlider top-left 76 5 width-height 222 25 name "slider3" variable "milli-alpha" min-value 0 max-value 2000 current-value 107 slider-number 3 show-name? false SLButton turtle-or-observer? observer top-left 247 39 width-height 40 30 name "button1" line-to-run "setup" forever? false button-number 2 show-name? false SLButton turtle-or-observer? turtle top-left 370 116 width-height 94 30 name "Show Vision" line-to-run "setcolorscheme 2 vis-color" forever? false button-number 7 show-name? true SLButton turtle-or-observer? observer top-left 249 139 width-height 40 30 name "button2" line-to-run "go" forever? true button-number 3 show-name? false SLCanvas top-left 10 233 `settings` patch-size 8 num-shapes 256 screen-half-width 25 screen-half-height 25 interface-window-xcor 1 interface-window-ycor 1 interface-window-size 647 452 output-window-xcor 0 output-window-ycor 0 output-window-width 300 output-window-height 219 info-window-xcor 0 info-window-ycor 0 info-window-width 500 info-window-height 419 control-center-xcor 659 control-center-ycor 1 control-center-width 285 control-center-height 415 turtle-command-center-height 150 observer-command-center-height 151 plot-window-xcor 657 plot-window-ycor 154 plot-window-width 439 plot-window-height 372 `string table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `symbol table` H4sIAAAAAAAAAGNgYGBkYCkpKk0FAJNWxWwKAAAAAAAACg== `double table` H4sIAAAAAAAAAGNgYGB28Eph3PJCOtP+2yoQWG3/gQEMALA6gN0cAAAAAAAAHA== `list table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `observer world` H4sIAAAAAAAAAD1M2wrDIAyNtrtAN9je9tjnfcU+pbYEFdQU49rfXybSwIGTc4PH RDNj3jCPXEzB6QPHveEcMNnihL/gsgYqK6ZqDTV8uL3gBMNCgTIvDiPW1M3IrrHI X2uy/AruTdk8e/pPaXg2KWIxMwXPUeQOrol2drSnNt8rCevaACXQnfAfRHEMML8A AAAAAAC/ `patch world` H4sIAAAAAAAAAI3VyworiVqG4WwRDYiSQQYRMgghhBBiyPl86nP3Xdg0jQobbbQV 9yyX7CXY7u1fS5ZrffUUVKVS9fAms6/z13//y4+//vSPo3/79cdff/77V6c5vu38 +X/+9C//+sf7P/vlp9+uvc5f/P7nf/6HX//xt/tJ5y9/+f2//PrLz//825dB58// 8Cfa7fzVH0ONG/52/u3/nn/228t//4cf//Xvfv/zf/z8+z+G/+ZPD3768Zcff/qn X//w25PfPf/rT79fn//n+N3v/ufy21l/M5oumB6YPpgBmCGYEZgxmAmYKZgZmDmY BZglmBWYNZgNmC2YHZg9mAOYI5gTmDOYC5grmBuYO5gHmCeYl5h3u/kCOl9A50vo fAmdr6DzFXS+hs7X0PkGOt9A51vofAud76DzHXS+h8730PkBOj+0d+rd6/+R/7+V 0XTB9MD0wQzADMGMwIzBTMBMwczAzMEswCzBrMCswWzAbMHswOzBHMAcwZzAnMFc wFzB3MDcwTzAPMG8xLzbzRfQ+QI6X0LnS+h8BZ2voPM1dL6GzjfQ+QY630LnW+h8 B53voPM9dL6Hzg/Q+aG902xlN3Q6YLpgemD6YAZghmBGYMZgJmCmYGZg5mAWYJZg VmDWYDZgtmB2YPZgDmCOYE5gzmAuYK5gbmDuYB5gnmBeYt7tprYyGujUVkYDndrK aKBTWxkNdGoro4FObWU00KmtjAY6tZXRQKe2Mpr2TrOVvdDpgOmC6YHpgxmAGYIZ gRmDmYCZgpmBmYNZgFmCWYFZg9mA2YLZgdmDOYA5gjmBOYO5gLmCuYG5g3mAeYJ5 iXm3m9rKaKBTWxkNdGoro4FObWU00KmtjAY6tZXRQKe2Mhro1FZGA53aymjaO81W 9kOnA6YLpgemD2YAZghmBGYMZgJmCmYGZg5mAWYJZgVmDWYDZgtmB2YP5gDmCOYE 5gzmAuYK5gbmDuYB5gnmJebdbmoro4FObWU00KmtjAY6tZXRQKe2Mhro1FZGA53a ymigU1sZDXRqK6Np7zRbOQidDpgumB6YPpgBmCGYEZgxmAmYKZgZmDmYBZglmBWY NZgNmC2YHZg9mAOYI5gTmDOYC5grmBuYO5gHmCeYl5h3u6mtjAY6tZXRQKe2Mhro 1FZGA53aymigU1sZDXRqK6OBTm1lNNCprYymvdNs5TB0OmC6YHpg+mAGYIZgRmDG YCZgpmBmYOZgFmCWYFZg1mA2YLZgdmD2YA5gjmBOYM5gLmCuYG5g7mAeYJ5gXmLe 7aa2Mhro1FZGA53aymigU1sZDXRqK6OBTm1lNNCprYwGOrWV0UCntjKa9k6zlaPQ 6YDpgumB6YMZgBmCGYEZg5mAmYKZgZmDWYBZglmBWYPZgNmC2YHZgzmAOYI5gTmD uYC5grmBuYN5gHmCeYl5t5svoFNbmUxtZTTQqa2MBjq1ldFAp7YyGujUVkYDndrK aKBTWxkNdGoro2nvNFs5Dp0OmC6YHpg+mAGYIZgRmDGYCZgpmBmYOZgFmCWYFZg1 mA2YLZgdmD2YA5gjmBOYM5gLmCuYG5g7mAeYJ5iXmHe7qa2MBjq1ldFAp7YyGujU VkYDndrKaKBTWxkNdGoro4FObWU00KmtjKa902zlJHQ6YLpgemD6YAZghmBGYMZg JmCmYGZg5mAWYJZgVmDWYDZgtmB2YPZgDmCOYE5gzmAuYK5gbmDuYB5gnmBeYt7t prYyGujUVkYDndrKaKBTWxkNdGoro4FObWU00KmtjAY6tZXRQKe2Mpr2TrOV09Dp gOmC6YHpgxmAGYIZgRmDmYCZgpmBmYNZgFmCWYFZg9mA2YLZgdmDOYA5gjmBOYO5 gLmCuYG5g3mAeYJ5iXm3m9rKaKBTWxkNdGoro4FObWU00KmtjAY6tZXRQKe2Mhro 1FZGA53aymjaO81WzkKnA6YLpgemD2YAZghmBGYMZgJmCmYGZg5mAWYJZgVmDWYD ZgtmB2YP5gDmCOYE5gzmAuYK5gbmDuYB5gnmJebdbmoro4FObWU00KmtjAY6tZXR QKe2Mhro1FZGA53aymigU1sZDXRqK6Np7zRbOQ+dDpgumB6YPpgBmCGYEZgxmAmY KZgZmDmYBZglmBWYNZgNmC2YHZg9mAOYI5gTmDOYC5grmBuYO5gHmCeYl5h3u6mt jAY6tZXRQKe2Mhro1FZGA53aymigU1sZDXRqK6OBTm1lNNCprYymvdNs5SJ0OmC6 YHpg+mAGYIZgRmDGYCZgpmBmYOZgFmCWYFZg1mA2YLZgdmD2YA5gjmBOYM5gLmCu YG5g7mAeYJ5gXmLe7aa2Mhro1FZGA53aymigU1sZDXRqK6OBTm1lNNCprYwGOrWV 0UCntjKa9k6zlcvQ6YDpgumB6YMZgBmCGYEZg5mAmYKZgZmDWYBZglmBWYPZgNmC 2YHZgzmAOYI5gTmDuYC5grmBuYN5gHmCeYl5t5vaymigU1sZDXRqK6OBTm1lNNCp rYwGOrWV0UCntjIa6NRWRgOd2spo2jvNVq5CpwOmC6YHpg9mAGYIZgRmDGYCZgpm BmYOZgFmCWYFZg1mA2YLZgdmD+YA5gjmBOYM5gLmCuYG5g7mAeYJ5iXm3W5qK6OB Tm1lNNCprYwGOrWV0UCntjIa6NRWRgOd2spooFNbGQ10aiujae80W7kOnQ6YLpge mD6YAZghmBGYMZgJmCmYGZg5mAWYJZgVmDWYDZgtmB2YPZgDmCOYE5gzmAuYK5gb mDuYB5gnmJeYd7uprYwGOrWV0UCntjIa6NRWRgOd2spooFNbGQ10aiujgU5tZTTQ qa2Mpr3TbOUmdDpgumB6YPpgBmCGYEZgxmAmYKZgZmDmYBZglmBWYNZgNmC2YHZg 9mAOYI5gTmDOYC5grmBuYO5gHmCeYF5i3u2mtjIa6NRWRgOd2spooFNbGQ10aiuj gU5tZTTQqa2MBjq1ldFAp7YymvZOs5Xb0OmA6YLpgemDGYAZghmBGYOZgJmCmYGZ g1mAWYJZgVmD2YDZgtmB2YM5gDmCOYE5g7mAuYK5gbmDeYB5gnmJebeb2spooFNb GQ10aiujgU5tZTTQqa2MBjq1ldFAp7YyGujUVkYDndrKaNo7zVbuQqcDpgumB6YP ZgBmCGYEZgxmAmYKZgZmDmYBZglmBWYNZgNmC2YHZg/mAOYI5gTmDOYC5grmBuYO 5gHmCeYl5t1uaiujgU5tZTTQqa2MBjq1ldFAp7YyGujUVkYDndrKaKBTWxkNdGor o2nvNFu5D50OmC6YHpg+mAGYIZgRmDGYCZgpmBmYOZgFmCWYFZg1mA2YLZgdmD2Y A5gjmBOYM5gLmCuYG5g7mAeYJ5iXmHe7qa2MBjq1ldFAp7YyGujUVkYDndrKaKBT WxkNdGoro4FObWU00KmtjKa902zlIXQ6YLpgemD6YAZghmBGYMZgJmCmYGZg5mAW YJZgVmDWYDZgtmB2YPZgDmCOYE5gzmAuYK5gbmDuYB5gnmBeYt7tprYyGujUVkYD ndrKaKBTWxkNdGoro4FObWU00KmtjAY6tZXRQKe2Mpr2TrOVx9DpgOmC6YHpgxmA GYIZgRmDmYCZgpmBmYNZgFmCWYFZg9mA2YLZgdmDOYA5gjmBOYO5gLmCuYG5g3mA eYJ5iXm3m9rKaKBTWxkNdGoro4FObWU00KmtjAY6tZXRQKe2Mhro1FZGA53aymja O81WnkKnA6YLpgemD2YAZghmBGYMZgJmCmYGZg5mAWYJZgVmDWYDZgtmB2YP5gDm COYE5gzmAuYK5gbmDuYB5gnmJebdbmoro4FObWU00KmtjAY6tZXRQKe2Mhro1FZG A53aymigU1sZDXRqK6Np7zRbeQ6dDpgumB6YPpgBmCGYEZgxmAmYKZgZmDmYBZgl mBWYNZgNmC2YHZg9mAOYI5gTmDOYC5grmBuYO5gHmCeYl5h3u6mtjAY6tZXRQKe2 Mhro1FZGA53aymigU1sZDXRqK6OBTm1lNNCprYymvdNs5SV0OmC6YHpg+mAGYIZg RmDGYCZgpmBmYOZgFmCWYFZg1mA2YLZgdmD2YA5gjmBOYM5gLmCuYG5g7mAeYJ5g XmLe7aa2Mhro1FZGA53aymigU1sZDXRqK6OBTm1lNNCprYwGOrWV0UCntjKa9k6z ldfQ6YDpgumB6YMZgBmCGYEZg5mAmYKZgZmDWYBZglmBWYPZgNmC2YHZgzmAOYI5 gTmDuYC5grmBuYN5gHmCeYl5t5vaymigU1sZDXRqK6OBTm1lNNCprYwGOrWV0UCn tjIa6NRWRgOd2spo2jvNVt5CpwOmC6YHpg9mAGYIZgRmDGYCZgpmBmYOZgFmCWYF Zg1mA2YLZgdmD+YA5gjmBOYM5gLmCuYG5g7mAeYJ5iXm3W5qK6OBTm1lNNCprYwG OrWV0UCntjIa6NRWRgOd2spooFNbGQ10aiujae80W3kPnQ6YLpgemD6YAZghmBGY MZgJmCmYGZg5mAWYJZgVmDWYDZgtmB2YPZgDmCOYE5gzmAuYK5gbmDuYB5gnmJeY d7uprYwGOrWV0UCntjIa6NRWRgOd2spooFNbGQ10aiujgU5tZTTQqa2Mpr3TbOUj dDpgumB6YPpgBmCGYEZgxmAmYKZgZmDmYBZglmBWYNZgNmC2YHZg9mAOYI5gTmDO YC5grmBuYO5gHmCeYF5i3u2mtjIa6NRWRgOd2spooFNbGQ10aiujgU5tZTTQqa2M Bjq1ldFAp7YymvZOs5XP0OmA6YLpgemDGYAZghmBGYOZgJmCmYGZg1mAWYJZgVmD 2YDZgtmB2YM5gDmCOYE5g7mAuYK5gbmDeYB5gnmJebeb2spooFNbGQ10aiujgU5t ZTTQqa2MBjq1ldFAp7YyGujUVkYDndrKaNo7zVa+QqcDpgumB6YPZgBmCGYEZgxm AmYKZgZmDmYBZglmBWYNZgNmC2YHZg/mAOYI5gTmDOYC5grmBuYO5gHmCeYl5t1u aiujgU5tZTTQqa2MBjq1ldFAp7YyGujUVkYDndrKaKBTWxkNdGoro2nvfNjK9+c7 HTBdMD0wfTADMEMwIzBjMBMwUzAzMHMwCzBLMCswazAbMFswOzB7MAcwRzAnMGcw FzBXMDcwdzAPME8wLzHvdtNsZTLQabYyGeg0W5kMdJqtTAY6zVYmA51mK5OBTrOV yUCn2cpkoNNsZTLtnWYrv/iYfGIrk+mC6YHpgxmAGYIZgRmDmYCZgpmBmYNZgFmC WYFZg9mA2YLZgdmDOYA5gjmBOYO5gLmCuYG5g3mAeYJ5iXm3my+gU1uZTG1lNNCp rYwGOrWV0UCntjIa6NRWRgOd2spooFNbGQ10aiujae982Mr35zsdMF0wPTB9MAMw QzAjMGMwEzBTMDMwczALMEswKzBrMBswWzA7MHswBzBHMCcwZzAXMFcwNzB3MA8w TzAvMe9202xlMtBptjIZ6DRbmQx0mq1MBjrNViYDnWYrk4FOs5XJQKfZymSg02xl Mu2dZiu//Jh8YiuT6YLpgemDGYAZghmBGYOZgJmCmYGZg1mAWYJZgVmD2YDZgtmB 2YM5gDmCOYE5g7mAuYK5gbmDeYB5gnmJebeb2spooFNbGQ10aiujgU5tZTTQqa2M Bjq1ldFAp7YyGujUVkYDndrKaNo7H7by/flOB0wXTA9MH8wAzBDMCMwYzATMFMwM zBzMAswSzArMGswGzBbMDswezAHMEcwJzBnMBcwVzA3MHcwDzBPMS8y73TRbmQx0 mq1MBjrNViYDnWYrk4FOs5XJQKfZymSg02xlMtBptjIZ6DRbmUx7p9nKrz4mn9jK ZLpgemD6YAZghmBGYMZgJmCmYGZg5mAWYJZgVmDWYDZgtmB2YPZgDmCOYE5gzmAu YK5gbmDuYB5gnmBeYt7tprYyGujUVkYDndrKaKBTWxkNdGoro4FObWU00KmtjAY6 tZXRQKe2Mpr2zoetfH++0wHTBdMD0wczADMEMwIzBjMBMwUzAzMHswCzBLMCswaz AbMFswOzB3MAcwRzAnMGcwFzBXMDcwfzAPME8xLzbjfNViYDnWYrk4FOs5XJQKfZ ymSg02xlMtBptjIZ6DRbmQx0mq1MBjrNVibT3mm28uuPySe2MpkumB6YPpgBmCGY EZgxmAmYKZgZmDmYBZglmBWYNZgNmC2YHZg9mAOYI5gTmDOYC5grmBuYO5gHmCeY l5h3u6mtjAY6tZXRQKe2Mhro1FZGA53aymigU1sZDXRqK6OBTm1lNNCprYymvfNh K9+f73TAdMH0wPTBDMAMwYzAjMFMwEzBzMDMwSzALMGswKzBbMBswezA7MEcwBzB nMCcwVzAXMHcwNzBPMA8wbzEvNtNs5XJQKfZymSg02xlMtBptjIZ6DRbmQx0mq1M BjrNViYDnWYrk4FOs5XJtHearfzmY/KJrUymC6YHpg9mAGYIZgRmDGYCZgpmBmYO ZgFmCWYFZg1mA2YLZgdmD+YA5gjmBOYM5gLmCuYG5g7mAeYJ5iXm3W5qK6OBTm1l NNCprYwGOrWV0UCntjIa6NRWRgOd2spooFNbGQ10aiujae982Mr35zsdMF0wPTB9 MAMwQzAjMGMwEzBTMDMwczALMEswKzBrMBswWzA7MHswBzBHMCcwZzAXMFcwNzB3 MA8wTzAvMe928wV0mq0MptnKZKDTbGUy0Gm2MhnoNFuZDHSarUwGOs1WJgOdZiuT gU6zlcm0d5qt/PZj8omtTKYLpgemD2YAZghmBGYMZgJmCmYGZg5mAWYJZgVmDWYD ZgtmB2YP5gDmCOYE5gzmAuYK5gbmDuYB5gnmJebdbmoro4FObWU00KmtjAY6tZXR QKe2Mhro1FZGA53aymigU1sZDXRqK6Np73zYyvfnOx0wXTA9MH0wAzBDMCMwYzAT MFMwMzBzMAswSzArMGswGzBbMDswezAHMEcwJzBnMBcwVzA3MHcwDzBPMC8x73bT bGUy0Gm2MhnoNFuZDHSarUwGOs1WJgOdZiuTgU6zlclAp9nKZKDTbGUy7Z1mK7/7 mHxiK5PpgumB6YMZgBmCGYEZg5mAmYKZgZmDWYBZglmBWYPZgNmC2YHZgzmAOYI5 gTmDuYC5grmBuYN5gHmCeYl5t5vaymigU1sZDXRqK6OBTm1lNNCprYwGOrWV0UCn tjIa6NRWRgOd2spo2jsftvL9+U4HTBdMD0wfzADMEMwIzBjMBMwUzAzMHMwCzBLM CswazAbMFswOzB7MAcwRzAnMGcwFzBXMDcwdzAPME8xLzLvdNFuZDHSarUwGOs1W JgOdZiuTgU6zlclAp9nKZKDTbGUy0Gm2MhnoNFuZTHun2crvPyaf2MpkumB6YPpg BmCGYEZgxmAmYKZgZmDmYBZglmBWYNZgNmC2YHZg9mAOYI5gTmDOYC5grmBuYO5g HmCeYF5i3u2mtjIa6NRWRgOd2spooFNbGQ10aiujgU5tZTTQqa2MBjq1ldFAp7Yy mvbOh618f77TAdMF0wPTBzMAMwQzAjMGMwEzBTMDMwezALMEswKzBrMBswWzA7MH cwBzBHMCcwZzAXMFcwNzB/MA8wTzEvNuN81WJgOdZiuTgU6zlclAp9nKZKDTbGUy 0Gm2MhnoNFuZDHSarUwGOs1WJtPeabbyh4/JJ7YymS6YHpg+mAGYIZgRmDGYCZgp mBmYOZgFmCWYFZg1mA2YLZgdmD2YA5gjmBOYM5gLmCuYG5g7mAeYJ5iXmHe7qa2M Bjq1ldFAp7YyGujUVkYDndrKaKBTWxkNdGoro4FObWU00KmtjKa982Er35/vdMB0 wfTA9MEMwAzBjMCMwUzATMHMwMzBLMAswazArMFswGzB7MDswRzAHMGcwJzBXMBc wdzA3ME8wDzBvMS8202zlclAp9nKZKDTbGUy0Gm2MhnoNFuZDHSarUwGOs1WJgOd ZiuTgU6zlcm0d/4bmFsPoVZuAQAAAW5W `turtle world` H4sIAAAAAAAAAEWOTU7DMBCFX2n+gFJ1wZIFC1ZIZgEcgENwgLrJNLbkeCLb6c8p ODJMkqqMZPm9T+95jPU2DSE5eo5JJ9p+4To/KBz5NhnR38h3gagR+YKyd5x68mLe kNfsOIh8QnauJ7XC/fTYtf2JSuINH30v7h15NLonka/ITnMnw/JoeNpbRHNJfqA0 pBvrWzGPciqs49DqoAy7EcepsJlZR0nv2NnYCVtgdbDRsleODuSE3ODhQnQ92HQW tMRdp08qstrr+RO3plG8V0LF5qjCvyuwGDPluPFXZrz/AA+4RXQ+AQAAAAABPg==