├── .gitignore ├── README.txt ├── info.rkt └── scratchy ├── duck.png ├── examples ├── costume.rkt ├── fish-text.rkt ├── fish.rkt ├── just-fish.rkt ├── other.rkt └── splash.rkt ├── images.rkt ├── info.rkt ├── main.rkt ├── parser.rkt ├── reader.rkt ├── runtime.rkt ├── scratchy.rkt └── scratchy.scrbl /.gitignore: -------------------------------------------------------------------------------- 1 | compiled/ 2 | doc/ 3 | *~ 4 | -------------------------------------------------------------------------------- /README.txt: -------------------------------------------------------------------------------- 1 | Tutorial mode 2 | ------------- 3 | 4 | If you're interested in the tutorial version of this repository, see 5 | the "tutorial2" (POPL'13) or "tutorial" (RacketCon'12) branch in the 6 | git repository. 7 | 8 | Normal mode 9 | ----------- 10 | 11 | If you're using Racket v5.3.1.9 or later, use 12 | 13 | raco pkg install scratchy 14 | 15 | to download and install the "scratchy" package and collection. 16 | 17 | 18 | For earlier versions, install this directory as a Racket collection 19 | "scratchy", perhaps by running 20 | 21 | raco link scratchy 22 | raco setup scratchy scribblings/main 23 | 24 | in the directory directory containing this "README.txt" (as opposed to 25 | the parent directory of this one). 26 | -------------------------------------------------------------------------------- /info.rkt: -------------------------------------------------------------------------------- 1 | #lang setup/infotab 2 | 3 | (define collection 'multi) 4 | 5 | (define deps '("algol60" 6 | "base" 7 | "draw-lib" 8 | "gui-lib" 9 | "parser-tools-lib" 10 | "slideshow-lib")) 11 | (define build-deps '("racket-doc" 12 | "scribble-lib")) 13 | -------------------------------------------------------------------------------- /scratchy/duck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mflatt/scratchy/aef8883759fc962828bf977811697fccf06ef8b0/scratchy/duck.png -------------------------------------------------------------------------------- /scratchy/examples/costume.rkt: -------------------------------------------------------------------------------- 1 | #lang scratchy 2 | 3 | ---------------------------------------- 4 | animal 5 | 6 | image is @duck-image 7 | 8 | on d key 9 | change image to @duck-image 10 | 11 | on f key 12 | change image to @fish-image 13 | 14 | on h key 15 | hide 16 | 17 | on s key 18 | show 19 | 20 | on right key 21 | move x by 10 22 | 23 | on left key 24 | move x by -10 25 | 26 | 27 | ---------------------------------------- 28 | aq 29 | 30 | image is @aq-image 31 | 32 | do forever { 33 | if touches animal { 34 | say "touching" 35 | while touches animal { } 36 | hush 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /scratchy/examples/fish-text.rkt: -------------------------------------------------------------------------------- 1 | #lang scratchy 2 | 3 | use splash 4 | 5 | ---------------------------------------- 6 | duck 7 | 8 | image is @duck-image 9 | 10 | y is 100 11 | 12 | on up key 13 | move y by 10 14 | turn to 0 15 | 16 | on down key 17 | move y by -10 18 | turn to 180 19 | 20 | on right key 21 | move x by 10 22 | turn to 90 23 | 24 | on left key 25 | move x by -10 26 | turn to 270 27 | 28 | on space key 29 | turn by 10 30 | 31 | on + key 32 | change size by 0.1 33 | 34 | on - key 35 | change size by -0.1 36 | 37 | on "hit" message 38 | say "yum!" 39 | 40 | on "gone" message 41 | hush 42 | 43 | on x key 44 | move to splash 45 | watch splash 46 | 47 | ------------------------------------- 48 | fish 49 | 50 | image is @fish-image 51 | 52 | variable score is 0 53 | 54 | do 55 | forever { 56 | wait 0.02 57 | forward by 2 58 | turn by (random 5) - 2 59 | 60 | if touches aq { 61 | score = 1 + score 62 | say score 63 | } 64 | 65 | if touches duck { 66 | hush 67 | send "hit" to everyone 68 | turn by 100 69 | while touches duck { 70 | } 71 | send "gone" to duck 72 | } 73 | } 74 | 75 | do 76 | forever { 77 | wait 0.1 78 | change size by 0.05 79 | wait 0.1 80 | change size by -0.05 81 | } 82 | 83 | ---------------------------------------- 84 | aq 85 | 86 | image is @aq-image 87 | -------------------------------------------------------------------------------- /scratchy/examples/fish.rkt: -------------------------------------------------------------------------------- 1 | #reader(lib"read.ss""wxme")WXME0108 ## 2 | #| 3 | This file uses the GRacket editor format. 4 | Open this file in DrRacket version 5.3.1.2 or later to read it. 5 | 6 | Most likely, it was created by saving a program in DrRacket, 7 | and it probably contains a program with non-text elements 8 | (such as images or comment boxes). 9 | 10 | http://racket-lang.org/ 11 | |# 12 | 29 7 #"wxtext\0" 13 | 3 1 6 #"wxtab\0" 14 | 1 1 8 #"wximage\0" 15 | 2 0 8 #"wxmedia\0" 16 | 4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0" 17 | 1 0 16 #"drscheme:number\0" 18 | 3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0" 19 | 1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0" 20 | 1 0 93 21 | ( 22 | #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni" 23 | #"pclass-wxme.ss\" \"framework\"))\0" 24 | ) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0" 25 | 0 0 19 #"drscheme:sexp-snip\0" 26 | 0 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0" 27 | 1 0 68 28 | ( 29 | #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr" 30 | #"lib\"))\0" 31 | ) 1 0 29 #"drscheme:bindings-snipclass%\0" 32 | 1 0 88 33 | ( 34 | #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r" 35 | #"kt\" \"drracket\" \"private\"))\0" 36 | ) 0 0 33 #"(lib \"bullet-snip.ss\" \"browser\")\0" 37 | 0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0" 38 | 1 0 22 #"drscheme:lambda-snip%\0" 39 | 1 0 57 40 | #"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0" 41 | 1 0 26 #"drscheme:pict-value-snip%\0" 42 | 0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0" 43 | 1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0" 44 | 2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0" 45 | 1 0 18 #"drscheme:xml-snip\0" 46 | 1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0" 47 | 1 0 21 #"drscheme:scheme-snip\0" 48 | 2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0" 49 | 1 0 10 #"text-box%\0" 50 | 1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0" 51 | 1 0 1 6 #"wxloc\0" 52 | 0 0 97 0 1 #"\0" 53 | 0 75 1 #"\0" 54 | 0 12 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9 55 | #"Standard\0" 56 | 0 75 7 #"Monaco\0" 57 | 0 11 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1 58 | #"\0" 59 | 0 -1 1 #"\0" 60 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24 61 | #"framework:default-color\0" 62 | 0 -1 1 #"\0" 63 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 64 | #"\0" 65 | 0 -1 1 #"\0" 66 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15 67 | #"text:ports out\0" 68 | 0 -1 1 #"\0" 69 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 1 70 | #"\0" 71 | 0 -1 1 #"\0" 72 | 1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 73 | -1 2 15 #"text:ports err\0" 74 | 0 -1 1 #"\0" 75 | 1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 76 | -1 2 1 #"\0" 77 | 0 -1 1 #"\0" 78 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17 79 | #"text:ports value\0" 80 | 0 -1 1 #"\0" 81 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 1 82 | #"\0" 83 | 0 -1 1 #"\0" 84 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 85 | -1 2 27 #"Matching Parenthesis Style\0" 86 | 0 -1 1 #"\0" 87 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 88 | -1 2 1 #"\0" 89 | 0 -1 1 #"\0" 90 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37 91 | #"framework:syntax-color:scheme:symbol\0" 92 | 0 -1 1 #"\0" 93 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 38 94 | #"framework:syntax-color:scheme:keyword\0" 95 | 0 -1 1 #"\0" 96 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 1 97 | #"\0" 98 | 0 -1 1 #"\0" 99 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 100 | 38 #"framework:syntax-color:scheme:comment\0" 101 | 0 -1 1 #"\0" 102 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 1 103 | #"\0" 104 | 0 -1 1 #"\0" 105 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37 106 | #"framework:syntax-color:scheme:string\0" 107 | 0 -1 1 #"\0" 108 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 39 109 | #"framework:syntax-color:scheme:constant\0" 110 | 0 -1 1 #"\0" 111 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 1 112 | #"\0" 113 | 0 -1 1 #"\0" 114 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 42 115 | #"framework:syntax-color:scheme:parenthesis\0" 116 | 0 -1 1 #"\0" 117 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 1 118 | #"\0" 119 | 0 -1 1 #"\0" 120 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 121 | #"framework:syntax-color:scheme:error\0" 122 | 0 -1 1 #"\0" 123 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 124 | #"\0" 125 | 0 -1 1 #"\0" 126 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36 127 | #"framework:syntax-color:scheme:other\0" 128 | 0 -1 1 #"\0" 129 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 16 130 | #"Misspelled Text\0" 131 | 0 -1 1 #"\0" 132 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 133 | #"\0" 134 | 0 -1 1 #"\0" 135 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 136 | 38 #"drracket:check-syntax:lexically-bound\0" 137 | 0 -1 1 #"\0" 138 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 1 139 | #"\0" 140 | 0 -1 1 #"\0" 141 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28 142 | #"drracket:check-syntax:set!d\0" 143 | 0 -1 1 #"\0" 144 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 37 145 | #"drracket:check-syntax:unused-require\0" 146 | 0 -1 1 #"\0" 147 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 148 | #"drracket:check-syntax:free-variable\0" 149 | 0 -1 1 #"\0" 150 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 151 | #"\0" 152 | 0 -1 1 #"\0" 153 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31 154 | #"drracket:check-syntax:imported\0" 155 | 0 -1 1 #"\0" 156 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 47 157 | #"drracket:check-syntax:my-obligation-style-pref\0" 158 | 0 -1 1 #"\0" 159 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 1 160 | #"\0" 161 | 0 -1 1 #"\0" 162 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50 163 | #"drracket:check-syntax:their-obligation-style-pref\0" 164 | 0 -1 1 #"\0" 165 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 48 166 | #"drracket:check-syntax:unk-obligation-style-pref\0" 167 | 0 -1 1 #"\0" 168 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 169 | #"\0" 170 | 0 -1 1 #"\0" 171 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 172 | 49 #"drracket:check-syntax:both-obligation-style-pref\0" 173 | 0 -1 1 #"\0" 174 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 175 | 26 #"plt:htdp:test-coverage-on\0" 176 | 0 -1 1 #"\0" 177 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 178 | #"\0" 179 | 0 -1 1 #"\0" 180 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 27 181 | #"plt:htdp:test-coverage-off\0" 182 | 0 -1 1 #"\0" 183 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 4 1 184 | #"\0" 185 | 0 70 1 #"\0" 186 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 187 | -1 -1 4 4 #"XML\0" 188 | 0 70 1 #"\0" 189 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 190 | -1 -1 2 1 #"\0" 191 | 0 -1 1 #"\0" 192 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 139 34 0 0 0 -1 -1 2 37 193 | #"plt:module-language:test-coverage-on\0" 194 | 0 -1 1 #"\0" 195 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 139 34 0 0 0 -1 -1 2 1 196 | #"\0" 197 | 0 -1 1 #"\0" 198 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 176 48 96 0 0 0 -1 -1 2 38 199 | #"plt:module-language:test-coverage-off\0" 200 | 0 -1 1 #"\0" 201 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 176 48 96 0 0 0 -1 -1 0 1 202 | #"\0" 203 | 0 75 7 #"Monaco\0" 204 | 0.0 11 90 -1 90 -1 3 -1 0 1 0 1 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 205 | 255 255 1 -1 0 1 #"\0" 206 | 0 75 7 #"Monaco\0" 207 | 0.0 18 90 -1 90 -1 3 -1 0 1 0 1 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 208 | 255 255 1 -1 4 1 #"\0" 209 | 0 71 1 #"\0" 210 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 211 | -1 -1 4 1 #"\0" 212 | 0 -1 1 #"\0" 213 | 1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 255 0 0 214 | 0 -1 -1 4 1 #"\0" 215 | 0 71 1 #"\0" 216 | 1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 255 0 0 217 | 0 -1 -1 4 1 #"\0" 218 | 0 71 1 #"\0" 219 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 100 0 0 0 220 | 0 -1 -1 4 1 #"\0" 221 | 0 -1 1 #"\0" 222 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 223 | 255 0 -1 -1 2 1 #"\0" 224 | 0 -1 1 #"\0" 225 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 200 0 0 0 0 226 | 0 -1 -1 22 1 #"\0" 227 | 0 -1 1 #"\0" 228 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 229 | 255 0 -1 -1 14 1 #"\0" 230 | 0 -1 1 #"\0" 231 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 232 | 255 0 -1 -1 4 32 #"widget.rkt::browser-text% basic\0" 233 | 0 70 1 #"\0" 234 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 235 | -1 -1 4 59 236 | #"macro-debugger/syntax-browser/properties color-text% basic\0" 237 | 0 70 1 #"\0" 238 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 239 | -1 -1 62 1 #"\0" 240 | 0 -1 1 #"\0" 241 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 190 190 190 242 | 0 0 0 -1 -1 4 1 #"\0" 243 | 0 -1 1 #"\0" 244 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 0 0 0 0 245 | -1 -1 4 1 #"\0" 246 | 0 -1 1 #"\0" 247 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 255 0 0 0 0 248 | 0 -1 -1 4 1 #"\0" 249 | 0 -1 1 #"\0" 250 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 255 0 0 251 | 0 -1 -1 4 1 #"\0" 252 | 0 -1 1 #"\0" 253 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 107 142 35 0 254 | 0 0 -1 -1 4 1 #"\0" 255 | 0 -1 1 #"\0" 256 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 100 0 0 0 257 | 0 -1 -1 4 1 #"\0" 258 | 0 -1 1 #"\0" 259 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 139 0 0 0 0 260 | 0 -1 -1 4 1 #"\0" 261 | 0 -1 1 #"\0" 262 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 100 149 237 263 | 0 0 0 -1 -1 4 1 #"\0" 264 | 0 -1 1 #"\0" 265 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 65 105 225 0 266 | 0 0 -1 -1 4 1 #"\0" 267 | 0 -1 1 #"\0" 268 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 70 130 180 0 269 | 0 0 -1 -1 4 1 #"\0" 270 | 0 -1 1 #"\0" 271 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 47 79 79 0 0 272 | 0 -1 -1 4 1 #"\0" 273 | 0 -1 1 #"\0" 274 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 139 0 0 275 | 0 -1 -1 4 1 #"\0" 276 | 0 -1 1 #"\0" 277 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 75 0 130 0 0 278 | 0 -1 -1 4 1 #"\0" 279 | 0 -1 1 #"\0" 280 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 160 32 240 0 281 | 0 0 -1 -1 4 1 #"\0" 282 | 0 -1 1 #"\0" 283 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 255 165 0 0 284 | 0 0 -1 -1 4 1 #"\0" 285 | 0 -1 1 #"\0" 286 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 250 128 114 287 | 0 0 0 -1 -1 4 1 #"\0" 288 | 0 -1 1 #"\0" 289 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 184 134 11 0 290 | 0 0 -1 -1 4 1 #"\0" 291 | 0 -1 1 #"\0" 292 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 128 128 0 0 293 | 0 0 -1 -1 4 1 #"\0" 294 | 0 -1 1 #"\0" 295 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 169 169 169 296 | 0 0 0 -1 -1 4 1 #"\0" 297 | 0 -1 1 #"\0" 298 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 299 | 228 225 -1 -1 4 1 #"\0" 300 | 0 -1 1 #"\0" 301 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 224 302 | 255 255 -1 -1 4 1 #"\0" 303 | 0 -1 1 #"\0" 304 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 255 0 0 224 305 | 255 255 -1 -1 61 1 #"\0" 306 | 0 -1 1 #"\0" 307 | 1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 255 0 0 0 0 308 | 0 -1 -1 4 1 #"\0" 309 | 0 -1 1 #"\0" 310 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 255 255 311 | 228 225 -1 -1 4 1 #"\0" 312 | 0 -1 1 #"\0" 313 | 1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 0 0 0 0 314 | -1 -1 4 1 #"\0" 315 | 0 -1 1 #"\0" 316 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 75 0 130 255 317 | 228 225 -1 -1 4 1 #"\0" 318 | 0 -1 1 #"\0" 319 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 160 32 240 320 | 255 228 225 -1 -1 4 1 #"\0" 321 | 0 -1 1 #"\0" 322 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 255 165 0 323 | 255 228 225 -1 -1 4 1 #"\0" 324 | 0 -1 1 #"\0" 325 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 70 130 180 326 | 255 228 225 -1 -1 4 1 #"\0" 327 | 0 -1 1 #"\0" 328 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 47 79 79 255 329 | 228 225 -1 -1 4 1 #"\0" 330 | 0 -1 1 #"\0" 331 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 70 130 180 332 | 224 255 255 -1 -1 4 1 #"\0" 333 | 0 -1 1 #"\0" 334 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 47 79 79 224 335 | 255 255 -1 -1 0 1 #"\0" 336 | 0 -1 1 #"\0" 337 | 0.0 13 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 338 | -1 -1 2 1 #"\0" 339 | 0 -1 1 #"\0" 340 | 0.0 13 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 341 | -1 -1 0 328 0 26 3 14 #"#lang scratchy" 342 | 0 0 22 29 1 #"\n" 343 | 0 0 22 29 1 #"\n" 344 | 0 0 22 3 40 #"----------------------------------------" 345 | 0 0 22 29 1 #"\n" 346 | 0 0 14 3 4 #"duck" 347 | 0 0 22 29 1 #"\n" 348 | 0 0 22 29 1 #"\n" 349 | 0 0 26 3 5 #"image" 350 | 0 0 22 3 1 #" " 351 | 0 0 26 3 2 #"is" 352 | 0 0 22 3 1 #" " 353 | 0 2 81 26 1 #"\0" 354 | 2 -1.0 -1.0 0.0 0.0 0 35 500 355 | ( 356 | #"\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\0\261\0\0\0v\b" 357 | #"\6\0\0\0\207\304r\311\0\0 \0IDATx\234\354\275y\260]\325\225" 358 | #"\346\371\333\303\31\356}\223\236&$4 \204\0\t\4\2$\f\6\e\260\23\203" 359 | #"g\273]\3069GgDe\322TVEUdDEdWwTtTDw" 360 | #"VgFwUfuF\26iW\16\256\301\231$\236\235\3066\306\306\306\6\214" 361 | #"\31\314,\3\2\t4\277Qo\270\3039{\357\265\373\217}\336\223\30\f\b\211" 362 | #")\223\25\361\364\364\336\275\357\236}\366" 363 | #"\371\316\332\337^\353[\353\250\30#\357" 364 | #"\330?,\233\251f6\336|\337\27v" 365 | #"\358\274\227\345v\5\277\373\361\337\323" 366 | #"o\366\230^O\263o\366\0\336\261\223" 367 | #"k\337\337s\253\334\365\320\235\34\261\343" 368 | #"\324U\315\352\301\325o\366\220^w{" 369 | #"\a\304\377@l2\214\337\373\225\37\177" 370 | #"q\373\356C\273\t\4\304@\253\325&" 371 | #"\210\177\263\207\366\272\333; \376\a`" 372 | #"\317L>)_\372\376\227\230\tS\364" 373 | #"b\37\233\0314\206\330S\254\335x\332" 374 | #"\233=\274\327\335\336\1\361\333\334\16w" 375 | #"\17\311\327\357\370\32G\302$\265\255\0" 376 | #"\217W\1\205&\327%#\355\3217{" 377 | #"\210\257\273\375\203&\374og\273\343\341" 378 | #"\273\344\225\3363\303\314\306{\367\334\315" 379 | #"\241\371\375\314\205Y\252\330\307\343\20\2" 380 | #"(!\204\300hk\351\e1\3347\325" 381 | #"\336\1\361[\320\306\303\324\275w\356\271" 382 | #"\233\37=\366\343\227\5\262\210\377\235G" 383 | #"v?L(=*\213\330\334\240\264B\21\211>\320j[Z\345\340\e5\3547" 384 | #"\315\336\1\361[\320V\230\245\27g\261" 385 | #"\342\373\367\337\312\375{\357\227\31f6" 386 | #"\276\324\373:\363\363\277\337\351\316C4" 387 | #"X\225A\r\271\312\311tN\2463\252P\261|\331\362M" 388 | #"o\364\370\337h{\a\304oA\233\255\17J\177~\206\256\231" 389 | ) 500 390 | ( 391 | #"\341\233\367|\215\231\376\314\256\227z\337" 392 | #"\344\324\4\312e\344Rb\353\2U[" 393 | #"\224\323\204n@\365\f\203\262\224\332\313" 394 | #"\357\274\321\343\177\243\355\235\215\335[\320" 395 | #"$\323\204\\#Z1\347\347\370\316=" 396 | #"\267\360;W\336\360\242\367\35\236\30\303" 397 | #"\372\f]\264X\266|\224\345K\226\261rp%\243\355%T\225`\313\234~\267" 398 | #"\373\373\f\217\376\2337\3414\3360{\a\304oA\253EMg\203\243\243\325L" 399 | #"\207\241\274\315\241\203\a\371\376C\267\311" 400 | #"\373\267]\375\274\225s\323\331g\261z" 401 | #"\335j\2620D\21rL\320\304\350q" 402 | #"\276\246\335\2\223[Z\246\270\371\315:" 403 | #"\2177\312\336\241\23oAS\24\317\314M\364\30a\4=+\254Z\272\222^\247" 404 | #"\373\242\367\265]N\253n\221\367Kb" 405 | #"\245\211>\200\244$\207\21E\26\r\313" 406 | #"\a\226\377\362\2539\346x\230\270\351\271\376\36y`\357}rhv\337+FF" 407 | #"\336J\366\216'~\v\332\n3r\361\231\3137\312)KG\330\266\351l\346c" 408 | #"E!-\16\35:(\253V\255^t<\3221X\227\203\22\242\1A\0\241v" 409 | #"\216\30!\276L\262\356\331\251ge\2543\316\323\373\236f|n\f\37<\3633" 410 | #"GX>\270\202_\373\300o\276\2556\203\257\b\342\347\306\367\311L=\305yk" 411 | #"\316?n\257\375\3143\317\310\306\215\e" 412 | #"\337\361\366/a\207\372\207\345\340\364~" 413 | #"\212\1\313\352r\325\364h\276r\331\261\257_\272e\ayTd\235\234<@\214" 414 | #"\no\301\201\351\375\354" 417 | #"\237\330\207nG\34}\212X\260e\313fF\212\221g\336\240i8)\246^\215" 418 | #"\212\355\306o\376\205\270\330\345]\347]\304\3065\e" 419 | #"YaW\277*`\376\267[\376Z\262\322\362+\357\377" 420 | ) 500 421 | ( 422 | #"\215w\200|\214\355\236\331#7\335\362" 423 | #"\5\272z\16\325\6S\265\371\310\25\37" 424 | #"c\373\312\v4\300\344\314\370\275\263Gf\266k\17**<\202h *\206\6" 425 | #"F8e\325\n\rp\340\360a\351\323" 426 | #"\247\27:\210\252\231\232\231\244\256\34y" 427 | #"\23134\260\204\365+\327\337\274\260\345\332w\200\fL\324\0237}\377\256\357S\eG_\367\251" 433 | #"\272\35\206J\3037\277u\v\235\0353" 434 | #"r\305\271W\352h\3253J\233\355\272" 435 | #"\320T\256\17\271\302E\aZ1\253\247\250f\372\262~d\235>({\271\347\201" 436 | #"\237ppz/J\v\336\5\"\202\326\5\4\303?\371\340u\327u\312\371\353N" 437 | #"[\262AOv'\256\313\244D\202\242" 438 | #"\35\aQ\225&f\216\263\327\234\303\300" 439 | #"\310\0\267\337\375=.~\367\273y\273" 440 | #"\1\30^\245'\6\370\243\233\377@f\343\24\252\264\370*\262\266}\n\333/x" 441 | #"\27g\257:\367\206Q3\372\331\27\276\3779wP\376\352k\377\231#\375)\226" 442 | #"\24#|\352\275\277\302y\253\316{\a\310\300\1wP\376\376\307_\341\251gw" 443 | #"R\264K\352^\340S\227}\206\345#" 444 | #"+\250\2735\347l\330\242\307\347\306\357" 445 | #"=0y`\373\203O<\300\276\311\275" 446 | #"\324\241\217\311\240\323\355p\312\352S\331" 447 | #"\261m;?\374\311\17\350K\227\256\357" 448 | #"\240\255\6\211T\256\242\314\206\301\31~" 449 | #"\365\243\277\306\17~p;N\272l9\367l\266.\335\201\314\201r\212\241" 450 | #"b\210^\335#\24\16=\b\217<\365\b\227o\277\342\232ev\331mo" 451 | ) 500 452 | ( 453 | #"\366\374\34\257\275j\20?|\360>\271\371\216\277\245gjzR1h\6!h" 454 | #"6\254\330\304U\333\256`\313\322-\317" 455 | #"\3\350\375\373\36\220\277\271\353\v\304\254" 456 | #"\207\257\3\247\24\353\270\376#\377\354\346" 457 | #"\345\331\322\267\335\235\376z\330\276\316." 458 | #"\371\362\255_\245Su\271\342\362\2538" 459 | #"\245XC\313\266\220\30\310Z\31w\334" 460 | #"\177;\17\355z\20\332\221\276\351\200\n" 461 | #"\20\3J\e\242\323\20\25\240\261V!&\20b P\241uN\254\25#\355%" 462 | #"l>s3\17\373\30\207\347" 471 | #"\17\21[\2027\16\321!a68t" 472 | #"\314\320\222\243B\206\325\206\252\256(\332" 473 | #"\31\375\272GVdx\347\261&\a\21\362,G\241\350v:\224\255\26\326\el" 474 | #"?g\333\346\v\331z\306yH\ar]b\225e\355\232\265o\333\353r\\\3" 475 | #"\377\370\225\237di\261\24\3554A<" 476 | #"\342\273\350\3341\25&\371\361\317\177\314" 477 | #"\177\277\373\177\310\301*\305\30]\254\300" 478 | #"+\0D\t\301\324<7\261\213\357>x\353\333*\6\371z\332\216-\227\351\245" 479 | #"\305r\\\247&+-_\277\343K\374\370\321\3573\351\16!\3\36o\34QE" 480 | #"\264dXW\2203\204\211-\360\226\314" 481 | #"ZB\f\330\302\20$\220\331\234\30\0241j\24 1RU\25\225\253(Z%" 482 | #"\275~\17g<\375\262\317\275O\335\303\17\37\370!\276" 483 | #"\360\350\202\2675\200\3418A\274vt\203\276\340\314\v(" 484 | ) 500 485 | ( 486 | #"\244 S-\254\321(\25\240\bTe\217\a\366\334\317W~\370%v\35yB" 487 | #"\306\272c\344&\307\204\f\0235\242+" 488 | #"\352\254\317}\217\377\204\375\363\317\275\3" 489 | #"\344\306N_\267Ac\24?\272\357G\214\327\207q\355>uV\343\243GE\203" 490 | #"\366%\266n\223\3736\252.P\21\264\5\37k0\2\352\350J\252\0\25551" 491 | #"F\224R\240\25E^P\325\25:\263" 492 | #"\3241\320\213}\352\314\361\324\241'\370" 493 | #"\336\217o\205\27G\341\336vv\334w" 494 | #"\340{.\272\342\206\325\203kP\265\2" 495 | #"2\224\bQ\2\242\0341s\354?\262" 496 | #"\233\277\271\375\277\242WF\272\364\321!" 497 | #"\303\210EECP\236\t5\306\337\337\373\315\327\341T\336\23661;q\323\243" 498 | #"\317=\304c\207\36\202A\205X\203\27\205\222\f\e\v\264\30P\1o*\242\251" 499 | #"\23RUL\337_\302\214:\372\202R\212~]\241\255%\252H\244I\212\230\200" 500 | #"\323\216\251z\212\3033\a\337\230\23}" 501 | #"\35\355\270A<\304\350g\337{\321\345\f\347#(]\202\330fN\5\264\247\357" 502 | #"\347\351\311\f\267\377\3446\274\255\210Z" 503 | #"Pb1!C\21!\27\366O\355\345\256\335w\276\343\215\0012xp\327\3\f" 504 | #"\255\311\231\327G\20\201\314\24h\245\221" 505 | #"\350A{\242\t/\v\334\2272\325\2749*\205\304H\214\221@D\31C\324\221" 506 | #"\302\226\234q\352Y\\\274\376\335ok" 507 | #"*\1\2571\355\274c\335\273\365\317\367>!??\360\24}|\232_q(\21" 508 | #"\362\334\342kOf\r*\bQ\5b\324$\246\246\210Q\350I\207o\375\360\26" 509 | #".;\375\362\223|:o?\363\332]\247\vE\327{\362\320BEC\f\1u" 510 | #"\34\200}\241-0\214\5\242\21\21\242" 511 | #"\202B\227\f\232Avl\270\230K\316\270\364\376\345\3+.>\236\317" 512 | #"\235\234\e\277\327\26\372\266\221|\331" 513 | #"[J\25\367\232\265\23\37\273\354\177" 514 | ) 500 515 | ( 516 | #"\332\264\357\e\237\335Uw\35\210C)\205(K%\n\243\301HDk\20\345A" 517 | #"\25\0205\304\210\322\221h\2\371K\244" 518 | #"D\3771\332\252b\265.\207\226I\257" 519 | #"\212P\315\243u\344\204\20L\2\257j" 520 | #"\376\243\1\es\226\344\243\234\265f\v" 521 | #"Wm\177\337\375\313\325\361\201w\252\36" 522 | #"\277\367\221\235\17o?p\370 \242\375" 523 | #"\366\274U\376\376`>\302\305\347\276\347" 524 | #"\206\345\355\241\27\345\b\336h{\315 " 525 | #"\36a\344\231k.\271\222o}\357\353\314\253y\372Q\21\264\302XK\364\236H" 526 | #"D\223\200+\n\322t\6T\214\240#\242=\217\36zT\266\256\332\372\266_\316" 527 | #"N\324:Gfp\306\241mD$\244y{\215\2\303\330\374\253H\237\323\322-" 528 | #"\326-\335\300U\27~\200MK\316>" 529 | #"\256\17\35\257\16\312#?\177\224\3\343" 530 | #"\373\351\273>\321DB\250\321\365<\223\235iz?u7^|\341\216\e\327\215" 531 | #"\374\342\314\355\ea'\244b\273h\345" 532 | #"\273\364\276\215{\344g\317\375\224\240\3" 533 | #"\321@\35*2\245\320\r\205S\r\220" 534 | #"#\252\341i\r\245\210]\306\372\207\200\255'\345D\216\265\2523y\265Vzc" 535 | #"\326~q&\361\255h\347m:\207\373\366\334\217\217\201,7x'\307\5\341\210" 536 | #"\20\321D\4\257\2F\e\206)Y9\264\206\313\267\275\217\363Wn\177M \373" 537 | #"\301\3wpp|?>z|\364\204\340\311\363\214\330\23\2141\354\213]\246\37" 538 | #"8\304\207.\373\260\234Z\274ya\272" 539 | #"\23\226b~\374\222\317\350\3G\16\313\23\223OC\251\210Z\343E\3201b\200" 540 | #"\4cA0\315\22\247@E\2\216C\23\207`\303\253;\216\353N_\257\3\214" 541 | #"M\34\270qvj\234\303\373\366\323\357" 542 | #"\3151\177d\232\334j\242\4\212\221\225\254Y\267\236u\353\32724\274" 543 | #"\4x{\200xd\260\215r\16[\32|\360\240\364QB\373\vM\200H" 544 | ) 500 545 | ( 546 | #"$\342\305c\363\2K\206\355g\254\34\\\311U\27\\\305\246Ug\377\341\250=" 547 | #"~\376:\336= w\334\377C\306;\207\251\244\217\"b\2750\0205\322\367\4" 548 | #"\5\301\v1\n\35\17\367=t/\37\177\327\332\327t\356'\303~!\210\17\34" 549 | #">${\16\355\341\262m\227\276\342\35" 550 | #"\366\251+~}\372\363?\374/\243\373" 551 | #"\247\306\320\205\20\244&j\215\210B\241" 552 | #"\211\213\333j\v8T\214x_q\360\320^\272L_\337~\t\260\271\251C\322" 553 | #"\r}\36\272\363\16z\263S\354~\352I\346\373]J\255\20_\243\21\234\353S" 554 | #"f\5\316;\212\314\342\311y\354\356@n3\312\201%\224\303Ke\325\372\3238" 555 | #"s\363\26\326oX\v\306B\373\224\267" 556 | #"\24}\231\t\323\327?\366\344c\30\35\361A@\31D\253\227\rF\250\30\211\4" 557 | #"|\360\b\n\25\r\266gXZ\216r\336Y[\271\342\274\367N\17f\317\227v" 558 | #"\276Z\233\254\17\311\17\356\373\36\23\223" 559 | #"\207\351\273.\245R\370*m\336E\201'\202V\30\253\221J\240\245923\311" 560 | #"\256CO\312\246Ug\275)s\373\262i\347\357\375\364{2\35\347\330q\376v" 561 | #"6\264\326\275\354\0\37\36\177D\276~\307W\31\357MP\216h|\335C\v(" 562 | #"\fBF@ab\244U\327\fxM\35\25k\227\237\306o}\344\267n\236\334" 563 | #"3v\335\350\322\345\323\367\337s\317\350" 564 | #"\344\301\375\214\37z\216\351\251qtt" 565 | #"\230\350\361\241\302\22\3211`Tl\226ZET\n\224I\321\17k\222w\250{" 566 | #"\344\255A\234(0\26'\202\213\201\b" 567 | #"\254Y\263\216\221\325\233\330z\341E\254" 568 | #"Z\263v\332\16\275\266\v}2\355\271j\237\374\3257n\244\23fAEDi" 569 | #"\2746\350\350\321\307\272\343\270\340\n\24\20\21\25@\e\304C\21J" 570 | #"\226dK\371\3145\237f\343\360\211\1\351\233?\375\232\354y\356I" 571 | ) 500 572 | ( 573 | #"\274\364\21\347\320q\201\32\n\3365*{\243P:\255\272j\240@K\311\306S" 574 | #"\316\344#\227\177\342\255\ab\200?\375\346\237\312x=\315\305g_\300Eg^" 575 | #"\300\251\331/\6\363\243\207\177&_\273\343\353L\272qL! \1\0255`\361" 576 | #"\332\222i\313\340\276\31\30\233\2456\236" 577 | #"\272\37X\223-\243\25r|\204\312U" 578 | #"\20\372X\4\215\a\4\255\325\242K\312\24\344ZpQ\21\261\b&\201\30\2101" 579 | #"b\265F\373\32e\fA\"N@\331\f'\201<\317\221 \324B\272\370\300\232" 580 | #"u\247q\3069\333\330z\301\16\362\245" 581 | #"k\336\224\vp\367\330}\362\305\333o" 582 | #"\2]%\320\212\305\31\213\302\241\251Sl}\341\337&\354\220H\4\20K\n)" 583 | #"8o\375V\256\275\344C\177\270L\237X\350\353\216'\356\220\235O>L\2577" 584 | #"\213\r\16\357*\220Hp\1%\211\20\306\250\210\b\312(\262\334R\e\ry\213" 585 | #"\345C\253\371\315\17\375\323\267\36\210+" 586 | #"f6>9\363\314\256\257\334}\v\375n\207\266\3128k\355&\266\237y\21+" 587 | #"\207N\275a\350\5\22\314\212\351\353\237" 588 | #"=\262\357\306\277\271\365\vT\272\207\305" 589 | #"S\a!\232\214 \200\266,9\334'\333=FiAiMQA\36-^E" 590 | #"DG\254D\224\"\355\322\215%\352HX\\X5D\1\225\21U\342\330\231\265" 591 | #"\30\235@\254\264&\327\1\t\202\240\210" 592 | #"\306\222\302\376\232^\267\333(\277\4/" 593 | #"\25Jk\2\206\200\301\2439e\365:\316\337\276\203\315[\316#[q\372\ev" 594 | #"1\376\342\256\377*\217\35~\204 =2I\e_Q\1\210(\265\30,k@" 595 | #"\vJER\200G\261D\235\302e[\337\303\3737\377\322\t\217\367\331\231=r" 596 | #"\353\355\337\242\337?\202w]\244\352\241\202G+\r\242\301G2\35" 597 | #"\211\1\2\2:\245\270\275Q\304\2016\255|\t\227^x%\27n" 598 | ) 500 599 | ( 600 | #"\332\361\206\3\371\25=\361L\34\277\367" 601 | #"\226\237\335\266\375\361g\37\243[M1<8\202T\221\\\267\270p\363v\316\\" 602 | #"\265\2313G7-\16|<\314\334;6\267\177\373\267n\377\"\343\3751\252A" 603 | #"K\257\3563\242K\242W\f\35\21\312'\16\260\324Gj\345\321Z\323R\31\1" 604 | #"\301[C\36\24(E\210\21e4\22\25Q\e\2246(m1\332\242ul\222" 605 | #"'G\223~j!\266\32#Q\245\260\236\212)\330D\20\2541\20#\301{\24" 606 | #"5\28\37\20I\307\362\22\351\327\216\262l\261\344\264-l\333~\31\e7\236" 607 | #"\306\300\312\r\257\333E\31\357\354\227?" 608 | #"\374\333\377\210]n\350\365\346\311\214>" 609 | #"\206\b\207tv*\1\233\250P\b\252" 610 | #"\21\370\f\227\303\\\263\355\203\\\262\376" 611 | #"\275'<\276\351\376\304M\337\273\363\326" 612 | #"\353\16\36\332\203\363=B\325\305HE" 613 | #"\2564\276\362 \6\23\365b\304\t\232" 614 | #"\260\277I\31\301j\240\240\310\207Y6" 615 | #"\272\226_\373\360\377\374\326\0031\300\34" 616 | #"\323\327\177\356\313\377\345\306C<\213\217\36\t\21mZ\350Z3`KF\313Q" 617 | #"6\234\266\221\263\327\356`\345\360\362?" 618 | #"\314M\367\352\311\211}\333\277r\337w" 619 | #"y\272?F\310\204\262\333\243\360\221," 620 | #"\224\f>>\306\362nM\255\205J\v\203\272DG\360\26\224\213\24E\v\223\25" 621 | #"is\310\321\330gD\320\250\264\254\21" 622 | #"QJ\243\224B\353\364=\211^4\321\250\306sE\264R \21\25\205\20<1" 623 | #"F\264\202(\21\211B\24\17\342\211\22" 624 | #"\231\353\366\311\363\26\3369rz\364\365" 625 | #" +6\236\317\5\227^\305i\247\237yC6rr\243\35\337\335}\213|\363" 626 | #"\316o\221\345\26\2244g\331\334\230\252\211?\250&4\31A\213\"\23Mi\6" 627 | #"\370\340\245\37b\363\272s7\215p\342\365p?~" 628 | #"\3546\271\377\201\273\221P\243\352>R\367\320>\220!" 629 | ) 500 630 | ( 631 | #"(\201\250JT\20\bB\364\1e4\30E\264\206\250\241\3165:\317)\226," 632 | #"\347\243\37\375uZz\360\206\345\331\310" 633 | #"\e\26\31z\325z\342\231\376\304M\177|\313\37]7\331\37\307d\5E\221\343" 634 | #"\352\nD\241%\207\240(\213\21Z\252" 635 | #"\340\202\265\e\331\261\371<\244=\302W" 636 | #"\357\271\225\303\207\236\243p\35\352\272C" 637 | #"\264%\345\23c,\235\356\3415\314\27\212\266.hI\n+E\245\311\312\0266" 638 | #"\263x\t\213\267~\236\347h\255\t\336" 639 | #"\223\31\273\250\326\nA\320\326\"\215r" 640 | #"K\202\20\254\302Z\v\222\252\1773\245\tQP\b\21!\210\20c\236\304K\256" 641 | #"B)E\220\210\210\20\274#\212\240C" 642 | #"\237\32\313\274\203,k\203\326\\t\351" 643 | #"e\234\273\375R\206\327\234\234]\370\377" 644 | #"\367\315\377 \373z\373\b^0\326\20\202G)\210*m\342\242\212x\2451\312" 645 | #"\20}\240\214\5E,\371\300%\327r" 646 | #"\331\351\227\237\2241\354\31\177Vn\273" 647 | #"\343\313\314\35\231 \272\36\252\357\310b" 648 | #"@{O\364I\334U{P\312\242\25\230E\270x0\221\332\346P\24\230L!" 649 | #"\355e|\360\303\237a\313)[\336Po|\\\242\370'\306v\312\227\356\376;" 650 | #"\346\2723x[\243l\304\207\200\322\n" 651 | #"\201\24\37V\232\221X`]\311\246\r" 652 | #"\347q\365\205W\362w\237\373S\306\367" 653 | #">C{\264\300\17\26\330\303\363,\237\252\321V3\335\262(k\30\16\26\355#" 654 | #"AGl\253D\e\203DA\241\310\363\34k\355\242\304P\243P\332\240\215F$" 655 | #"\242\320h\323xc\255\301j\204\270\270" 656 | #"\243\2171bT\252\n\26\t\311c\307\202\320w( x\207V\212\30\3\301{" 657 | #"|\b\204\340P\332\"\336\323\357\316A" 658 | #"\f`2\346\234b\345\232\215\274\357" 659 | #"\303\237`\365\246\215\327\330\342\265\225\363<=\266K>" 660 | #"\377\255\317\343\333}\274\367\350,]\367 \v\361\337\344\221" 661 | ) 500 662 | ( 663 | #"\305h\\\355\31\310\332\344.\343=\347_\301%\347^zR<0\300Wn\375" 664 | #"\222<\373\334C\20:\320\253\311B\204^\215\n)\22\341\233F\0ip\340=" 665 | #"\344Z\221\307\nt\244\322\226\230\17\21" 666 | #"[\31vx)\27\\\374\36\336\273\355\3049\372\361\330q%;\316^\271E_" 667 | #"\363\256\217\310m?\276\22597\205\0175:S\4\25\20\0026\317\20\337c\316" 668 | #"(\2021\349\260\223\275O\357bE\b\234BA=\326\303N\365\b\4\6\224" 669 | #"\201`\350\372\244{\365\204\305\333<\323" 670 | #"\317\237\3k-\"\222\250\200\326\4\240" 671 | #"\3142\254\315\200\243\273\365tC*\224h\264\26\2242h@Yp\336\223\345m" 672 | #"\242@\b\202\222H>\320F\202G\304&\332\31\4\35\2:\4$B\277\16X" 673 | #"\355\31\322\1\345+zu`8\267\314" 674 | #"\37~\216\257\377\365\237\322Z\262\354\326" 675 | #"\367|\340\203l:\357\242\233u\353\370\n,\37y\366Ql+#j\207\311S" 676 | #"ZH\210(\35@'j\344\203\207(" 677 | #"\264\212\202\272[\261\365\254s\271\346\334" 678 | #"\223Wp\273\373\300\23r\360\271'p\363\263d\342\221~\215wB!\212\30@" 679 | #"\242@\24T\0242\345\1\v\301b$\242\202`uR\327\5\351\341P8\346\230" 680 | #"\336w\30\266\235\254\21\276:;\356\214" 681 | #"\335\216\325;\364\360\373\207\345\366\273\277" 682 | #"\307do\202\231\3764\266T\324\276F)C\213\2W\ah\227x\t\214\317O" 683 | #"\223\21\361\272O;*\6\373\206P\30\\\313\342b$S@\210D\5F+\264" 684 | #"I\214W5Y\253cE\336\v_Y\226a\254M\336\2661\245,Y\326\320\214" 685 | #"\206'\e\25\t\261I\3126\200G\203\2654;\23\260yI\224@\220\344\225%" 686 | #"\4\202\b\342\3*3\350\340R\205\212/PEDP\324U\227P" 687 | #"u\211\235\300\267\276\370\337\30\370" 688 | #"\356\267\257\273\360\335W^\267u\373" 689 | ) 500 690 | ( 691 | #"\0257\24\257\2027O\324c\223cG\306\240\324d\252\325d2\217R\35!\"" 692 | #"\222\"\3V[\202xN_}:\327l\377\320\364\361^\257\227\263G\37\274\a" 693 | #"\35\3461\276\213\324`\235\240\235#\370f\37\"\21\35#\20PR\241\242CK" 694 | #"\236$\4Z\21E \6\202\213\210\207" 695 | #" \212\231\275\273\241\232\331H1\362\314" 696 | #"\247>\361\t\351k\305-_\371\352\353" 697 | #"\352\231\217\213N\274\320\356\337s\237\34" 698 | #"\351\31709;\316\314\314,[\316>\27]E\326\255\\\313T\277\303\301\251}" 699 | #"\270\336\24\365\364a\36\377\301\335\254\254" 700 | #"4n\256C\331\36@k\2034\36\324f\6\223\345\213\224 F\b1E\34\362" 701 | #"<\307\30C\214\211\263Zki\17\264\211\30BH\343\260\326\222\25\5\320xc" 702 | #"\35\2111-\202\326X\214\265Xkp>\244\346\"1\275/\6\240\1\216\2121" 703 | #"\321\242\340\222\a\222\210\17@\360\4\357" 704 | #"\20\347\21\240\327\355RdP\367\346\360" 705 | #"A\210\276O\25\v\2721c\311\362S" 706 | #"\271\364\212\367s\366\266\3557\230\227\321" 707 | #"m<\270\367\1\271\375\301;\210\355\210" 708 | #"\367.\25r\22\210\"\210Js\"\301" 709 | #"\23$\20\203pj\\\317\247\257\276\356\376\25K\216O}\366rv\350\340Sr" 710 | #"\363M\177I\335\233\0\327%\253\301\272" 711 | #"\320\314a\243w\211\202\22\17D\264\4" 712 | #"24\225*\351\6\205\"0\220\203R\236 \212\240K\202U\254Z\262\202\215k" 713 | #"73\357\f\237\271\341w\231\21\317\27\276\370%>\363\361O\276n@>!\20" 714 | #"\37\217\335\364'\377N\16\356z\230v" 715 | #"\226BF\326\24\t\230\n\262\314\222\227%\241\1^\2122X\254M\236uq\260" 716 | #"JQ\224E\3j\215\250\264\220\24E\2166\t\230\v\e\274\254(\310\255Eb" 717 | #"\2527\3\26\351\a\200\322\6\361\211s\273\20\20q" 718 | #"\350\306\273DIe?\22\4\325p\344\332G$\6" 719 | ) 500 720 | ( 721 | #"\202\253\t\276J \363\1\35\34\22#\263\235\36Jij\3579e\315\351\274\353" 722 | #"\252k9\375\242+_\362\302}\373g" 723 | #"\337\222g\306\367\320\227\36\332h|\250" 724 | #"\323\246\264\t\17\272\340\250\234#\327\31" 725 | #"#\355A\256\273\344WX5\270\352\244" 726 | #"\202\340\e_\376K\331\373\344\375\350\356" 727 | #",\252\n\304\20\210J\220\230V/b" 728 | #"\304\304\230V\305f\356\203\300\234\344l" 729 | #"\273\354J\316\271\360|\376\307\237\375\277" 730 | #"\264U\244\320\32\23\fk\326\257\346\264" 731 | #"\365\353q\263\302\370\221\232_\377\327\377" 732 | #"\226\331\\\261n\363\331\354zh\347\353" 733 | #"\6\3427\254\27[{t)\221\243\241\257\205\233g\341\273\304\2431_k-&" 734 | #"\313QJ#\222~o\214I\2406\6\2114R\317@\221\25h\255\236G-\212" 735 | #"\262\304Z\203\17\351wF7R$m\310\213Vs\\\201,\246\302\312\20\20\n" 736 | #"\304{\264N\241$\245\24Q<\321[\264\b\270\232\30 f-\274\327H\bx" 737 | #"\347\361\225%8\307\322%9\375\271)" 738 | #"rz\314\37~\232\277\375\213\377\304\31" 739 | #"?\271S\256\372\360'X\271\341\334\305" 740 | #"\vxpv\237L\314\315\20\320\224\305\0&D\274Q\210n<\277\1\2453\206" 741 | #"\313\2\345\340\362s/=\351\0\236\32{Jv=z7\246\236G;\207\252\223" 742 | #"0\"\230\330\210@#:B\223\v%\4\2106\243g-\27\\r\25\37\274\356" 743 | #"\327\221\340\371\325\337\376\227|\351s\377" 744 | #"\211a\"\27\234\263\231s\316=\237\236" 745 | #"\237!\16\32\6\362.\37}\357%\374" 746 | #"\335\217\356\341\274\263\316>\231\303\177\221" 747 | #"\275a \336\276\343Rv?\364\23D\372(\255Y\20g\32\255\tA\310\26c" 748 | #"\277\211\317Z\255q!m\346\254\265\224" 749 | #"\255\22\2454^h8\231%\3174\332\230$E\214\211\307\225e\vc4" 750 | #"N\4ct\2\251\311\311\363,%L\224J7\216\322\213\342\363\"\317\322\306" 751 | ) 500 752 | ( 753 | #"1s \0203Ak\203\363\0362\301\210K!?\357\211\0220\336\20|\300d" 754 | #">}\5\b\275y\332\3556b\241_9F[\31\aw?\316\27\376\354I6" 755 | #"\236\275M\256\375\324g(F\327\350\303S\207\310r\303p\276\4Wu0\1L" 756 | #"TH\f\344\231\246S\365\321A\223g" 757 | #"\31\333\316\334\306\205\253^\233\214\362\345" 758 | #"\354\316\333o#\364\373\340\35:\244\353" 759 | #"\240U\266H\305tL\271\314\350\35\332d\24\255A\346\203\202l\210k>\365k" 760 | #"\2048\200\v\25\e\266\354`\375\332\263" 761 | #"8\305\4\316<\375L\"\16\253A\25\212U+\206\371_\377\305\357p\352\31\e" 762 | #"\370\344o\277\270\267\362\311\2647\f\304\313V\255&*\203\321),VGGa" 763 | #"S_\4\37BJH\350\344\221\275\367" 764 | #"\reH\177\233\27y\322\313\306\244\243" 765 | #"\320\312\220\345\211C\23\205\30\25\306\32" 766 | #"l\226\201\2\37c\242\6D\312r \1=\246\230g\3246\1\270\261\30\2330" 767 | #"!)m\35UD+\213R\232L'\261\215\211\31\"\221\340*B\b8\347\20" 768 | #"_\343\203\305\30O\254AE\301x\203" 769 | #"\230\234\341\1\203\256*\362\272\246\352\315" 770 | #"q\370\211\a\371\253\377\347\31\266]\371n1+G\220\376\\C\2132Ln\250" 771 | #"\235\305KM\210\302p1\204\t\226\263N;\233K7^r\322\1|\370\251G" 772 | #"\344\261{\177J\241j\214\4tT\215HV\320h|<*\3077\306\342Bd" 773 | #"\276_Q\353A>\371+\277\206\2573\202\5kK\b\206\217\\\367;\334\372\227" 774 | #"7\22L\16R\243\215\241\366\236v\253" 775 | #"d\2517\374\322\205\27r\301\326m\257" 776 | #"+\212O`\222\236\377\34\211\30\307\357" 777 | #"=\366\347\360\202\237\213\245k\365\310\310" 778 | #"h\332\320\5\217Y\340\247\r\207\365\336\241\225&\212\340\203\244)m2" 779 | #"q\301\207F3\220\262mZ\203nR\323\1!\252\230\0\f\213\202\241" 780 | ) 500 781 | ( 782 | #"\250 /[G\351\2072\350\2548&\24\a\20\321J\320J\32\235\3021\351k" 783 | #"h2\202\6Aa\215&+J\362\242\225\342\326yAQ\264(\212\26e\231Q" 784 | #"\264\333\250\326\0\264G\250\2636\321\266" 785 | #"\310\213\26\3\355\22CMQM\363\223" 786 | #"o\177\205\273\277\375\367\344\335.\243\326" 787 | #"\322B!\316\221\345\31E\321&\323%:dl<\365t.?\363\225%\260\307" 788 | #"k\363S\a\344\273_\374\e\206T\240\20O\254jLL\224aa>\26J\31" 789 | #"\0264'\351|\33381\234u\376\305D\223\343bE\304\23\225f`\311JB" 790 | #"\314\331\371\340\343\344\225\242\24M6X" 791 | #"RS3\262\244\315\306\325+y\350\253" 792 | #"_\272\221\351\351\353O\366\371,\330\t" 793 | #"L\324\363\203\355J\345\317\213\223F\334" 794 | #"\366\27\376\205\315r\\p\30\2258%\260\30>\v\2\22\25\306\24\b\20\26B" 795 | #"\17\200\367\36\232\311\216\222\274\354\261\177" 796 | #"\233e9\306h\264V\4R\252\271,Z\30k\220\30P\v7CX\20\326\b" 797 | #"\208V{\361\374s\321\304(\210\4D\2\21\215\217:\251\346\214!k\265i" 798 | #"\265\207(Z-\212\262\240\3143ZENQ\226d\255a\262r\220V\253MV" 799 | #"\264\322\317\255A\312\3020`s\252\311#<\372\303;y\346'\3673\22\25m" 800 | #"\24\205Nz\210L\25\254_\265\236+" 801 | #"\317\271\342\244\3\330\365'n\372\316W" 802 | #"\376\226\316\344>\254\353bD(\263\34\232\255[*!\v\251\220!\2466Y\2" 803 | #"\324\256\246\357\34\37\370\370'\251L\201" 804 | #"\317\25en1\312\240\264\346\340\201\3" 805 | #",\337x:\263G\346y\352\221\307\351" 806 | #"Ow\b\316\241\213\214\332wX\272\264" 807 | #"\205\237?\314\236\237|\377\306\371\247\37" 808 | #"\177]*\334O\332d\315<\375\350\2568\377\354\342 \255zq\335\325" 809 | #"\362S\327`t\2364\20\n\34 :y\272\205\b\302\2\207X\0\261R" 810 | ) 500 811 | ( 812 | #"\n\21AD\26\371l\220\224\364H\17" 813 | #"\273\322\213\233\305T\244\3\332X\2645" 814 | #"\300\202\2143\0\1u\214\307}5\266" 815 | #"\250\307 \245\303\243\322\315\21\322\243\266" 816 | #"\214\315)Z\203\224\3556eYR\264Z\344\205\"\313\204V+\247,\223\267\316" 817 | #"\213\222\230\227\264Z-\206M\306\n\225" 818 | #"\321\337{\220\ao\275\25w\3500\203>2\254,\247.9\205\253\267^u\362" 819 | #"\1\334\233\270\351k\177\361\347\327\35|" 820 | #"\354!\224\353\245\355u\324\0205B\2729\243J\321\211${W\370\30)[%" 821 | #"En\350t\272\\\270c;9\1\353" 822 | #"#\272\6\361\221\377\345\206\177\316\231\27" 823 | #"\235\317\263\207\0160\326\3550W\327\354" 824 | #"\337\267\237\356\324,\265\3638#\220\v" 825 | #"gl\\\305\314\201'\271\357k7\363\203?\377\17r\370\321{O*\230Ox" 826 | #"\302\302\334\364\365;\277\366\307r\347_" 827 | #"\377\6O\177\347\327\211s\267\375\302\1" 828 | #"\276\353\362\367\"\315\346J\342\2\344\222" 829 | #"-\304\201#\21\255t\362\276\307\36\247" 830 | #"\241\24J\221\302A,\274\336,\377\272" 831 | #"\211\3776\261e$\311\254\224:~\332\37\343\vN\341X\3407|Z\320`4" 832 | #"J\el9\210m\17Q\264\333\24e\213\262l\221\267Zd\2556\246(\311\312" 833 | #"\22[\266\310\312\26C\355AZ\3320" 834 | #"$\221\221\20y\372\276\a\330\375\323\a" 835 | #"X\31\v\266\237}\3365\307=\330W" 836 | #"\260\376\221\375\362\325\317\375\331u\av" 837 | #">F[\34\212\230\312\213\264\"h\215" 838 | #"(CT\212\210Y\254\202\3641\321\210" 839 | #"\251\351i\224\261\234\273\365\34\212v\v" 840 | #"\255j2\355\320M)\353\236}{\351" 841 | #"\213\343\367\377\340\17\210e\306\221n\237" 842 | #"\211\371\16Sc3\364g:D\21j" 843 | #"\223\272n\236\261\351T\316\337\274\226\323" 844 | #"\226\r\262\353\316\357\362\235?\371?\345\351o\177Y\334\304\253" 845 | #"\177\264B5\363\322\217B;\361\273\336uo\374\3317\377\204" 846 | ) 500 847 | ( 848 | #"\213\327\355\2415s'\a\357\376\337\301\377\2026U\355!\242\261D\300(Ml" 849 | #"*.\24\215\207m\362\365\272\1\346B\252\31\216\245\24$Ie\b\215\336!\22" 850 | #"E\26\25m\6\213\212\26\205I\336&5w:\341\323<\2267FH7\315\302" 851 | #"2\254\"\332Z\362\262EV\224\224e" 852 | #"I\226\25\344\315\377\313V+q\346\274" 853 | #"\304\330\234V\321b\240\3100\336\263\302" 854 | #"fL?\275\207\307o\377\21\365\201\261" 855 | #"[O\302@\27\315\367\307\357\275\375\357" 856 | #"\277\310\301g\237\244]h\242qtC\217\240\24^\231E'\242b@-\252\266" 857 | #"#\245\16t\347\246h\225\3\34\232\356r\371G?M\214\206\340\233H\206Uh" 858 | #"\253\371\315\337\372M\202\200\253kB\355" 859 | #"\360\225\307\367\2\335\331.\235\261\31\372" 860 | #"3\275\264\241\266\n/\201\274Up\352" 861 | #"\352Q\266\236\271\216\v7\236Jw\337\260\263\205D\0\0 \0IDAT." 862 | #"~\360\2277\362\223\317\377\231L\376\354\36a\346exs\177l2\327\365MO" 863 | #"|\357;\322{z\327\363\360u\302\321\211\316S?ce>\306h\0061\203\311" 864 | #"\261\237\202\333\rv\375\213\336\273t\365" 865 | #"Yzp\3112\231\357\317\3\36D\21\315Q\215\252\4A\347\372h\3548\4\214" 866 | #"\265\2134BDP\332\22#x\37\260E\222Y\6\221\324p\244\371$W\327\344" 867 | #"e\213\347oTN\324\216\231\267_\360q1F\262\274\200,G\365\373d\326Q" 868 | #"\e\203\251\253\324\222U[D\27D\335At\240m\"3\363\35V\264[t'" 869 | #"'\231\2338\304\212\323\267\234\204\261\2" 870 | #"L_\177\327-_\335\376\304\203\367R(O\25*\260\240Z9\b\230\30\216\316" 871 | #"\3141\347\243\0\203#'\242\362\26Y1\310)\3536\23\262\26^h\342\347\251" 872 | #"\20\370\23\37\374%\266o\331\304\344\256=\224\375" 873 | #"\232\201a\20?\361\263\277\344}\e`\241\320By\230\333\373\247,;\373\237\t\345" 898 | #"9/\272\b\347\356\270\224]?\273\e\251\373h\5AV\e|\355\31\32\31bln\232}c" 902 | ) 500 903 | ( 904 | #"\317\245gi\f\334-+\227\257\300`" 905 | #"\31\31\30!\364*\372\235\16\2633\323" 906 | #"\34\31\237@\271\212\231\203c\230\252\177" 907 | #"\235\357uR\362D\tt\35\3Y\211\223\232Z5\311!@\305Ww'G\245" 908 | #"\230\257\24\363\241\317\a>\362\21b\335" 909 | #"A\353\34c\25\232\344\30\346\247&\271\365\357\376;\317=\3620\eGG(\312" 910 | #"\fi\347\344\255\206N\3459\266\264\330\254X\374\\\21YL0I\204Pd\324" 911 | #"\246F\227\nc\25#\355\26CK4\332Z|TD\37\220\276\243\312-\365`" 912 | #"\233#\276O6\334F\347\236M\247\235\311\331\37\373\324\211{\3428=6Yw" 913 | #"\35y\v(\200\32\262\bU\5s\273\276\314\320\326s^\3647\253\327\254\275f" 914 | #"x\331\312[g\372s(\4D\26\27}H\24\"\313\262\243\224BR\243\216\364" 915 | #"Z\2\2656\246\t\231\t\326(D\222" 916 | #"\346 \211\312\23\35\251\353\232\2424\351" 917 | #"F\341h\330\354\365\264$\310K!\276" 918 | #"\264\241\24\362\274\225nHcA{\352" 919 | #"\252\217!\303cQ\316\240\214\246(-" 920 | #"\322\233\243=2L\230\31\307\3475\241" 921 | #"\25\230\251\2170\271w\22\25\f9\32" 922 | #"\355\204\272;\307\354\314\21\362\0\252\333" 923 | #"C\367z\230n\237\330\357\222\233\246\34" 924 | #"\253P\364\250i\32\177\274&\263yN\31-\17\377\350\273\34\236\30cjb\202" 925 | #"\201\201!\362\262d\317\236g\221\271i\316X2\312e\2337022\314\300\300" 926 | #"\0006\317\311\362,\1\325h\214I\337\27t!\34\e\355!\t\215*\21lT" 927 | #"D\235\324{QE\4\217\305`l\216\324\221~\317qp\254C(\207X\266\351" 928 | #"\f\266\276\353r\212\345G\243_'\4" 929 | #"b\225\233_\266\305\332[U\376D\372\205\6\35@\367an\347\347\31:\375W" 930 | #"\204\201\27,\211\305\262\333\316\275\350\22\356:\364\34" 931 | #"\321W\r\2458\332\177LD\236O)\274_\24\304" 932 | ) 500 933 | ( 934 | #"\213\b\22\4c\32\375p\b\304\30X\350m\341j\327L\242&\6G\224\34e" 935 | #"\354\363\22\30\257\267i\235\322\331A\"" 936 | #"\n\241\16\21e,\306\220\22=1B\24B\260\4\223\n\2z\275.#KF" 937 | #"\350\365\272\4m\251\203\247\226\212\250\25" 938 | #"\3124\352;\tH\325E\214\243h\e\244\323\3\25\232d\rD\243\233~\24\212" 939 | #"\250#\307\21I|\351\363P\1\e>\317\301" 940 | #"\a6,\31f\353\205\3339et5eQ$=\270x\320I\2@S\270\e" 941 | #"b\304*\265\270'\216\320\304\243\233cDC;\346(\211\200G\214CECQ" 942 | #"[zS=f\246\3069<\177\2049\tl\277\372Z\226o>\367\32^\242\b" 943 | #"\341\304\350D\220\177_f\31Q@L" 944 | #"\22\237\3\24\36\214\331\5\356\1\340\305" 945 | #"\317\365[\277\371<\356\372\3567\b\276\207!\242j\207\316sD=\237R\200z" 946 | #"^\204\2\216R\n\245-\22\4\357k\262\254E$m\360\3541\305\214>\bV" 947 | #"\205f3\30\23g=\321\253\373\v,\225\324+tL=!\26\257\225\212M\225" 948 | #"u\0221-\250\362\222~_7\245\357\5\275\312\323\257**\347Q\224he\250" 949 | #"\275`\255\306XA\0211*C\346*\260\251\222\305f\n]\231$=\305\220\326" 950 | #"\2344\230\270H\"^\233\251\30\261*" 951 | #"0\262t\204\351\351#\344\3320\230e" 952 | #"\234{\301\371l\330\260\21\243\"\276\366" 953 | #"\324\204t\362\6\"\251\234,4\337Q r\314\316\375\5\363\5\n\353\32\232c" 954 | #"\"uW821\303\354|\315\324|\37_\266\331v\355\307X~\316\313WP" 955 | #"\237\30\210\255\375\334\354\221\3\333\2254" 956 | #"\233(\225.\216\215\211Vt\357\372w" 957 | #"\264\337\263J\30>\357\206c[J\215\236z\226.G\326\313l=" 958 | #"\205\211\241)\332L=$\340\305\224\"\204\220j\346H\361b\261\202" 959 | ) 500 960 | ( 961 | #"Y(\31\17\201l1\203\335ph\235Bn\342\35\330T\345\274X5\314I\4" 962 | #"q\323\222K\224F\224\302\4\260\315\r" 963 | #"\375\222oo\350\214\304\210i\n@E\222&D\253\310P\273M\336\353\341g[" 964 | #"\30_\220\307\200\367\21\321\32\225i\244\6G\221*Vb/q\3604\21\240\25" 965 | #"\22T\362\306\257\25\273\215\3X\270\317" 966 | #"\215\315\351t\273\f\f\264!\b\37\370\340\207)s\223\252c\242O\2+\223J" 967 | #"\252\24/}\334T/xL\333\201\306\24`\3 \25:WL\217\31716q" 968 | #"\204\361\231.fd\31\357\376\364'(\327\276\272\6\210'\26@m\217~v\325" 969 | #")\247\23{\251XW\221\226\v\r\250\n8\3648\23\267\377_0w\357\215\324" 970 | #"\a\eB\232\2\326W^\373Qb\34\305J\1\252O\255\216\362\325EJ\321\250" 971 | #"\332\234s\317;\254\204\220\312f\24 " 972 | #"\202\210o\246\3114\361\344\5J\342\361" 973 | #">\365\372\215\307l\20O\310\342\202\234Tc\242F\211Im\5\26^\346\371\e" 974 | #"\250c\225\t\213u\177:\245l\323\220" 975 | #"U\323\3656\320\231\235\245\356u\311\362" 976 | #"\26\22\rF\245\22~\321\n\0274J\27X\245\261\244\272\306\250\24\321(D'" 977 | #" \213Z\350\2\255^\322\373\275\364\371" 978 | #"\244/%\n\35\r*\246\310A\320\244\6\207Y\332,W\316\323\357\367q>U" 979 | #"\214\e\235\264-A\245\262\262\347\38" 980 | #"\262\220\v\204\224\v\220\243\207B\vH" 981 | #"\267\207\325\320\357\327<\373\364!\236}" 982 | #"n\212\303G\2\347\377\322'y\337o" 983 | #"\377\236~\265\0\206\23\5\361\314\314\306" 984 | #"\375c\363\344E\32\245\212\244\320Qs" 985 | #"B\245\206\326\344\255\314\334r-\361\300" 986 | #"\347R\331J\243\271Xu\346*\242\31" 987 | #"\4\337\302\242\250e!\361\221<\257\253\23p\25)\273\267\240+\206T" 988 | #"#w,\321\n\301\245\v\241\24\"\1\357S\324B\242PUU\362\350'" 989 | ) 500 990 | ( 991 | #"*\376\217\21\35\204L\4\320M\226k" 992 | #"!\256\332\334\300M\237\21\375B\227\244" 993 | #"\26\264\323\311\v\213\310b\"f\1\360\342k\3049\2062K\26j\242\22\2}" 994 | #"\24\36+\21\23\2\231\n\30\3451\204\344\231MjO\2005\rT\216\35\357b" 995 | #"Z\346%MKDKD\245\346\21ic\254=^\247b]\247#^EzU" 996 | #"\177qE\254\252>\332XX\20\360\3\2729\204j@\253I1\344\204X\225\312" 997 | #"\271b*\353\362>`\304cu$D\341\360\304\30O\356\331\303\316=\207\319" 998 | #"{\a\327\374\353\177\253W^p\374\315WN\f\304##\317\234\272\3612:\375" 999 | #"\346\223bz\26\212\320\09B\313\200" 1000 | #"\352\300\344O\376\17:?\3777\273\250\367\b@{p\275\36^\266\fT\215V" 1001 | #"\6\213\301st\23\2202ri\263\2,\n\206 y\352\205\276`Z\353\243\241" 1002 | #"8R\24\"\204\260\bZ\205\340\\\252" 1003 | #"\237\213\222d\233\257\312\26\337\267\300\301" 1004 | #"\25\242\rN\eD)<\20\232\267\250x\224\372J\23\322z\241%\35FR\337" 1005 | #"-\204\342\24\32\245 \323PX\305\324\301=\264mD\213\247&C!\251GQ" 1006 | #"t\30<\"\36\223[\202\21\202M\307" 1007 | #"\22\"h\203\261\r\245\200\227\335\324)m\21I2K\21A\264O\221\1\35\20" 1008 | #"\235:\373\v\21\23\323\315\331*\362\244" 1009 | #"\351\316\f\273\237\335\203\204\205\0177\v" 1010 | #"l\n\35eq\16TT\304h\20\225\21\260\200a\300j\362\350hk!W\320" 1011 | #"\231\233\347\300\330\4\217\3579\210Z\261" 1012 | #"\226\17\377\356\277b\313\265\37|\315X" 1013 | #"<\341|\254\213\n\245\233\v*)\246" 1014 | #"\277h\315\357J\5\255>\364\36\372\317" 1015 | #"\314\337\375/\241\276S\210\a\344C\37\376\30\261\350\21t\a#*=\36\241Q" 1016 | #"\246E\21B\b,4\353^\20\244?/\r\275" 1017 | #"\260@I$\306\205\352F\325\250\317\26\22\36\t\304" 1018 | ) 500 1019 | ( 1020 | #"i\206_9{\267\340\343\215Jt\305kEm5\35\5\375\334\322\313-]\243" 1021 | #"q6\235\363\2027\322\361(x\322\305}>\245\220F\270TKj\e\200\6\211" 1022 | #"=\20\a\336\223\233\202G\37~\214\245#+\30l\017144\332\370\265\330\200" 1023 | #"L\bD*\211\210-\360ZS\e\205\266\31\222i\2021Iv\332\264\367Z|" 1024 | #"\216\nB\b5Q\201S9u48]\320\27C\326\36\301\307H\324\251\357]" 1025 | #"\2\244\302F\205\366\202\252\3\241_\223e9\21x\346\351g\32\32st\2764" 1026 | #"\351o4\226\340-\"\26\253-&\b\2718J\351\21;\263d\276\302Jdz" 1027 | #"\246\303\316\335\373\230t\226\367\375\352?" 1028 | #"\345\322O\337\240\363\345/\337\254\362\225" 1029 | #"\354\204\223\35\353Gf\250\273\300\b\213" 1030 | #"\373&\273\260!o\276\f\251\32\277\20" 1031 | #"\350>\363\r\16\317}\203\245[\376\200S\327\177\fk\272tB\362^Yp\250" 1032 | #"\24\213Zld\222\345\315\3k\240\3719i\202C\303\213S\304!%F\314b" 1033 | #",R\343\235'+J \365\303\360>`\262\205\312\216\27F)\0221H\367@" 1034 | #"j6X+\241\326\32\225g\4k\321Y\326\204\220\322\346\311w\3470*\240\252" 1035 | #"@\326\320\2\265\370I\34\235\214\305\317" 1036 | #"\27\202\357\243\202\203\350\210\342\300dx" 1037 | #"<\230\22\361\201]\273vsY\257\307\362\201af\272=*[\22b\227\312E" 1038 | #"\n\233\241Q\3446\247\352\317\240b;" 1039 | #"%\5\324\34\20\27e\250\220\274\263E" 1040 | #"R\357\214\"\247&C\262\26\330\1\316<{\vKG\227\263\353\211\235\348\260" 1041 | #"\217\301\366Rbo\202\30\233\214\236-" 1042 | #" B\257\356Q\346\266\321s\273\244\32" 1043 | #"\224\310\303\17?\304\371\333\266\245\314\35" 1044 | #"\6\\\37\245r0\6\253\5\211\340\253\232\226M\5\20\232\34\312\26" 1045 | #"\235~\305\336C\23\214\317\327\\x\305\307\30\331z\361IS\353\2350" 1046 | ) 500 1047 | ( 1048 | #"\210\365\222\323\351\317/\374\0\304\243<" 1049 | #"\t\232%\26\210\1\254\206A\1u\4f\357\376\337@}\225e\305\f3\235\215" 1050 | #"\251\235\251t0J\241C\em\24\276\256S\351P\363Y\211K\312b\24\303;" 1051 | #"\217\311\322\263?B\360\4\35\310L\216" 1052 | #"\304\246\202\271\2111k\265\340\215\0256" 1053 | #"\313\323\306O'\336\246bzlV\224" 1054 | #"\243\233\241\250\240\2535\331\3200\2249>\nU\360`\2Vehm\260\331\0" 1055 | #"q\276\213\363\36\23R\373\323\206\6..\263\20\23\35\n\1\357jB]#R" 1056 | #"\23\304\343% A'\270\305\4\222Ac\370\336W\277\304\373?\375)\372\203-" 1057 | #"\352N\233\351\30h\351\234e\3\243l" 1058 | #":m\23\241S\323\231\231\2417?\313\324\3448\331H\207\271\303\343\4Uc\n" 1059 | #"\205\364\372\30\35\231\237\237\343\324\265\247" 1060 | #"1y\344\b\27\275\373\2V\256=\235" 1061 | #"\215\233\317'\eJ\375\231\267\177`\362" 1062 | #"\352\351\203\207n\335\363\324N\16\376\374" 1063 | #"A&\16O\320\353{z!\340\275\24358\2226\351:b\243\307\3255\266\34" 1064 | #"b\367d\27\366\34f\303\251\253P\375" 1065 | #"\36\203e\213\356|\207\262\2253;7\233z,7\325/\321\a\214\315A\27\214" 1066 | #"\317v\31Y\261\232+?|\355\375j" 1067 | #"\351\311\253\332\206\343\6\361\3016\254\356" 1068 | #"\36\373\233\216\323\230T\t\217\327`=G\301@\212\\z\rY\1\370\264\237i" 1069 | #"\ah; \373)[\327\301\376\307\327Q\331\16\256\354a\243\307\3702=Eh" 1070 | #"\241\1`\0233^Hx\320\210\334\353" 1071 | #"\272\246\225\345\213\332\b\347\253\224\30i" 1072 | #"\216.\336\21t\3223\304\30\tu\r>\320\312\vjuT1\247bJLH" 1073 | #"L\345I1*tQ2\253\204~w\16Y\354(\244\310L$\213\212V\226c" 1074 | #"\212\fj\207\364\233M\322\261M\r\t\340k\\]" 1075 | #"\343\275K\245\371\r\227\27\37R_\213\20R#\22" 1076 | ) 500 1077 | ( 1078 | #"qh\2e\354s\350\251\235L<\375$k\327\234F\277\265\224\334\267\330\270~" 1079 | #"3\27\237\266\355\27z._M^m\213e\267\271j\372z\23\345t]\276r" 1080 | #"\213W[,\273m\305\206ez\305\206s\221\367\\u\223n-\377\345\336\324\330" 1081 | #"\344\374\314\344hfavv\202~g\226\341\241!\216tj\3168\353\374\351\371" 1082 | #"^5:z\312:M5\263\261?;\276\353\310\276}\314\316\314\322\2639\207\247" 1083 | #"&\30\32YJ\0355\203E\213,\313\251:}\2642\314v{\254\333\270\2063" 1084 | #".=9\255\267^h'\\\262\177\360{\177.\373o\277\201\v7\223\212,\345" 1085 | #"\371\2721\247\240\322\340*\30\311SB" 1086 | #"\304\327`\353\344\255\346\333\360\365\373\336" 1087 | #"\317T6\202\210\242\24!\317\6\200\264" 1088 | #"q1\306\220\225\v\25\b\221,\313\2227m*\241\213\242@\333<\2258E\241" 1089 | #"\310Z\230\4\207x\217s>\325\346\5\2178\207\227" 1093 | #"@t\201\350+\360\258O\247\333\247" 1094 | #"\207\345P\267\3427\376\371\357aG\226" 1095 | #"q\306\372\27\353O\336\261\347\333\t\323\211#3\363H\r\22R\377>\335lv" 1096 | #"\3141t\260\34\204\341\355W3\263{" 1097 | #"'\235\231\375\f\27`\27\370\263\202\323" 1098 | #"F\36\245\236\336A\237e\20\263\346\341" 1099 | #"\203nQ\34o\274^\354\340\263PD\272\320\352\251\256krm\222\236X+\352" 1100 | #"\272O\313\30\254N\225\316\316\5DU" 1101 | #"\330\6\350\n\301\205\36\272k\210\6\n" 1102 | #"\233\201\316RlTEj\e\351\340\350\204\ngK|\235NJi" 1103 | #"i\352\373R\22\306\327\351\371DQ\vN\373\224)\254#\276v\270\340" 1104 | ) 500 1105 | ( 1106 | #"qR\343\202\203\272\"\6\2276\251\22" 1107 | #"\211\336\23j\217\257k\352\272B\343\250" 1108 | #"\253>\"\212:Z\274ms\311\345\227\263|\325\351,[\361\366~\346\362\ee" 1109 | #"'\f\342\r\247_\310\243?j\22\34\6hBl\v\256\330\2\235\16\344\371v" 1110 | #"F>\370o\30\330\373#&\177v#Uu\210\254\351q\273\346\3641\236\31\233" 1111 | #"!+K\202\32\"H\2061GE\360\301\v\332.\304Z\223b\315\346G\207^" 1112 | #"\367+\312v\211\1\242V\204\272\aY\201j\24T\336\327\20|\322&k\233\250" 1113 | #"{\23\351\350T5y^\242\213\234\220\e:xf\360t\214\20j\217m\36\245" 1114 | #"\240P\251\201\241\17\351)\366\336\342\25" 1115 | #"\264u\306|\177\206n\337c\275G\205" 1116 | #"\210\17\236\332\327T\342\310\243\20\252\232" 1117 | #"\272\252\220 T\375>ynqu\37W9\371[\377\202\325\233/x" 1142 | #"\a\274'`'\274\261\233}\356\21y\354\17\317\347\342s \fCU\203\236O" 1143 | #"\34\331\31\310\f\224\25\304\21\230_\r" 1144 | #"\313\336s\37\214\274tW\233{\276\371" 1145 | #"%\271\353\366\3172\242\6Q\375\22g" 1146 | #"\3&\263\b\262\330\275\247\325\32 \204" 1147 | #"\200\322\6T\244h\25i\231\17\251\223f^\24dYz\310\f4\241/k\220" 1148 | #"\241\234\271Bqpn\ne5K\3126\255\240\31\25251\263\324\255\214\203t" 1149 | #"\2313\251\17\261\321\vqNM\201I\2554M\362\340e\320,\217\31\235g\366" 1150 | #"3Pyb\350a\225\3025<7\222(\205\367\t\274\342SC\230 \20\242\"" 1151 | #"\eY\316\245\277\364Q\316\177\317\325\357" 1152 | #"\200\367$\330\t\323\t\337\363\314\306T" 1153 | #"~O\225\242\20:\2\32\252.\364\35T\21T\2352\\G\36\376W\f_\372" 1154 | #"E\321\331\213\227\316K>\362O\364\323" 1155 | #"\217\336's\a\236M\17\220\301#\22" 1156 | #"\27\273b.t\3371\326\244\246\177\32\274s\230h\27\373J\324UE\0240\326" 1157 | #"\220i\vU\240g<\263Q\330\353z\34\31pH\bL\365\373\264MF\331\312" 1158 | #"\361\231\246\253\4\27\2\6K\256#\22" 1159 | #"\222\302\254\225\265\21\327\4\271#\30/" 1160 | #"\264\311\351\354=@\273W\223\367\35\363n\36g\222\306\303K\240r\16" 1161 | #"\t\216\340\\R\335\211B\310h\217,\343\322\367}\200M\27\354\270\337\16" 1162 | ) 500 1163 | ( 1164 | #"\235\334X\351?f;a\20/\335\260\341\206J\257\270q\256;\16=\3509\300" 1165 | #"\35\25?\353\372\377o\357\334\202\353\252" 1166 | #"\3563\376[k\337\316M:>\222,\311\306\26\276a\f\30\5,_\300$\230" 1167 | #"\2130\241\201&\206\6\222\336\302K\30" 1168 | #"H\3510\323\27\36\312L\236Z\206\247N\36:\241d\350K:\223\26&\245\231" 1169 | #"^\22\f\264tH\2\35b\352\32\23.6\3066 [\226u?\227}Y\227" 1170 | #">\354cY\6\333\200%\333\222\262\177" 1171 | #"/\232\321e\237\275\316\376\264\316\332k" 1172 | #"\177\377\357\17\221\2U\3\221@E\374" 1173 | #"\n{\351\253\350\236\233\36p\246\3313" 1174 | #"\23{\324x\242[\336y\377\303\374\375" 1175 | #"\337\374\25\"\34\306\332\324\253jL\272\275%\245Lw\37\334b\263r>5\225" 1176 | #"\244\5\232\376TAi\34\3078\332\1_\340\272\240\245e\334\204\214y1\241k" 1177 | #"q\34\250\271\232\252T\b\23\342*\17" 1178 | #")$\22\201\325i\222\205\343\371\30\253" 1179 | #"\221&\2\341 \264%\300!'\3\364\360\30bl\34U\213\321F\243\320\304I" 1180 | #"Bb4\b\203\212\343\346^\260A[\211\frl\371J?}7\365\217\"\235" 1181 | #"\373Ng\354\3168wf,\342\352\360" 1182 | #"\300\223\343\215\204\304B\334H\213\37\255" 1183 | #"\206\304\246\305\2222\202$N\305\355)" 1184 | #"\b4\250\347\237\241\373\376\315O\342\235" 1185 | #"\24\261'\322\231\271\265\353\22\271\341\206m\3467/\374\v\5!\322^\eS)" 1186 | #"\232M7U\30\21\344\202t\321-\323\24x\0\327\v\246\326\320J\245iAQ" 1187 | #"\316e\3245\2148!B\30r\372\244QG\0\b\260\306\242\254J\327\327\30L" 1188 | #"\254)z\351C\223H\205\270~\36)\4n\"\360\343\220\306\301\1Z\23\201\326" 1189 | #"I\272\35\247\32\24\0\23\205H\235\244)\3532 \22y\326o\274\201" 1190 | #"\e\357\332\361\254W\374bI\362\31\237\237\31\213\270T)#T\304x" 1191 | ) 500 1192 | ( 1193 | #"\25\352\315\331\326%]\17\353\4\362\200" 1194 | #"V0Y\a\323\0U\205\274\375G\332" 1195 | #"\367\337\205w\305\37\236\366\230[o\351" 1196 | #"\337~\360\255\335;\253G\17\200Im" 1197 | #"\211\326\n\34'u\250)\245\220\261\300\367sSA,\211R\30k\361\274\0\345" 1198 | #";\204\256&q-\241\233p\254\250Q" 1199 | #"\222O\233\266\233\337\20\3226o\270\322DN\203%L\"<\317G\"\320*\"" 1200 | #"\3209\212\312a\342\300G\264646V$6A\273\nQ\217\320\272\1\26\252" 1201 | #"\312A\26\333\270\254\267\217-7m\247" 1202 | #"\265{U\266\356=\317\314X\304&6\270IB\322\200\311I\220*\255\3520\36" 1203 | #"\350\\\263\250\"\201z\3\306\222\345T" 1204 | #"s\37\322y\f\366\374\374\357\350[{\307\38\237NTw\213\355/n\337q" 1205 | #"/\377\374\243\37\244\3166l\263a\214" 1206 | #"\234j\177\240\224\306\23005\bIA\350C-04*\206\304M\r\34\216:" 1207 | #"\2311d\247=\n\207i\366=\233\226\325H\t\226\324L/d\332(\\H\201" 1208 | #"\3538H\3-Z\20\r\216 &\353i\226\257\2604\302\32\304\2\251\240n\3" 1209 | #"\310\225Y\267e\v\327\337\274\235\342\342" 1210 | #"\2319\2632>?37\0\211\302\263RV\276Y\e\32\242\21C\234\4\344\335" 1211 | #"\b\337\0qZ!`#\20\r\230\34\2078\267\224\212\36 z\347\r\242\217w" 1212 | #"?\31\364\334|\332\266\0\335\227_+\327]{\275y\367\215W\2604\322Rx" 1213 | #"\235 \2457\345Q\230\264\t\241\257\261K[\251\a\202\320K\275\32S!\321n" 1214 | #"Z0\251\246\v\370\223~\365\346\327T\344\251\vK\330t\r\236$iz\274\20" 1215 | #"\16^=\306\f\215B\22\21ZM\243Q'\365\324J\22\\.]{\5w\374" 1216 | #"\351C\17\6gis\220q~\230y>qk\307}\"\327\375\315" 1217 | #"d|\b\257.P\344\251\6E\244\t\361m\235#\6*N:C" 1218 | ) 500 1219 | ( 1220 | #"7\342<\223A\a\311`\235\266\261*" 1221 | #"\257<\375C\372\377\262\367q\374\323\e" 1222 | #"Vn\374\332\216\321\217\336\177\273R\e" 1223 | #"\377\30\213m\206\253\244\217g\303b@\270\330!j\a\343\20324\313j,J" 1224 | #"\2344\252;V\234\321$~J\304Z3k\336X\201@a\361\20\322`\e\t" 1225 | #"]\371V\216\356{\207\366Z\214\224\2e\4\6\27\353\372t._\305-w\336" 1226 | #"C\307\312\365\331\314{\221\230\2257\376" 1227 | #"\360QK\243\272\226\211\343-4\352%" 1228 | #"\306\217{\324\206}&\252\340\346]\206" 1229 | #"\2010ZD\337\365\267\362\350\316_\311" 1230 | #"\333\36{\232\244u\3\373\177\363.\37" 1231 | #"\274\372\353G\317t\\wQg\373\357" 1232 | #"\335\375m\214\233'\221\240D\236Z\354" 1233 | #"\263\362\252\215\374\361\367\376\f\225\367\321" 1234 | #"\276\244\252C\264<\331\264\345\204\251w" 1235 | #"\312\321+N\336\314M\0256M\27p\323C)\2325p&p\210d\214\305\320" 1236 | #"\341\225\340X\25\257jI\224%J," 1237 | #"\t\36\227\254\355\345\376G\36\343\336?" 1238 | #"\377\276\314\4|q\231\371L\252~\204\312\e\"]'\260.\276" 1255 | #"N+uO\354QO\377\252\233\201\"'\2128?\365bM3\277j\26{z" 1256 | #"\332\245\203Et\351\22\316P\235m}_f\351\272+p\3332\177\303\\cV" 1257 | #"zv\334\363\235\a\17/\333|\315\20" 1258 | #"\256\373#\n\225\247\362\355\260\341\201\357" 1259 | #"\261\254\257\327\374\364\373\2171v\344\20" 1260 | #"nQ\240\375S\3\31\334b\373\213n" 1261 | #"\261]\26\316r\354q5\334\377\352\256" 1262 | #"\327v\276\275w7_\277\343n\252I\214q\22\306\352\23i\311\234R\4x\270" 1263 | #"\237H\250:!f+\354\224\230\305\231\4\f \21\6\343J\320\22a]<" 1264 | #"7\317\246\353o\342\252e\263\337\374%" 1265 | #"c\366\230\225\213\263\254\377\266\25\264." 1266 | #"\336\304'\356\314;\373\276,\37\372\311" 1267 | #"s\17\256\275\367~F\264\301\226\213_" 1268 | #"\370\330##\243;\337\331\267\227\215\233" 1269 | #"\256#\fA\340\221\317\345\320(\254HC\243OdN$R\2208\315\331t\232" 1270 | #"p\35#p\215\300\341\354\3\26Hh\306B\t\5\213\27/\245\273{\315\254\a" 1271 | #"_g\314.\27\254\31c\365\255\327M\351\252s+\16\374`\370\35c\255\206Z" 1272 | #"\16M\302\204\234\344\237^\3701\246\305" 1273 | #"\240\245FZ\211\320~Zr.\365\324\214\373\331\265\315\247b1\340\vLh\311" 1274 | #"\253\"\233/\277\201o\364}=\233\205" 1275 | #"\3478\27\354\2\235\253\200\1V\266\257" 1276 | #"\223\255\3056\212\371\34\205B\201cC" 1277 | #"\3\370\205\200D$\30i\323\34\b\a" 1278 | #"\224c\232\345\343M\223\376\27|\35\201" 1279 | #"\304&\32!\233\3115J\177\346\337d\\|\346\315,\323\221_\"\273:/\221" 1280 | #"J%L\326\253\304\"\302\367\34\\-q\22475\353\316\370s\3056\273{\22" 1281 | #"3\321\30e4\36~|\346g\237q>\2317\"" 1282 | #">A\276\263e\364x2\210\365\"\242h\22a\233\375" 1283 | ) 500 1284 | ( 1285 | #"\2144H#\277\360\354\373I\322poK\344h\16\215\35`,\36=\343>v" 1286 | #"\306\334`^\211x\317\373\377g\366\35" 1287 | #"\336_\371\360\243\1\254M\233\232[i\260h\\+p\315\314sy\323,\2334" 1288 | #"\26\252aB\366\34\332=;'\237q\336\230\27\">>>\376\300\340\310QS" 1289 | #"p\213,\316ub\224\213'\362i\205\260\216O1@\210\231/(\20\315\210\365" 1290 | #"H\205\274{\370\267\354\32\230\335\276k" 1291 | #"\31\263\313\274\20\361K\257\376\342\311\361" 1292 | #"\3068E\277D>*\322\273\246\17\e9\240=\224Nw(\214H\313I,\"" 1293 | #"\335e\230\1i\370\240 W\b822\300\256w^\343x\343\330\360\254\f&" 1294 | #"c\326\231\363\"\376\357w_0\357\35{\223\6\223\f\217\16\223W\1\e\327n" 1295 | #"&o\n\310\304\303u\3\254L\237\310" 1296 | #"\245\211g\351\3\216\231p\342&1\212\24\322\23|pd?/\357z\2612\v" 1297 | #"\303\3118\17\314i\21\37n\0340\377" 1298 | #"\371\306N\352n\225#\223\37\343\227%" 1299 | #"\221\r\311\325\35\256\357\275\1\352\22\251" 1300 | #"d\232_,\rF\222\232&\254\230\361" 1301 | #"6\205\24\244\373\317R\242}\315\373C\37394r [V\314A\346\264\210_" 1302 | #"\372\237\27\211\235\204H\204\274s\370\267" 1303 | #"h_\323\240\212\264\226\25m=\254\351\\CN\4\2702Mm\221N\332\314\304" 1304 | #"5\305\251u\355L\260V\220h\213p,\265x\2\341]\230\aC\31_\2149" 1305 | #"+\342=\307\367\232\375\3\37\220\b\215" 1306 | #"\353\273\214\214\215\321\320!\262(0\"" 1307 | #"\302\327\36\333\267n\247Mv\220\vs" 1308 | #"\24\234\34Z\305\b\307\222\350F\332\307" 1309 | #"b\206\b\221\6\234X#pm\36\317\311\317\302\3102f\2339)\342\21=\364" 1310 | #"\372\313o\274H\342\207h\241\321VP\17#\16\35>\210\"A\273\240" 1311 | #"\264B\206.\267_\177']\305%\210\20:\26\265\243\264\302\272\n%" 1312 | ) 500 1313 | ( 1314 | #"\32\230s\275\301\263\2\254D\243\219" 1315 | #"\215\262\340\t\217B\220\177pvG\232" 1316 | #"1\e\314I\21\277\376\326/\373\216\f" 1317 | #"\177\200\362\"\2\277@\240rt\347;" 1318 | #"\31\374p\220\234\237\206\245\264-\252<" 1319 | #"[\364K\317v\227\226\360Gw\336\377\304w\357~\210\366|;B\201\353H\214" 1320 | #"Pg\317\375?\35V\244\371[\366D\363n\201N,R\v\272\272\272\301\221Y" 1321 | #"\251\375\34dV\254\230\263\311\341\361}" 1322 | #"\346\310\321\1VVVr\331\252\365\264\3122\253z.\35\325ZW<\307\177\242" 1323 | #"\374\351R\246\373\0\216\214\f\375\264\256\330\322" 1368 | #"\266Ki\a\307x\370\261\207[\227\210" 1369 | #"j\214[\265\264\304E\344\210\245\"\26e\2\236G,\210\v\225\324\25V'\30" 1370 | #"\a\"\231\20\273\t\37\216\36m\266\323" 1371 | #"=\225\256\216\366M\276+I\222\20K\204+4E\351Q\22>j\302R\311u" 1372 | #"\320Ql[s\21\206\221q\216,\b\21\257\277\274\27" 1373 | #"I\263\371\214\321\344\203\34\233\327^\313\312\226\236\323\216/" 1374 | ) 393 1375 | ( 1376 | #"\237\3\277,\260EC\354G$ND\214\2\337\303\t\n\273\202r\346\221\230O" 1377 | #",\b\21\257^\266\ni%\276\24\24%\264\271y\266|\351\2723\316\246\a\a" 1378 | #"\337\347\3457\376\213=G\3670`\a\231\bj\304A\202(B[W9\353j" 1379 | #"4\317\230s.\266s\241%_$\237+1\31\217\223#\340\253\375w\236\325q" 1380 | #"6\221\324xoh?\215\321\20k\22\312N\211\274ne]\317U\254\352\356\271" 1381 | #"\220\247\2361\v,\210\231\270\354\265=" 1382 | #"\330\342T\bL\201\313\227\365rY\341" 1383 | #"\354\241\327K\227^\212_\312#\212\22UR\324\374\tj\fqIO\307\205:" 1384 | #"\345\214Yda\210\330\251B3\346=\231\2103\346=\231\2103\346=\377\17\363" 1399 | #"\306\277a\206\227\320\336\0\0\0\0IEND\256B`\202" 1400 | ) 0 0 22 29 1 #"\n" 1401 | 0 0 22 29 1 #"\n" 1402 | 0 0 26 3 1 #"y" 1403 | 0 0 22 3 1 #" " 1404 | 0 0 26 3 2 #"is" 1405 | 0 0 22 3 1 #" " 1406 | 0 0 20 3 3 #"100" 1407 | 0 0 22 29 1 #"\n" 1408 | 0 0 22 29 1 #"\n" 1409 | 0 0 26 3 2 #"on" 1410 | 0 0 22 3 1 #" " 1411 | 0 0 14 3 2 #"up" 1412 | 0 0 22 3 1 #" " 1413 | 0 0 26 3 3 #"key" 1414 | 0 0 22 29 1 #"\n" 1415 | 0 0 22 3 1 #" " 1416 | 0 0 26 3 4 #"move" 1417 | 0 0 22 3 1 #" " 1418 | 0 0 26 3 1 #"y" 1419 | 0 0 22 3 1 #" " 1420 | 0 0 26 3 2 #"by" 1421 | 0 0 22 3 1 #" " 1422 | 0 0 20 3 2 #"10" 1423 | 0 0 22 29 1 #"\n" 1424 | 0 0 22 3 1 #" " 1425 | 0 0 26 3 4 #"turn" 1426 | 0 0 22 3 1 #" " 1427 | 0 0 26 3 2 #"to" 1428 | 0 0 22 3 1 #" " 1429 | 0 0 20 3 1 #"0" 1430 | 0 0 22 29 1 #"\n" 1431 | 0 0 22 29 1 #"\n" 1432 | 0 0 26 3 2 #"on" 1433 | 0 0 22 3 1 #" " 1434 | 0 0 14 3 4 #"down" 1435 | 0 0 22 3 1 #" " 1436 | 0 0 26 3 3 #"key" 1437 | 0 0 22 29 1 #"\n" 1438 | 0 0 22 3 1 #" " 1439 | 0 0 26 3 4 #"move" 1440 | 0 0 22 3 1 #" " 1441 | 0 0 26 3 1 #"y" 1442 | 0 0 22 3 1 #" " 1443 | 0 0 26 3 2 #"by" 1444 | 0 0 22 3 1 #" " 1445 | 0 0 26 3 1 #"-" 1446 | 0 0 20 3 2 #"10" 1447 | 0 0 22 29 1 #"\n" 1448 | 0 0 22 3 1 #" " 1449 | 0 0 26 3 4 #"turn" 1450 | 0 0 22 3 1 #" " 1451 | 0 0 26 3 2 #"to" 1452 | 0 0 22 3 1 #" " 1453 | 0 0 20 3 3 #"180" 1454 | 0 0 22 29 1 #"\n" 1455 | 0 0 22 29 1 #"\n" 1456 | 0 0 26 3 2 #"on" 1457 | 0 0 22 3 1 #" " 1458 | 0 0 14 3 5 #"right" 1459 | 0 0 22 3 1 #" " 1460 | 0 0 26 3 3 #"key" 1461 | 0 0 22 29 1 #"\n" 1462 | 0 0 22 3 1 #" " 1463 | 0 0 26 3 4 #"move" 1464 | 0 0 22 3 1 #" " 1465 | 0 0 26 3 1 #"x" 1466 | 0 0 22 3 1 #" " 1467 | 0 0 26 3 2 #"by" 1468 | 0 0 22 3 1 #" " 1469 | 0 0 20 3 2 #"10" 1470 | 0 0 22 29 1 #"\n" 1471 | 0 0 22 3 1 #" " 1472 | 0 0 26 3 4 #"turn" 1473 | 0 0 22 3 1 #" " 1474 | 0 0 26 3 2 #"to" 1475 | 0 0 22 3 1 #" " 1476 | 0 0 20 3 2 #"90" 1477 | 0 0 22 29 1 #"\n" 1478 | 0 0 22 29 1 #"\n" 1479 | 0 0 26 3 2 #"on" 1480 | 0 0 22 3 1 #" " 1481 | 0 0 14 3 4 #"left" 1482 | 0 0 22 3 1 #" " 1483 | 0 0 26 3 3 #"key" 1484 | 0 0 22 29 1 #"\n" 1485 | 0 0 22 3 1 #" " 1486 | 0 0 26 3 4 #"move" 1487 | 0 0 22 3 1 #" " 1488 | 0 0 26 3 1 #"x" 1489 | 0 0 22 3 1 #" " 1490 | 0 0 26 3 2 #"by" 1491 | 0 0 22 3 1 #" " 1492 | 0 0 26 3 1 #"-" 1493 | 0 0 20 3 2 #"10" 1494 | 0 0 22 29 1 #"\n" 1495 | 0 0 22 3 1 #" " 1496 | 0 0 26 3 4 #"turn" 1497 | 0 0 22 3 1 #" " 1498 | 0 0 26 3 2 #"to" 1499 | 0 0 22 3 1 #" " 1500 | 0 0 20 3 3 #"270" 1501 | 0 0 22 29 1 #"\n" 1502 | 0 0 22 29 1 #"\n" 1503 | 0 0 26 3 2 #"on" 1504 | 0 0 22 3 1 #" " 1505 | 0 0 14 3 5 #"space" 1506 | 0 0 22 3 1 #" " 1507 | 0 0 26 3 3 #"key" 1508 | 0 0 22 3 1 #" " 1509 | 0 0 22 29 1 #"\n" 1510 | 0 0 22 3 1 #" " 1511 | 0 0 26 3 4 #"turn" 1512 | 0 0 22 3 1 #" " 1513 | 0 0 26 3 2 #"by" 1514 | 0 0 22 3 1 #" " 1515 | 0 0 20 3 2 #"10" 1516 | 0 0 22 29 1 #"\n" 1517 | 0 0 22 29 1 #"\n" 1518 | 0 0 26 3 2 #"on" 1519 | 0 0 22 3 1 #" " 1520 | 0 0 26 3 1 #"+" 1521 | 0 0 22 3 1 #" " 1522 | 0 0 26 3 3 #"key" 1523 | 0 0 22 3 1 #" " 1524 | 0 0 22 29 1 #"\n" 1525 | 0 0 22 3 1 #" " 1526 | 0 0 26 3 6 #"change" 1527 | 0 0 22 3 1 #" " 1528 | 0 0 26 3 4 #"size" 1529 | 0 0 22 3 1 #" " 1530 | 0 0 26 3 2 #"by" 1531 | 0 0 22 3 1 #" " 1532 | 0 0 20 3 3 #"0.1" 1533 | 0 0 22 29 1 #"\n" 1534 | 0 0 22 29 1 #"\n" 1535 | 0 0 26 3 2 #"on" 1536 | 0 0 22 3 1 #" " 1537 | 0 0 26 3 1 #"-" 1538 | 0 0 22 3 1 #" " 1539 | 0 0 26 3 3 #"key" 1540 | 0 0 22 29 1 #"\n" 1541 | 0 0 22 3 1 #" " 1542 | 0 0 26 3 6 #"change" 1543 | 0 0 22 3 1 #" " 1544 | 0 0 26 3 4 #"size" 1545 | 0 0 22 3 1 #" " 1546 | 0 0 26 3 2 #"by" 1547 | 0 0 22 3 1 #" " 1548 | 0 0 26 3 1 #"-" 1549 | 0 0 20 3 3 #"0.1" 1550 | 0 0 22 29 1 #"\n" 1551 | 0 0 22 29 1 #"\n" 1552 | 0 0 22 3 37 #"-------------------------------------" 1553 | 0 0 22 29 1 #"\n" 1554 | 0 0 14 3 5 #"fishy" 1555 | 0 0 22 29 1 #"\n" 1556 | 0 0 22 29 1 #"\n" 1557 | 0 0 26 3 5 #"image" 1558 | 0 0 22 3 1 #" " 1559 | 0 0 26 3 2 #"is" 1560 | 0 0 22 3 1 #" " 1561 | 0 2 23 26 1 #"\0" 1562 | 2 -1.0 -1.0 0.0 0.0 0 6 500 1563 | ( 1564 | #"\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\0P\0\0\0<\b" 1565 | #"\6\0\0\0\361'=\214\0\0\n\22IDATx\234\335\234k\214\234U\31" 1566 | #"\307\177\317\\vf\266\333\2134\200\265(6HQ*\245\335]\211EMI\374" 1567 | #"\200\375\6j\23\203D\233b r\251" 1568 | #"5\222\250\301\240\306\17\330\242\241\230\22" 1569 | #"@\202\37\214\26CMP\212\251\375 4*4\232n[\260\2556\322M\1i" 1570 | #"\r\322\226\226\335\235\235\353\343\207\363>" 1571 | #";g.\357t.\357\314\256\376\223\223" 1572 | #"w\346\235s\375\317\363\234\347\234\347\\" 1573 | #"DU\211\22\177\23\331\240\220[\t\277" 1574 | #"\242\205\314_\24\231\237\201\353\25V\t,\a>\254\360^ \3\244\203h\323@" 1575 | #"\268%p\254\f\307\4\16\245\341\245" 1576 | #"\25\252\23\2216\240MH\324\4\36\26" 1577 | #"\331\233\202\265\200\26\340\365\"<\3<" 1578 | #"\260R\365-\213sH\344\312\22\334*\260\16X\35\203D\f\260 ^\0P/" 1579 | #"\224\253CQaL`7\360\313a\325W#mL\v\350\t\201C\2606\203k" 1580 | #"p\36(\272\347\231i8^\202\264\3005I \16$p\244\305\251'\320G-" 1581 | #"\201\245\232Pp\357\367\305\340\247)\330" 1582 | #"\261B5\37i\303B\3203\2\207\200A\\c\377\3\234\303\221\222\bB2x" 1583 | #"\306\251\20)TH\204j\t\204\ny\212#\255\350=\2138\22\v\356\335\233\300" 1584 | #"\266$<\272Ru2\322\6\326\240\247" 1585 | #"\4\346\200\267\203\367\38\322\6\250'" 1586 | #"\320\236\355J\240\21g\237\v8\211\317" 1587 | #"\a\237\213p\6\330\232\206\207z%\221=!0\3k'q\r6\342RT\b" 1588 | #"4\362L\215k\311j\25&\211\1Y3\4\372D\6]\310A\205\333FU\17" 1589 | #"v\332\2560\310aX\265B\365P\24\231\275*\222\232\200\343eX:" 1590 | #"\200#-\205#\315\17I:'-\fJ=q\5\234\371\316\39g" 1591 | ) 500 1592 | ( 1593 | #"p~\234\206\373\243\224F9\f/\b\214_\255z[7\31\375E\344\2628<" 1594 | #"\235\2045F\\\232\n\201&\201\375@\1\327}\330s:\b9\240\b\177\212\301" 1595 | #"\27V\253\236\214\242\254\230\202d`\343" 1596 | #"\t\221\207;\315dL\344\246$\34\311" 1597 | #"\300\232y\300P\20\374\317\375\"\217\240" 1598 | #",+\177\320\253\307< \5\237Rx\345\200\310\215Q\224\25\3\247NC\260\351" 1599 | #"-\221{\333\315`L\344k\2\277N\303\202\f\365\344\rDQ\313\0161@\375" 1600 | #"\379\b\244a1\360\273\3\"wu[F\314\377\262\20\266N\210\254m)\245" 1601 | #"Hl\277\310\3668l\e\204\370\274\240" 1602 | #"\242\231\240\222\203\265\231\317\22bT\352cu\v$3.\260}L\344aD:" 1603 | #"\256j\302\377\" )x\36\221\1TKa\211\366\212$\346\303\223I\370R&" 1604 | #"\250\230\315\27328\313:\3270@\365" 1605 | #"\230\323\206LY\330t\0\206\216\213\334" 1606 | #"\276\276I\233\303P\307|\22bg\341xX\2021\221\344|\330\231\b\310\e\364" 1607 | #"\302<\346&y\2068\225~\321\227\3128l\\\6O\357\25I4K\337\b\r" 1608 | #"Ew\21\\>.\362P\355\373\275\"" 1609 | #"\t\201\247\222p\223\21f\25\312\20\375" 1610 | #"\320\244\27\20*\32\343\327\177\0>;\37v\354\24iK\6\32\22(\300\373`" 1611 | #"\363A\221O\373\357\27\300\3668|\316\n7\342\376W\3103\b3\306d\246_" 1612 | #"L\3IX\177\5lk'\257\320\3163\r\\\6{\306D>\0000&\362\203" 1613 | #"8\334\341\223\346\373\233\332E\256\303t" 1614 | #"Q\302\332`\332\224\6bp\367\230\310" 1615 | #"\375\255\346\321\324\372\\\4\361!8p" 1616 | #"@\344\353q\370\216/\372\335\220\ap\nx\247\213\364Q\3017~&\0341\370" 1617 | #"\336\1\221\r\255\244oJ`\34X\f\213\305M\201f\n\262\317\335" 1618 | #"@q3\375B\227\371D\201LM\30tZ\376\370A\2215\27J\333" 1619 | ) 500 1620 | ( 1621 | #"\224\300<\316/\224r\263\225\252>/\n\304\200\263\21\345\325-|u\16\4d" 1622 | #"\240\f\317\274,\262\264Y\272P\2\25" 1623 | #"\30\307\215\231|\311\213\212<\277\2S" 1624 | #"\21\347\331)|\355\n\346\361\227\26`" 1625 | #"\347\21\221\320\tU(\201o\342:\372" 1626 | #"\24\325\344\365\302\332\232\237\257\327\230\244" 1627 | #"\371\237\345\17qL\22\a`\3154|?,MC\2\317\341\274\310F\232\205^" 1628 | #"\r\222\23\300\351\36\345\r\256\237\335\17" 1629 | #"\354\2\236\5\306\b\357{\343T\vL`\231\277\271_d]\243\370u#\357\2" 1630 | #"\360\32\365\6\243\227\336\24\373\347'q" 1631 | #"\26>j\34\1~\17\34\16\276\177\24\327\360kC\342'qm\366\274\335\222\205" 1632 | #"'\377*r\315u\252U\377u\35\201" 1633 | #"o\340\304\262\326\247\327k\244\201Wq" 1634 | #"\353\232Q:!\246\201C\300\36\234\344\tp\22X\n\\E\370h\"\205#\257" 1635 | #"\214#\262\fKr\360\23\340\213~\274" 1636 | #"\252\272\276\3\234\307M\274\375\316\264\37" 1637 | #"\263\214\4\316\335\24\211\227\323\3039\340" 1638 | #"\357\300Q\334\302\362\24N\"\217\5\277" 1639 | #"\205A\2502&\244\2008\3342&\262\336\2177C`\0317\270\365\373\2754\375" 1640 | #"u\16,\3005*\312e\264\34n\250t\336{w\0367\6\275\320l(N\305" 1641 | #"\210\32\211\2\333\367\211\\dqf\b<\23|\261u\vK\320O\244p}\340" 1642 | #"k\364\307*\267\202\332\256,\t\227$" 1643 | #"\341G\366{\f\234\341\310z\221\215\361~#\201\e>\bN\e\242@\nx\17" 1644 | #"N\272\r\v\202w\255\266\261\201*o\330/\362\t\b\226a'\251gz6\374" 1645 | #"zq\234\364gp\303\232(Ty!\260\2\270\232\n\21\366}a\233\365\n\306" 1646 | #"\205\f\200\b<\262S$\236(\301\22" 1647 | #"\241\242\266\246\302\263\5\277\36'\200\217\320\235UN\3+\201\eq\226" 1648 | #"\27\3340f\25\355\315\347S8M\265\341M\21\256\275\0026&\4\312\266" 1649 | ) 500 1650 | ( 1651 | #"\352?\27`.\367$n.~\16\247n\335`\5\256\321\37\n\276_\211\223\300" 1652 | #"\b\220M\304\340\337%\270\312\326P\255\362\335z[:\205\277\303`\0X\24A" 1653 | #"\236I`\24'\315\346Lm\27\271\240" 1654 | #"N\336\372\362\336\21\325_\304\300Y\276i/R\0167\210\3547l7\227\355&" 1655 | #"\370 \321\216A\315\213\336.J8N<~J\2\367B0\23\261A\254I\240" 1656 | #"\251Q/\246U\255T4\v\\\312\354i\201\17\245\"\\\331\340\263\302C#\252" 1657 | #"c\340\365\317\213\274\310\276\250\366\23\5" 1658 | #"\234\345\215\343\b\234\v0\2154^\212" 1659 | #"\316\313\367]\373=\346\177X\32D\232" 1660 | #"\242\262\237\244\237\252<\5L\20\275\352" 1661 | #"v\212\"\25\36<\201\272sDu\306+V5B\230\217\ed\372\254\a\"\333" 1662 | #"s\224qc\277\271\246\272\331 \4v" 1663 | #"a\307\260\352\36?^\335\20\353\362\340Y\253\367\275F\36G\342\\Q]k\267" 1664 | #"\tS\1\376\231\206;j\343\325\21\30\a\226QM\236Y\237^\3424sGu" 1665 | #"k50\a\245\22lht\"\240\341V\206!\340b\234\203\301\337zk{K" 1666 | #"\242F\221\312\332\313l\243DEm-" 1667 | #"\224\341\301\217\251\276\324(~\350^\220" 1668 | #"\313\250H\240\221'\270\241M\324\273\256" 1669 | #"&\200K\"\316\263\23\224\251\220f\232W\202\335#p_X\232\246\\,\243\276" 1670 | #"3\315\22\255Q\311\343\f\327l\253\256\342\3326IEu\363p\"\a\267\242\32" 1671 | #"\352]kJ`\2x?\325\246\ve+\304H\354\6\202\353\373" 1673 | #"\346\202\325\255\355\363\246\335\177\373\371\325" 1674 | #"\252\373.\224\266)\201\357\2o\301\237" 1675 | #"\323\260N\341[\323\270\301\356\24\335\17oR\270!\323l\253\256O" 1676 | #"\334$3F\343\356a\325\347ZI\37J`\18\1o(\334\274B" 1677 | ) 500 1678 | ( 1679 | #"5?\254\372`\t\36\367\t\354F\22/fvUW\251n\207\365}e\330>" 1680 | #"\242\372X\253\3714$P\201\327!W" 1681 | #"\202\317\214\250\332a#\206\341\253%x" 1682 | #"\324/\324*\321n\237\330\366V\320\ba}\236\255\322Y\e\n\360\3100lj" 1683 | #"'\257\206\4\276\3z\26n^\255z\264\272d\325\21\270\253\4OX\301~\230" 1684 | #"+\vA\315P\246B\330\24\25\265-\301c\243pO+Gt}\324\21X\0" 1685 | #"\306\341\276Q\325\335\rS\250\352\273p" 1686 | #"g\21~\336\210\304\331\360#\266\212\22" 1687 | #"\365\365\r\310\373\3318\334\335.yP" 1688 | #"\243I%\340_\360\354\210\352\3\315\22\335\240Z\4\276<&rt\n~hg" 1689 | #"\326\354\20`\277v3\264\n\245\342\20" 1690 | #"5\343\27\214&\264\f\337\36Q\3352\334a\336U\22x\n\216\345a}X\344" 1691 | #"Z\214\250n)\303\346)(\232:X\230+*m\263\v\253\237\367,*\3343" 1692 | #"\242\272\245\233\374cV\310ix\373," 1693 | #"|\262\335\203x#\252\17\227\341\206," 1694 | #"\2342\303ba\202\376\271\303ja3" 1695 | #"\250\211 \370\177\354\264[\273\377\370\260" 1696 | #"\352#\335\226\23\23(OBv\n\326" 1697 | #"\372\26\267\35\214\252\276X\204\353\262\260" 1698 | #"\317\210\363\303$\375\335\312[\250)\337" 1699 | #"\227\276\234;lx\375p\340\222\357\26r\20\266\26\341\205P\243\321Vn\"/" 1700 | #"\303?J\260\274v\213\310l\34w\265~/x?\241\360\215ax\242\23c\21" 1701 | #"\206\204\302\266\321\210\216~\242\252q\221" 1702 | #"SC\260\334\324\331N\225\3332\245\177" 1703 | #"\340\332B7\a\256\213T\37\371\367\17" 1704 | #"\\\e\201%\370#p\373\250\352\261\16\213\nE\"\252s\263>\342\270{Kl" 1705 | #"\217\313\4\216\270<\25\362\354\350\177\334" 1706 | #"\v\276\333\254\321\255\35\376\215\35v" 1707 | #"\331\204m\202\264S\3535G\376\307\0056\217\252\356\212" 1708 | #"\272\215\206\236N\b28\227\330i\234s6O\353\227N" 1709 | ) 135 1710 | ( 1711 | #"4#p.]:\3213\2K8\311\v\256#a\210\231N\\s \255\\{" 1712 | #"\322\354\336\230f\327\236\244\373x\355IO\b,\342<9\246Je8\257\360[" 1713 | #"\205]y\370C\6\26\347/p\361N" 1714 | #"\355\24\311$\257\331\305;\243\377\17\27" 1715 | #"\357\274\"\362D\31\276Rr\273h\177" 1716 | #"\3<7\16\373\302\316\342\206\\\375\264" 1717 | #"\4\267\247\310\266\306\234\305\355@>9\327\256~\372/\v" 1718 | #"\210\336\243\346\367K?\0\0\0\0IEND\256B`\202" 1719 | ) 0 0 22 29 1 #"\n" 1720 | 0 0 22 29 1 #"\n" 1721 | 0 0 26 3 8 #"variable" 1722 | 0 0 22 3 1 #" " 1723 | 0 0 14 3 5 #"score" 1724 | 0 0 22 3 1 #" " 1725 | 0 0 26 3 2 #"is" 1726 | 0 0 22 3 1 #" " 1727 | 0 0 20 3 1 #"0" 1728 | 0 0 22 29 1 #"\n" 1729 | 0 0 22 29 1 #"\n" 1730 | 0 0 26 3 2 #"do" 1731 | 0 0 22 29 1 #"\n" 1732 | 0 0 22 3 1 #" " 1733 | 0 0 26 3 7 #"forever" 1734 | 0 0 22 3 2 #" {" 1735 | 0 0 22 29 1 #"\n" 1736 | 0 0 22 3 3 #" " 1737 | 0 0 26 3 4 #"wait" 1738 | 0 0 22 3 1 #" " 1739 | 0 0 20 3 4 #"0.02" 1740 | 0 0 22 29 1 #"\n" 1741 | 0 0 22 3 3 #" " 1742 | 0 0 26 3 7 #"forward" 1743 | 0 0 22 3 1 #" " 1744 | 0 0 26 3 2 #"by" 1745 | 0 0 22 3 1 #" " 1746 | 0 0 20 3 1 #"2" 1747 | 0 0 22 29 1 #"\n" 1748 | 0 0 22 3 3 #" " 1749 | 0 0 26 3 4 #"turn" 1750 | 0 0 22 3 1 #" " 1751 | 0 0 26 3 2 #"by" 1752 | 0 0 22 3 2 #" (" 1753 | 0 0 26 3 6 #"random" 1754 | 0 0 22 3 1 #" " 1755 | 0 0 20 3 1 #"5" 1756 | 0 0 22 3 2 #") " 1757 | 0 0 26 3 1 #"-" 1758 | 0 0 22 3 1 #" " 1759 | 0 0 20 3 1 #"2" 1760 | 0 0 22 29 1 #"\n" 1761 | 0 0 22 3 2 #" " 1762 | 0 0 22 29 1 #"\n" 1763 | 0 0 22 3 3 #" " 1764 | 0 0 26 3 2 #"if" 1765 | 0 0 22 3 1 #" " 1766 | 0 0 26 3 7 #"touches" 1767 | 0 0 22 3 1 #" " 1768 | 0 0 14 3 2 #"aq" 1769 | 0 0 22 3 2 #" {" 1770 | 0 0 22 29 1 #"\n" 1771 | 0 0 22 3 5 #" " 1772 | 0 0 14 3 5 #"score" 1773 | 0 0 22 3 1 #" " 1774 | 0 0 26 3 1 #"=" 1775 | 0 0 22 3 1 #" " 1776 | 0 0 20 3 1 #"1" 1777 | 0 0 22 3 1 #" " 1778 | 0 0 26 3 1 #"+" 1779 | 0 0 22 3 1 #" " 1780 | 0 0 14 3 5 #"score" 1781 | 0 0 22 29 1 #"\n" 1782 | 0 0 22 3 5 #" " 1783 | 0 0 26 3 3 #"say" 1784 | 0 0 22 3 1 #" " 1785 | 0 0 14 3 5 #"score" 1786 | 0 0 22 29 1 #"\n" 1787 | 0 0 22 3 4 #" }" 1788 | 0 0 22 29 1 #"\n" 1789 | 0 0 22 29 1 #"\n" 1790 | 0 0 22 3 3 #" " 1791 | 0 0 26 3 2 #"if" 1792 | 0 0 22 3 1 #" " 1793 | 0 0 26 3 7 #"touches" 1794 | 0 0 22 3 1 #" " 1795 | 0 0 14 3 4 #"duck" 1796 | 0 0 22 3 2 #" {" 1797 | 0 0 22 29 1 #"\n" 1798 | 0 0 22 3 5 #" " 1799 | 0 0 26 3 4 #"hush" 1800 | 0 0 22 29 1 #"\n" 1801 | 0 0 22 3 5 #" " 1802 | 0 0 26 3 4 #"turn" 1803 | 0 0 22 3 1 #" " 1804 | 0 0 26 3 2 #"by" 1805 | 0 0 22 3 1 #" " 1806 | 0 0 20 3 3 #"100" 1807 | 0 0 22 29 1 #"\n" 1808 | 0 0 22 3 5 #" " 1809 | 0 0 26 3 5 #"while" 1810 | 0 0 22 3 1 #" " 1811 | 0 0 26 3 7 #"touches" 1812 | 0 0 22 3 1 #" " 1813 | 0 0 14 3 4 #"duck" 1814 | 0 0 22 3 2 #" {" 1815 | 0 0 22 29 1 #"\n" 1816 | 0 0 22 3 6 #" }" 1817 | 0 0 22 29 1 #"\n" 1818 | 0 0 22 3 4 #" }" 1819 | 0 0 22 29 1 #"\n" 1820 | 0 0 22 3 2 #" }" 1821 | 0 0 22 29 1 #"\n" 1822 | 0 0 22 29 1 #"\n" 1823 | 0 0 26 3 2 #"do" 1824 | 0 0 22 29 1 #"\n" 1825 | 0 0 22 3 1 #" " 1826 | 0 0 26 3 7 #"forever" 1827 | 0 0 22 3 2 #" {" 1828 | 0 0 22 29 1 #"\n" 1829 | 0 0 22 3 2 #" " 1830 | 0 0 26 3 4 #"wait" 1831 | 0 0 22 3 1 #" " 1832 | 0 0 20 3 3 #"0.1" 1833 | 0 0 22 29 1 #"\n" 1834 | 0 0 22 3 2 #" " 1835 | 0 0 26 3 6 #"change" 1836 | 0 0 22 3 1 #" " 1837 | 0 0 26 3 4 #"size" 1838 | 0 0 22 3 1 #" " 1839 | 0 0 26 3 2 #"by" 1840 | 0 0 22 3 1 #" " 1841 | 0 0 20 3 4 #"0.05" 1842 | 0 0 22 29 1 #"\n" 1843 | 0 0 22 3 2 #" " 1844 | 0 0 26 3 4 #"wait" 1845 | 0 0 22 3 1 #" " 1846 | 0 0 20 3 3 #"0.1" 1847 | 0 0 22 29 1 #"\n" 1848 | 0 0 22 3 2 #" " 1849 | 0 0 26 3 6 #"change" 1850 | 0 0 22 3 1 #" " 1851 | 0 0 26 3 4 #"size" 1852 | 0 0 22 3 1 #" " 1853 | 0 0 26 3 2 #"by" 1854 | 0 0 22 3 1 #" " 1855 | 0 0 26 3 1 #"-" 1856 | 0 0 20 3 4 #"0.05" 1857 | 0 0 22 29 1 #"\n" 1858 | 0 0 22 3 2 #" }" 1859 | 0 0 22 29 1 #"\n" 1860 | 0 0 22 29 1 #"\n" 1861 | 0 0 22 3 40 #"----------------------------------------" 1862 | 0 0 22 29 1 #"\n" 1863 | 0 0 14 3 2 #"aq" 1864 | 0 0 22 29 1 #"\n" 1865 | 0 0 22 29 1 #"\n" 1866 | 0 0 26 3 5 #"image" 1867 | 0 0 22 3 1 #" " 1868 | 0 0 26 3 2 #"is" 1869 | 0 0 22 3 1 #" " 1870 | 0 2 17 26 1 #"\0" 1871 | 2 -1.0 -1.0 0.0 0.0 0 3 500 1872 | ( 1873 | #"\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\1,\0\0\1,\b" 1874 | #"\6\0\0\0y}\216u\0\0\3\362IDATx\234\355\324A\r\300 \0" 1875 | #"\300\3001\363\270\303\b\"\230\205\375H" 1876 | #"\223;\5}u\314\265\317\3\20\360\336" 1877 | #"\16\0\370\313\260\200\f\303\0022\f\v" 1878 | #"\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f" 1879 | #"\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022" 1880 | #"\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\2" 1881 | #"2\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303" 1882 | #"\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f" 1883 | #"\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200" 1884 | #"\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260" 1885 | #"\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303" 1886 | #"\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, " 1887 | #"\303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100," 1888 | #" \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100" 1889 | #", \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\310" 1890 | #"0, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v" 1891 | #"\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f" 1892 | #"\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022" 1893 | #"\f\v\3100, \303\260\200\f\303\0022\f\v\3100, " 1894 | #"\303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022" 1895 | ) 500 1896 | ( 1897 | #"\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\2" 1898 | #"2\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303" 1899 | #"\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f" 1900 | #"\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200" 1901 | #"\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260" 1902 | #"\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303" 1903 | #"\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, " 1904 | #"\303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100," 1905 | #" \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100" 1906 | #", \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\310" 1907 | #"0, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v" 1908 | #"\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f" 1909 | #"\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022" 1910 | #"\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\2" 1911 | #"2\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303" 1912 | #"\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200\f" 1913 | #"\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260\200" 1914 | #"\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303\260" 1915 | #"\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, \303" 1916 | #"\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100, " 1917 | ) 67 1918 | ( 1919 | #"\303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022\f\v\3100," 1920 | #" \303\260\200\f\303\0022\f\v\3100, \303\260\200\f\303\0022" 1921 | #">\325`\5\227\237&\\\225\0\0\0\0IEND\256B`\202" 1922 | ) 0 0 22 29 1 #"\n" 1923 | 0 0 1924 | -------------------------------------------------------------------------------- /scratchy/examples/just-fish.rkt: -------------------------------------------------------------------------------- 1 | #reader(lib"read.ss""wxme")WXME0108 ## 2 | #| 3 | This file uses the GRacket editor format. 4 | Open this file in DrRacket version 5.3.1.2 or later to read it. 5 | 6 | Most likely, it was created by saving a program in DrRacket, 7 | and it probably contains a program with non-text elements 8 | (such as images or comment boxes). 9 | 10 | http://racket-lang.org/ 11 | |# 12 | 29 7 #"wxtext\0" 13 | 3 1 6 #"wxtab\0" 14 | 1 1 8 #"wximage\0" 15 | 2 0 8 #"wxmedia\0" 16 | 4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0" 17 | 1 0 16 #"drscheme:number\0" 18 | 3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0" 19 | 1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0" 20 | 1 0 93 21 | ( 22 | #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni" 23 | #"pclass-wxme.ss\" \"framework\"))\0" 24 | ) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0" 25 | 0 0 19 #"drscheme:sexp-snip\0" 26 | 0 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0" 27 | 1 0 68 28 | ( 29 | #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr" 30 | #"lib\"))\0" 31 | ) 1 0 29 #"drscheme:bindings-snipclass%\0" 32 | 1 0 88 33 | ( 34 | #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r" 35 | #"kt\" \"drracket\" \"private\"))\0" 36 | ) 0 0 33 #"(lib \"bullet-snip.ss\" \"browser\")\0" 37 | 0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0" 38 | 1 0 22 #"drscheme:lambda-snip%\0" 39 | 1 0 57 40 | #"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0" 41 | 1 0 26 #"drscheme:pict-value-snip%\0" 42 | 0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0" 43 | 1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0" 44 | 2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0" 45 | 1 0 18 #"drscheme:xml-snip\0" 46 | 1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0" 47 | 1 0 21 #"drscheme:scheme-snip\0" 48 | 2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0" 49 | 1 0 10 #"text-box%\0" 50 | 1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0" 51 | 1 0 1 6 #"wxloc\0" 52 | 0 0 97 0 1 #"\0" 53 | 0 75 1 #"\0" 54 | 0 12 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9 55 | #"Standard\0" 56 | 0 75 7 #"Monaco\0" 57 | 0 11 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1 58 | #"\0" 59 | 0 -1 1 #"\0" 60 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24 61 | #"framework:default-color\0" 62 | 0 -1 1 #"\0" 63 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 64 | #"\0" 65 | 0 -1 1 #"\0" 66 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15 67 | #"text:ports out\0" 68 | 0 -1 1 #"\0" 69 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 1 70 | #"\0" 71 | 0 -1 1 #"\0" 72 | 1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 73 | -1 2 15 #"text:ports err\0" 74 | 0 -1 1 #"\0" 75 | 1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 76 | -1 2 1 #"\0" 77 | 0 -1 1 #"\0" 78 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17 79 | #"text:ports value\0" 80 | 0 -1 1 #"\0" 81 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 1 82 | #"\0" 83 | 0 -1 1 #"\0" 84 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 85 | -1 2 27 #"Matching Parenthesis Style\0" 86 | 0 -1 1 #"\0" 87 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 88 | -1 2 1 #"\0" 89 | 0 -1 1 #"\0" 90 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37 91 | #"framework:syntax-color:scheme:symbol\0" 92 | 0 -1 1 #"\0" 93 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 38 94 | #"framework:syntax-color:scheme:keyword\0" 95 | 0 -1 1 #"\0" 96 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 1 97 | #"\0" 98 | 0 -1 1 #"\0" 99 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 100 | 38 #"framework:syntax-color:scheme:comment\0" 101 | 0 -1 1 #"\0" 102 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 1 103 | #"\0" 104 | 0 -1 1 #"\0" 105 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37 106 | #"framework:syntax-color:scheme:string\0" 107 | 0 -1 1 #"\0" 108 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 39 109 | #"framework:syntax-color:scheme:constant\0" 110 | 0 -1 1 #"\0" 111 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 1 112 | #"\0" 113 | 0 -1 1 #"\0" 114 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 42 115 | #"framework:syntax-color:scheme:parenthesis\0" 116 | 0 -1 1 #"\0" 117 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 1 118 | #"\0" 119 | 0 -1 1 #"\0" 120 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 121 | #"framework:syntax-color:scheme:error\0" 122 | 0 -1 1 #"\0" 123 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 124 | #"\0" 125 | 0 -1 1 #"\0" 126 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36 127 | #"framework:syntax-color:scheme:other\0" 128 | 0 -1 1 #"\0" 129 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 16 130 | #"Misspelled Text\0" 131 | 0 -1 1 #"\0" 132 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 133 | #"\0" 134 | 0 -1 1 #"\0" 135 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 136 | 38 #"drracket:check-syntax:lexically-bound\0" 137 | 0 -1 1 #"\0" 138 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 1 139 | #"\0" 140 | 0 -1 1 #"\0" 141 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28 142 | #"drracket:check-syntax:set!d\0" 143 | 0 -1 1 #"\0" 144 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 37 145 | #"drracket:check-syntax:unused-require\0" 146 | 0 -1 1 #"\0" 147 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 148 | #"drracket:check-syntax:free-variable\0" 149 | 0 -1 1 #"\0" 150 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 151 | #"\0" 152 | 0 -1 1 #"\0" 153 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31 154 | #"drracket:check-syntax:imported\0" 155 | 0 -1 1 #"\0" 156 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 47 157 | #"drracket:check-syntax:my-obligation-style-pref\0" 158 | 0 -1 1 #"\0" 159 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 1 160 | #"\0" 161 | 0 -1 1 #"\0" 162 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50 163 | #"drracket:check-syntax:their-obligation-style-pref\0" 164 | 0 -1 1 #"\0" 165 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 48 166 | #"drracket:check-syntax:unk-obligation-style-pref\0" 167 | 0 -1 1 #"\0" 168 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 169 | #"\0" 170 | 0 -1 1 #"\0" 171 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 172 | 49 #"drracket:check-syntax:both-obligation-style-pref\0" 173 | 0 -1 1 #"\0" 174 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 175 | 26 #"plt:htdp:test-coverage-on\0" 176 | 0 -1 1 #"\0" 177 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 178 | #"\0" 179 | 0 -1 1 #"\0" 180 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 27 181 | #"plt:htdp:test-coverage-off\0" 182 | 0 -1 1 #"\0" 183 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 4 1 184 | #"\0" 185 | 0 70 1 #"\0" 186 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 187 | -1 -1 4 4 #"XML\0" 188 | 0 70 1 #"\0" 189 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 190 | -1 -1 2 1 #"\0" 191 | 0 -1 1 #"\0" 192 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 139 34 0 0 0 -1 -1 2 37 193 | #"plt:module-language:test-coverage-on\0" 194 | 0 -1 1 #"\0" 195 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 139 34 0 0 0 -1 -1 2 1 196 | #"\0" 197 | 0 -1 1 #"\0" 198 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 176 48 96 0 0 0 -1 -1 2 38 199 | #"plt:module-language:test-coverage-off\0" 200 | 0 -1 1 #"\0" 201 | 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 176 48 96 0 0 0 -1 -1 0 1 202 | #"\0" 203 | 0 75 7 #"Monaco\0" 204 | 0.0 11 90 -1 90 -1 3 -1 0 1 0 1 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 205 | 255 255 1 -1 0 1 #"\0" 206 | 0 75 7 #"Monaco\0" 207 | 0.0 18 90 -1 90 -1 3 -1 0 1 0 1 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 208 | 255 255 1 -1 4 1 #"\0" 209 | 0 71 1 #"\0" 210 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 211 | -1 -1 4 1 #"\0" 212 | 0 -1 1 #"\0" 213 | 1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 255 0 0 214 | 0 -1 -1 4 1 #"\0" 215 | 0 71 1 #"\0" 216 | 1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 255 0 0 217 | 0 -1 -1 4 1 #"\0" 218 | 0 71 1 #"\0" 219 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 100 0 0 0 220 | 0 -1 -1 4 1 #"\0" 221 | 0 -1 1 #"\0" 222 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 223 | 255 0 -1 -1 2 1 #"\0" 224 | 0 -1 1 #"\0" 225 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 200 0 0 0 0 226 | 0 -1 -1 22 1 #"\0" 227 | 0 -1 1 #"\0" 228 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 229 | 255 0 -1 -1 14 1 #"\0" 230 | 0 -1 1 #"\0" 231 | 1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 232 | 255 0 -1 -1 4 32 #"widget.rkt::browser-text% basic\0" 233 | 0 70 1 #"\0" 234 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 235 | -1 -1 4 59 236 | #"macro-debugger/syntax-browser/properties color-text% basic\0" 237 | 0 70 1 #"\0" 238 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 239 | -1 -1 62 1 #"\0" 240 | 0 -1 1 #"\0" 241 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 190 190 190 242 | 0 0 0 -1 -1 4 1 #"\0" 243 | 0 -1 1 #"\0" 244 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 0 0 0 0 245 | -1 -1 4 1 #"\0" 246 | 0 -1 1 #"\0" 247 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 255 0 0 0 0 248 | 0 -1 -1 4 1 #"\0" 249 | 0 -1 1 #"\0" 250 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 255 0 0 251 | 0 -1 -1 4 1 #"\0" 252 | 0 -1 1 #"\0" 253 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 107 142 35 0 254 | 0 0 -1 -1 4 1 #"\0" 255 | 0 -1 1 #"\0" 256 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 100 0 0 0 257 | 0 -1 -1 4 1 #"\0" 258 | 0 -1 1 #"\0" 259 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 139 0 0 0 0 260 | 0 -1 -1 4 1 #"\0" 261 | 0 -1 1 #"\0" 262 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 100 149 237 263 | 0 0 0 -1 -1 4 1 #"\0" 264 | 0 -1 1 #"\0" 265 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 65 105 225 0 266 | 0 0 -1 -1 4 1 #"\0" 267 | 0 -1 1 #"\0" 268 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 70 130 180 0 269 | 0 0 -1 -1 4 1 #"\0" 270 | 0 -1 1 #"\0" 271 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 47 79 79 0 0 272 | 0 -1 -1 4 1 #"\0" 273 | 0 -1 1 #"\0" 274 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 139 0 0 275 | 0 -1 -1 4 1 #"\0" 276 | 0 -1 1 #"\0" 277 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 75 0 130 0 0 278 | 0 -1 -1 4 1 #"\0" 279 | 0 -1 1 #"\0" 280 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 160 32 240 0 281 | 0 0 -1 -1 4 1 #"\0" 282 | 0 -1 1 #"\0" 283 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 255 165 0 0 284 | 0 0 -1 -1 4 1 #"\0" 285 | 0 -1 1 #"\0" 286 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 250 128 114 287 | 0 0 0 -1 -1 4 1 #"\0" 288 | 0 -1 1 #"\0" 289 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 184 134 11 0 290 | 0 0 -1 -1 4 1 #"\0" 291 | 0 -1 1 #"\0" 292 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 128 128 0 0 293 | 0 0 -1 -1 4 1 #"\0" 294 | 0 -1 1 #"\0" 295 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 169 169 169 296 | 0 0 0 -1 -1 4 1 #"\0" 297 | 0 -1 1 #"\0" 298 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 255 299 | 228 225 -1 -1 4 1 #"\0" 300 | 0 -1 1 #"\0" 301 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 224 302 | 255 255 -1 -1 4 1 #"\0" 303 | 0 -1 1 #"\0" 304 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 255 0 0 224 305 | 255 255 -1 -1 61 1 #"\0" 306 | 0 -1 1 #"\0" 307 | 1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 255 0 0 0 0 308 | 0 -1 -1 4 1 #"\0" 309 | 0 -1 1 #"\0" 310 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 0 0 255 255 311 | 228 225 -1 -1 4 1 #"\0" 312 | 0 -1 1 #"\0" 313 | 1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0.0 0.0 0.0 1.0 1.0 1.0 0 0 0 0 0 0 314 | -1 -1 4 1 #"\0" 315 | 0 -1 1 #"\0" 316 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 75 0 130 255 317 | 228 225 -1 -1 4 1 #"\0" 318 | 0 -1 1 #"\0" 319 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 160 32 240 320 | 255 228 225 -1 -1 4 1 #"\0" 321 | 0 -1 1 #"\0" 322 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 255 165 0 323 | 255 228 225 -1 -1 4 1 #"\0" 324 | 0 -1 1 #"\0" 325 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 70 130 180 326 | 255 228 225 -1 -1 4 1 #"\0" 327 | 0 -1 1 #"\0" 328 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 47 79 79 255 329 | 228 225 -1 -1 4 1 #"\0" 330 | 0 -1 1 #"\0" 331 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 70 130 180 332 | 224 255 255 -1 -1 4 1 #"\0" 333 | 0 -1 1 #"\0" 334 | 1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 0.0 47 79 79 224 335 | 255 255 -1 -1 0 1 #"\0" 336 | 0 -1 1 #"\0" 337 | 0.0 13 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 338 | -1 -1 2 1 #"\0" 339 | 0 -1 1 #"\0" 340 | 0.0 13 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 341 | -1 -1 0 48 0 26 3 14 #"#lang scratchy" 342 | 0 0 22 29 1 #"\n" 343 | 0 0 22 29 1 #"\n" 344 | 0 0 22 3 37 #"-------------------------------------" 345 | 0 0 22 29 1 #"\n" 346 | 0 0 14 3 4 #"fish" 347 | 0 0 22 29 1 #"\n" 348 | 0 0 22 29 1 #"\n" 349 | 0 0 26 3 5 #"image" 350 | 0 0 22 3 1 #" " 351 | 0 0 26 3 2 #"is" 352 | 0 0 22 3 1 #" " 353 | 0 2 23 26 1 #"\0" 354 | 2 -1.0 -1.0 0.0 0.0 0 6 500 355 | ( 356 | #"\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\0P\0\0\0<\b" 357 | #"\6\0\0\0\361'=\214\0\0\n\22IDATx\234\335\234k\214\234U\31" 358 | #"\307\177\317\\vf\266\333\2134\200\265(6HQ*\245\335]\211EMI\374" 359 | #"\200\375\6j\23\203D\233b r\251" 360 | #"5\222\250\301\240\306\17\330\242\241\230\22" 361 | #"@\202\37\214\26CMP\212\251\375 4*4\232n[\260\2556\322M\1i" 362 | #"\r\322\226\226\335\235\235\353\343\207\363>" 363 | #";g.\357t.\357\314\256\376\223\223" 364 | #"w\346\235s\375\317\363\234\347\234\347\\" 365 | #"DU\211\22\177\23\331\240\220[\t\277" 366 | #"\242\205\314_\24\231\237\201\353\25V\t,\a>\254\360^ \3\244\203h\323@" 367 | #"\268%p\254\f\307\4\16\245\341\245" 368 | #"\25\252\23\2216\240MH\324\4\36\26" 369 | #"\331\233\202\265\200\26\340\365\"<\3<" 370 | #"\260R\365-\213sH\344\312\22\334*\260\16X\35\203D\f\260 ^\0P/" 371 | #"\224\253CQaL`7\360\313a\325W#mL\v\350\t\201C\2606\203k" 372 | #"p\36(\272\347\231i8^\202\264\3005I \16$p\244\305\251'\320G-" 373 | #"\201\245\232Pp\357\367\305\340\247)\330" 374 | #"\261B5\37i\303B\3203\2\207\200A\\c\377\3\234\303\221\222\bB2x" 375 | #"\306\251\20)TH\204j\t\204\ny\212#\255\350=\2138\22\v\356\335\233\300" 376 | #"\266$<\272Ru2\322\6\326\240\247" 377 | #"\4\346\200\267\203\367\38\322\6\250'" 378 | #"\320\236\355J\240\21g\237\v8\211\317" 379 | #"\a\237\213p\6\330\232\206\207z%\221=!0\3k'q\r6\342RT\b" 380 | #"4\362L\215k\311j\25&\211\1Y3\4\372D\6]\310A\205\333FU\17" 381 | #"v\332\2560\310aX\265B\365P\24\231\275*\222\232\200\343eX:" 382 | #"\200#-\205#\315\17I:'-\fJ=q\5\234\371\316\39g" 383 | ) 500 384 | ( 385 | #"p~\234\206\373\243\224F9\f/\b\214_\255z[7\31\375E\344\2628<" 386 | #"\235\2045F\\\232\n\201&\201\375@\1\327}\330s:\b9\240\b\177\212\301" 387 | #"\27V\253\236\214\242\254\230\202d`\343" 388 | #"\t\221\207;\315dL\344\246$\34\311" 389 | #"\300\232y\300P\20\374\317\375\"\217\240" 390 | #",+\177\320\253\307< \5\237Rx\345\200\310\215Q\224\25\3\247NC\260\351" 391 | #"-\221{\333\315`L\344k\2\277N\303\202\f\365\344\rDQ\313\0161@\375" 392 | #"\379\b\244a1\360\273\3\"wu[F\314\377\262\20\266N\210\254m)\245" 393 | #"Hl\277\310\3668l\e\204\370\274\240" 394 | #"\242\231\240\222\203\265\231\317\22bT\352cu\v$3.\260}L\344aD:" 395 | #"\256j\302\377\" )x\36\221\1TKa\211\366\212$\346\303\223I\370R&" 396 | #"\250\230\315\27328\313:\3270@\365" 397 | #"\230\323\206LY\330t\0\206\216\213\334" 398 | #"\276\276I\233\303P\307|\22bg\341xX\2021\221\344|\330\231\b\310\e\364" 399 | #"\302<\346&y\2068\225~\321\227\3128l\\\6O\357\25I4K\337\b\r" 400 | #"Ew\21\\>.\362P\355\373\275\"" 401 | #"\t\201\247\222p\223\21f\25\312\20\375" 402 | #"\320\244\27\20*\32\343\327\177\0>;\37v\354\24iK\6\32\22(\300\373`" 403 | #"\363A\221O\373\357\27\300\3668|\316\n7\342\376W\3103\b3\306d\246_" 404 | #"L\3IX\177\5lk'\257\320\3163\r\\\6{\306D>\0000&\362\203" 405 | #"8\334\341\223\346\373\233\332E\256\303t" 406 | #"Q\302\332`\332\224\6bp\367\230\310" 407 | #"\375\255\346\321\324\372\\\4\361!8p" 408 | #"@\344\353q\370\216/\372\335\220\ap\nx\247\213\364Q\3017~&\0341\370" 409 | #"\336\1\221\r\255\244oJ`\34X\f\213\305M\201f\n\262\317\335" 410 | #"@q3\375B\227\371D\201LM\30tZ\376\370A\2215\27J\333" 411 | ) 500 412 | ( 413 | #"\224\300<\316/\224r\263\225\252>/\n\304\200\263\21\345\325-|u\16\4d" 414 | #"\240\f\317\274,\262\264Y\272P\2\25" 415 | #"\30\307\215\231|\311\213\212<\277\2S" 416 | #"\21\347\331)|\355\n\346\361\227\26`" 417 | #"\347\21\221\320\tU(\201o\342:\372" 418 | #"\24\325\344\365\302\332\232\237\257\327\230\244" 419 | #"\371\237\345\17qL\22\a`\3154|?,MC\2\317\341\274\310F\232\205^" 420 | #"\r\222\23\300\351\36\345\r\256\237\335\17" 421 | #"\354\2\236\5\306\b\357{\343T\vL`\231\277\271_d]\243\370u#\357\2" 422 | #"\360\32\365\6\243\227\336\24\373\347'q" 423 | #"\26>j\34\1~\17\34\16\276\177\24\327\360kC\342'qm\366\274\335\222\205" 424 | #"'\377*r\315u\252U\377u\35\201" 425 | #"o\340\304\262\326\247\327k\244\201Wq" 426 | #"\353\232Q:!\246\201C\300\36\234\344\tp\22X\n\\E\370h\"\205#\257" 427 | #"\214#\262\fKr\360\23\340\213~\274" 428 | #"\252\272\276\3\234\307M\274\375\316\264\37" 429 | #"\263\214\4\316\335\24\211\227\323\3039\340" 430 | #"\357\300Q\334\302\362\24N\"\217\5\277" 431 | #"\205A\2502&\244\2008\3342&\262\336\2177C`\0317\270\365\373\2754\375" 432 | #"u\16,\3005*\312e\264\34n\250t\336{w\0367\6\275\320l(N\305" 433 | #"\210\32\211\2\333\367\211\\dqf\b<\23|\261u\vK\320O\244p}\340" 434 | #"k\364\307*\267\202\332\256,\t\227$" 435 | #"\341G\366{\f\234\341\310z\221\215\361~#\201\e>\bN\e\242@\nx\17" 436 | #"N\272\r\v\202w\255\266\261\201*o\330/\362\t\b\226a'\251gz6\374" 437 | #"zq\234\364gp\303\232(Ty!\260\2\270\232\n\21\366}a\233\365\n\306" 438 | #"\205\f\200\b<\262S$\236(\301\22" 439 | #"\241\242\266\246\302\263\5\277\36'\200\217\320\235UN\3+\201\eq\226" 440 | #"\27\3340f\25\355\315\347S8M\265\341M\21\256\275\0026&\4\312\266" 441 | ) 500 442 | ( 443 | #"\352?\27`.\367$n.~\16\247n\335`\5\256\321\37\n\276_\211\223\300" 444 | #"\b\220M\304\340\337%\270\312\326P\255\362\335z[:\205\277\303`\0X\24A" 445 | #"\236I`\24'\315\346Lm\27\271\240" 446 | #"N\336\372\362\336\21\325_\304\300Y\276i/R\0167\210\3547l7\227\355&" 447 | #"\370 \321\216A\315\213\336.J8N<~J\2\367B0\23\261A\254I\240" 448 | #"\251Q/\246U\255T4\v\\\312\354i\201\17\245\"\\\331\340\263\302C#\252" 449 | #"c\340\365\317\213\274\310\276\250\366\23\5" 450 | #"\234\345\215\343\b\234\v0\2154^\212" 451 | #"\316\313\367]\373=\346\177X\32D\232" 452 | #"\242\262\237\244\237\252<\5L\20\275\352" 453 | #"v\212\"\25\36<\201\272sDu\306+V5B\230\217\ed\372\254\a\"\333" 454 | #"s\224qc\277\271\246\272\331 \4v" 455 | #"a\307\260\352\36?^\335\20\353\362\340Y\253\367\275F\36G\342\\Q]k\267" 456 | #"\tS\1\376\231\206;j\343\325\21\30\a\226QM\236Y\237^\3424sGu" 457 | #"k50\a\245\22lht\"\240\341V\206!\340b\234\203\301\337zk{K" 458 | #"\242F\221\312\332\313l\243DEm-" 459 | #"\224\341\301\217\251\276\324(~\350^\220" 460 | #"\313\250H\240\221'\270\241M\324\273\256" 461 | #"&\200K\"\316\263\23\224\251\220f\232W\202\335#p_X\232\246\\,\243\276" 462 | #"3\315\22\255Q\311\343\f\327l\253\256\342\3326IEu\363p\"\a\267\242\32" 463 | #"\352]kJ`\2x?\325\246\ve+\304H\354\6\202\353\373" 465 | #"\346\202\325\255\355\363\246\335\177\373\371\325" 466 | #"\252\373.\224\266)\201\357\2o\301\237" 467 | #"\323\260N\341[\323\270\301\356\24\335\17oR\270!\323l\253\256O" 468 | #"\334$3F\343\356a\325\347ZI\37J`\18\1o(\334\274B" 469 | ) 500 470 | ( 471 | #"5?\254\372`\t\36\367\t\354F\22/fvUW\251n\207\365}e\330>" 472 | #"\242\372X\253\3714$P\201\327!W" 473 | #"\202\317\214\250\332a#\206\341\253%x" 474 | #"\324/\324*\321n\237\330\366V\320\ba}\236\255\322Y\e\n\360\3100lj" 475 | #"'\257\206\4\276\3z\26n^\255z\264\272d\325\21\270\253\4OX\301~\230" 476 | #"+\vA\315P\246B\330\24\25\265-\301c\243pO+Gt}\324\21X\0" 477 | #"\306\341\276Q\325\335\rS\250\352\273p" 478 | #"g\21~\336\210\304\331\360#\266\212\22" 479 | #"\365\365\r\310\373\3318\334\335.yP" 480 | #"\243I%\340_\360\354\210\352\3\315\22\335\240Z\4\276<&rt\n~hg" 481 | #"\326\354\20`\277v3\264\n\245\342\20" 482 | #"5\343\27\214&\264\f\337\36Q\3352\334a\336U\22x\n\216\345a}X\344" 483 | #"Z\214\250n)\303\346)(\232:X\230+*m\263\v\253\237\367,*\3343" 484 | #"\242\272\245\233\374cV\310ix\373," 485 | #"|\262\335\203x#\252\17\227\341\206," 486 | #"\2342\303ba\202\376\271\303ja3" 487 | #"\250\211 \370\177\354\264[\273\377\370\260" 488 | #"\352#\335\226\23\23(OBv\n\326" 489 | #"\372\26\267\35\214\252\276X\204\353\262\260" 490 | #"\317\210\363\303$\375\335\312[\250)\337" 491 | #"\227\276\234;lx\375p\340\222\357\26r\20\266\26\341\205P\243\321Vn\"/" 492 | #"\303?J\260\274v\213\310l\34w\265~/x?\241\360\215ax\242\23c\21" 493 | #"\206\204\302\266\321\210\216~\242\252q\221" 494 | #"SC\260\334\324\331N\225\3332\245\177" 495 | #"\340\332B7\a\256\213T\37\371\367\17" 496 | #"\\\e\201%\370#p\373\250\352\261\16\213\nE\"\252s\263>\342\270{Kl" 497 | #"\217\313\4\216\270<\25\362\354\350\177\334" 498 | #"\v\276\333\254\321\255\35\376\215\35v" 499 | #"\331\204m\202\264S\3535G\376\307\0056\217\252\356\212" 500 | #"\272\215\206\236N\b28\227\330i\234s6O\353\227N" 501 | ) 135 502 | ( 503 | #"4#p.]:\3213\2K8\311\v\256#a\210\231N\\s \255\\{" 504 | #"\322\354\336\230f\327\236\244\373x\355IO\b,\342<9\246Je8\257\360[" 505 | #"\205]y\370C\6\26\347/p\361N" 506 | #"\355\24\311$\257\331\305;\243\377\17\27" 507 | #"\357\274\"\362D\31\276Rr\273h\177" 508 | #"\3<7\16\373\302\316\342\206\\\375\264" 509 | #"\4\267\247\310\266\306\234\305\355@>9\327\256~\372/\v" 510 | #"\210\336\243\346\367K?\0\0\0\0IEND\256B`\202" 511 | ) 0 0 22 29 1 #"\n" 512 | 0 0 22 29 1 #"\n" 513 | 0 0 26 3 2 #"do" 514 | 0 0 22 29 1 #"\n" 515 | 0 0 22 3 1 #" " 516 | 0 0 26 3 7 #"forever" 517 | 0 0 22 3 2 #" {" 518 | 0 0 22 29 1 #"\n" 519 | 0 0 22 3 3 #" " 520 | 0 0 26 3 4 #"wait" 521 | 0 0 22 3 1 #" " 522 | 0 0 20 3 4 #"0.02" 523 | 0 0 22 29 1 #"\n" 524 | 0 0 22 3 3 #" " 525 | 0 0 26 3 7 #"forward" 526 | 0 0 22 3 1 #" " 527 | 0 0 26 3 2 #"by" 528 | 0 0 22 3 1 #" " 529 | 0 0 20 3 1 #"2" 530 | 0 0 22 29 1 #"\n" 531 | 0 0 22 3 3 #" " 532 | 0 0 26 3 4 #"turn" 533 | 0 0 22 3 1 #" " 534 | 0 0 26 3 2 #"by" 535 | 0 0 22 3 2 #" (" 536 | 0 0 26 3 6 #"random" 537 | 0 0 22 3 1 #" " 538 | 0 0 20 3 1 #"5" 539 | 0 0 22 3 2 #") " 540 | 0 0 26 3 1 #"-" 541 | 0 0 22 3 1 #" " 542 | 0 0 20 3 1 #"2" 543 | 0 0 22 29 1 #"\n" 544 | 0 0 22 3 2 #" }" 545 | 0 0 22 29 1 #"\n" 546 | 0 0 547 | -------------------------------------------------------------------------------- /scratchy/examples/other.rkt: -------------------------------------------------------------------------------- 1 | #lang scratchy 2 | 3 | use @fish-text 4 | 5 | ---------------------------------- 6 | fish2 7 | 8 | image is @fish-image 9 | 10 | on "go" message 11 | change size +1 12 | wait 5 13 | watch @fish-text 14 | -------------------------------------------------------------------------------- /scratchy/images.rkt: -------------------------------------------------------------------------------- 1 | #lang racket/base 2 | (require racket/draw 3 | slideshow/pict 4 | racket/runtime-path) 5 | 6 | (provide duck-image 7 | fish-image 8 | aq-image) 9 | 10 | (define-runtime-path duck-png "duck.png") 11 | 12 | (define duck-image (read-bitmap duck-png)) 13 | 14 | (define fish-image 15 | (standard-fish #:direction 'right #:color "red" 80 60)) 16 | 17 | (define aq-image 18 | (colorize (filled-rectangle 300 300) "skyblue")) 19 | -------------------------------------------------------------------------------- /scratchy/info.rkt: -------------------------------------------------------------------------------- 1 | #lang setup/infotab 2 | 3 | (define compile-omit-files '("examples")) 4 | 5 | (define scribblings (list (list "scratchy.scrbl" '(multi-page) '(gui-library)))) 6 | -------------------------------------------------------------------------------- /scratchy/main.rkt: -------------------------------------------------------------------------------- 1 | #lang racket/base 2 | (require "scratchy.rkt") 3 | 4 | (provide (all-from-out "scratchy.rkt")) 5 | 6 | (module reader racket/base 7 | (require "reader.rkt") 8 | (provide (all-from-out "reader.rkt"))) 9 | -------------------------------------------------------------------------------- /scratchy/parser.rkt: -------------------------------------------------------------------------------- 1 | #lang racket/base 2 | (require parser-tools/lex 3 | (prefix-in : parser-tools/lex-sre) 4 | algol60/cfg-parser 5 | syntax/readerr 6 | (for-syntax racket/base)) 7 | 8 | (provide lex 9 | parse 10 | token->string) 11 | 12 | (define (parse src-name in) 13 | (parameterize ([current-source src-name]) 14 | (parse-from-lex (lambda () (lex in))))) 15 | 16 | ;; ---------------------------------------- 17 | ;; Lexer 18 | 19 | (define-tokens content-tokens 20 | (ID NUM BINOP BINKEYOP UNBINKEYOP 21 | STRING SPECIAL ERROR)) 22 | 23 | (define-empty-tokens delim-tokens 24 | (EOF SEP IS OPEN CLOSE POPEN PCLOSE ASSIGN 25 | PLUS MINUS TIMES DIVIDE 26 | IMAGE MOVE X Y CHANGE SIZE 27 | TURN TO BY ON KEY MESSAGE SEND EVERYONE SAY HUSH 28 | HIDE SHOW 29 | DO FOREVER FORWARD IF WHILE WAIT 30 | WATCH 31 | RANDOM VARIABLE TOUCHES DIRECTION 32 | USE WHITESPACE)) 33 | 34 | (define lex 35 | (lexer-src-pos 36 | [(:seq "@" (:+ (:or #\- #\_ #\? (:/ #\A #\Z #\a #\z #\0 #\9)))) 37 | (token-ID (string->symbol (substring lexeme 1)))] 38 | [(:or (:seq (:+ (:/ "0" "9")) (:? ".") (:* (:/ "0" "9"))) 39 | (:seq "." (:* (:/ "0" "9")))) 40 | (token-NUM (parameterize ([read-decimal-as-inexact #f]) 41 | (string->number lexeme)))] 42 | [(:seq "---" (:* "-")) 'SEP] 43 | [(:seq #\" (:* (:~ #\")) #\") 44 | (token-STRING (substring lexeme 1 (sub1 (string-length lexeme))))] 45 | ["is" 'IS] 46 | ["{" 'OPEN] 47 | ["}" 'CLOSE] 48 | ["(" 'POPEN] 49 | [")" 'PCLOSE] 50 | ["=" 'ASSIGN] 51 | [(:or "+" "-") (token-UNBINKEYOP (string->symbol lexeme))] 52 | [(:or "*" "/" "<" ">") (token-BINKEYOP (string->symbol lexeme))] 53 | [(:or "<=" ">=") (token-BINOP (string->symbol lexeme))] 54 | ["image" 'IMAGE] 55 | ["key" 'KEY] 56 | ["message" 'MESSAGE] 57 | ["send" 'SEND] 58 | ["everyone" 'EVERYONE] 59 | ["move" 'MOVE] 60 | ["x" 'X] 61 | ["y" 'Y] 62 | ["size" 'SIZE] 63 | ["direction" 'DIRECTION] 64 | ["change" 'CHANGE] 65 | ["turn" 'TURN] 66 | ["to" 'TO] 67 | ["by" 'BY] 68 | ["on" 'ON] 69 | ["do" 'DO] 70 | ["watch" 'WATCH] 71 | ["forever" 'FOREVER] 72 | ["forward" 'FORWARD] 73 | ["if" 'IF] 74 | ["while" 'WHILE] 75 | ["random" 'RANDOM] 76 | ["variable" 'VARIABLE] 77 | ["wait" 'WAIT] 78 | ["say" 'SAY] 79 | ["hush" 'HUSH] 80 | ["hide" 'HIDE] 81 | ["show" 'SHOW] 82 | ["touches" 'TOUCHES] 83 | ["use" 'USE] 84 | [(:seq (:/ #\A #\Z #\a #\z) 85 | (:* (:or #\_ (:/ #\A #\Z #\a #\z #\0 #\9)))) 86 | (token-ID (string->symbol lexeme))] 87 | [(:+ whitespace) 'WHITESPACE] 88 | [(special) (token-SPECIAL lexeme)] 89 | [(eof) 'EOF] 90 | [any-char (token-ERROR lexeme)])) 91 | 92 | (define parse-from-lex 93 | (cfg-parser 94 | (start ) 95 | (end EOF) 96 | (tokens content-tokens 97 | delim-tokens) 98 | (precs) 99 | (error (lambda (a t v start end) 100 | (raise-parse-error t v start end))) 101 | (src-pos) 102 | (grammar 103 | ( [( ) (append $1 $2)]) 104 | ( [() null] 105 | [( USE ID ) (cons (at-src `(use ,$4)) $5)]) 106 | ( [() null] 107 | [( ) (cons $2 $3)]) 108 | ( [(SEP ID ) 109 | (at-src `(define-sprite ,$3 . ,$4))]) 110 | ( [() null] 111 | [( ) (append $2 $3)]) 112 | ( [(IMAGE IS ) (list (at-src '#:image) $5)] 113 | [(X IS ) (list (at-src '#:x) $5)] 114 | [(Y IS ) (list (at-src '#:y) $5)] 115 | [(SIZE IS ) (list (at-src '#:size) $5)] 116 | [(DIRECTION IS ) (list (at-src '#:direction) $5)] 117 | [(ON KEY ) (list* (at-src '#:key) 118 | $3 119 | $7)] 120 | [(ON STRING MESSAGE ) (list* (at-src '#:message) 121 | $3 122 | $7)] 123 | [(VARIABLE ID IS ) (list (at-src '#:variable) 124 | $3 125 | $7)] 126 | [(DO ) (cons (at-src '#:task) $3)]) 127 | ( [(NUM) $1] 128 | [(ID) $1] 129 | [(SPECIAL) (at-src `(quote ,$1))] 130 | [(STRING) (at-src `(quote ,$1))] 131 | [(RANDOM ) (at-src `(random ,$3))] 132 | [(TOUCHES ) (at-src `(touches? ,$3))] 133 | [( ) (at-src `(,$1 ,$3))] 134 | [( ) (at-src `(,$3 ,$1 ,$5))] 135 | [( ASSIGN ) (at-src `(= ,$1 ,$5))] 136 | [(POPEN PCLOSE) $3]) 137 | ( [(MOVE X BY ) (at-src `(move-x ,$7))] 138 | [(MOVE Y BY ) (at-src `(move-y ,$7))] 139 | [(MOVE X TO ) (at-src `(set-x ,$7))] 140 | [(MOVE Y TO ) (at-src `(set-y ,$7))] 141 | [(TURN TO ) (at-src `(turn-to ,$5))] 142 | [(TURN BY ) (at-src `(turn ,$5))] 143 | [(FORWARD BY ) (at-src `(forward ,$5))] 144 | [(CHANGE SIZE BY ) (at-src `(change-size ,$7))] 145 | [(CHANGE SIZE TO ) (at-src `(set-size ,$7))] 146 | [(WAIT ) (at-src `(sleep ,$3))] 147 | [(FOREVER OPEN CLOSE) (at-src `(forever . ,$5))] 148 | [(IF OPEN CLOSE) (at-src `(when ,$3 . ,$7))] 149 | [(WHILE OPEN CLOSE) (at-src `(while ,$3 . ,$7))] 150 | [(ID ASSIGN ) (at-src `(set! ,$1 ,$5))] 151 | [(SAY ) (at-src `(say ,$3))] 152 | [(HUSH) (at-src `(hush))] 153 | [(HIDE) (at-src '(hide))] 154 | [(SHOW) (at-src '(show))] 155 | [(CHANGE IMAGE TO ) (at-src `(set-image ,$7))] 156 | [(SAY ) (at-src `(say ,$3))] 157 | [(SEND TO EVERYONE) (at-src `(broadcast ,$3))] 158 | [(SEND TO ) (at-src `(tell ,$7 ,$3))] 159 | [(MOVE TO ) (at-src `(set-land ,$5))] 160 | [(WATCH ) (at-src `(watch ,$3))]) 161 | ( [() '()] 162 | [( ) (cons $2 $3)]) 163 | ( [(BINOP) $1] 164 | [(BINKEYOP) $1] 165 | [(UNBINKEYOP) $1]) 166 | ( [(UNBINKEYOP) $1]) 167 | ( [(ID) $1] 168 | [(X) (at-src 'x)] 169 | [(Y) (at-src 'y)] 170 | [(ASSIGN) (at-src '=)] 171 | [(BINKEYOP) $1] 172 | [(UNBINKEYOP) $1]) 173 | ( [() #f] 174 | [(WHITESPACE) #f])))) 175 | 176 | (define-syntax (at-src stx) 177 | (syntax-case stx () 178 | [(_ e) 179 | (with-syntax ([start (datum->syntax stx '$1-start-pos)] 180 | [end (datum->syntax stx '$n-end-pos)]) 181 | #'(datum->syntax #f e (to-srcloc start end) orig-prop))])) 182 | 183 | (define orig-prop (read-syntax 'src (open-input-bytes #"x"))) 184 | 185 | ;; ---------------------------------------- 186 | ;; Source locations and error reporting: 187 | 188 | (define current-source (make-parameter #f)) 189 | 190 | (define (to-srcloc start end) 191 | (list 192 | (current-source) 193 | (position-line start) 194 | (position-col start) 195 | (position-offset start) 196 | (and (position-offset end) 197 | (position-offset start) 198 | (- (position-offset end) 199 | (position-offset start))))) 200 | 201 | (define (raise-parse-error t v start end) 202 | (apply 203 | (if (eq? t 'EOF) raise-read-eof-error raise-read-error) 204 | (format "bad syntax at ~a" (token->string t v)) 205 | (to-srcloc start end))) 206 | 207 | (define (token->string t v) 208 | (if v 209 | (format "~a" v) 210 | (format "~a" t))) 211 | -------------------------------------------------------------------------------- /scratchy/reader.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | (require "parser.rkt" 3 | parser-tools/lex) 4 | 5 | (provide read-syntax 6 | read 7 | get-info) 8 | 9 | ;; To read a module: 10 | (define (read-syntax src-name in) 11 | (define stx (parse src-name in)) 12 | (let* ([p-name (object-name in)] 13 | [name (if (path? p-name) 14 | (let-values ([(base name dir?) (split-path p-name)]) 15 | (string->symbol 16 | (path->string (path-replace-suffix name #"")))) 17 | 'anonymous)]) 18 | (datum->syntax #f `(module ,name scratchy (#%module-begin . ,stx))))) 19 | 20 | ;; In case `read' is used, instead of `read-syntax': 21 | (define (read in) 22 | (syntax->datum (read-syntax (object-name in) in))) 23 | 24 | ;; To get info about the language's environment support: 25 | (define (get-info in mod line col pos) 26 | (lambda (key default) 27 | (case key 28 | [(color-lexer) color-lexer] 29 | [else default]))) 30 | 31 | ;; Environment support for token coloring: 32 | (define (color-lexer in offset mode) 33 | ;; Get next token: 34 | (define tok (lex in)) 35 | ;; Package classification with srcloc: 36 | (define (ret mode paren [eof? #f]) 37 | (values (if eof? 38 | eof 39 | (token->string (position-token-token tok) 40 | (token-value (position-token-token tok)))) 41 | mode 42 | paren 43 | (position-offset (position-token-start-pos tok)) 44 | (position-offset (position-token-end-pos tok)) 45 | 0 46 | #f)) 47 | ;; Convert token to classification: 48 | (case (token-name (position-token-token tok)) 49 | [(EOF) (ret 'eof #f #t)] 50 | [(OPEN) (ret 'parenthesis '|{|)] 51 | [(CLOSE) (ret 'parenthesis '|}|)] 52 | [(POPEN) (ret 'parenthesis '|(|)] 53 | [(PCLOSE) (ret 'parenthesis '|)|)] 54 | [(NUM) (ret 'constant #f)] 55 | [(ID) (ret 'symbol #f)] 56 | [(WHITESPACE) (ret 'white-space #f)] 57 | [(SEP) (ret 'parenthesis #f)] 58 | [(ERROR) (ret 'error #f)] 59 | [else (ret 'other #f)])) 60 | -------------------------------------------------------------------------------- /scratchy/runtime.rkt: -------------------------------------------------------------------------------- 1 | #lang racket/base 2 | (require racket/gui/base 3 | racket/class 4 | racket/math 5 | file/convertible 6 | slideshow/pict 7 | slideshow/balloon) 8 | 9 | (provide run 10 | land% 11 | sprite% 12 | task-custodian) 13 | 14 | (define draw-bounds? #f) 15 | (define draw-hit? #f) 16 | 17 | (define task-custodian (make-custodian)) 18 | (define (task-thread thunk) 19 | (parameterize ([current-custodian task-custodian]) 20 | (thread thunk))) 21 | 22 | (define (run land 23 | #:on-close [do-on-close void]) 24 | (define lands (for/list ([k (in-hash-keys (send land get-lands (hasheq land #t)))]) 25 | k)) 26 | (define f (new (class frame% 27 | (super-new) 28 | (define/augment (on-close) 29 | (do-on-close))) 30 | [label "Scratchy"] 31 | [width 800] 32 | [height 600])) 33 | (define c (new (class canvas% 34 | (inherit get-client-size 35 | refresh) 36 | (super-new [parent f] 37 | [paint-callback 38 | (lambda (c dc) 39 | (define-values (w h) (get-client-size)) 40 | (for ([sprite (in-list (send land get-sprites))]) 41 | (send sprite draw dc w h) 42 | (when draw-bounds? 43 | (define-values (x1 y1 x2 y2) (send sprite bounding-box)) 44 | (send dc set-brush (make-brush #:style 'transparent)) 45 | (send dc draw-rectangle 46 | (+ x1 (quotient w 2)) (+ y1 (quotient h 2)) 47 | (- x2 x1) (- y2 y1)))))]) 48 | 49 | (define/override (on-char e) 50 | (define code (send e get-key-code)) 51 | (define down? (not (eq? code 'release))) 52 | (define key (if down? 53 | code 54 | (send e get-key-release-code))) 55 | (for ([sprite (in-list (send land get-sprites))]) 56 | (send sprite key down? key)) 57 | (refresh)) 58 | 59 | (define/override (on-event e) 60 | (define type (send e get-event-type)) 61 | (when (member type '(left-down left-up 62 | middle-down middle-up 63 | right-down right-up)) 64 | (define down? (member type '(left-down middle-down right-down))) 65 | (define-values (w h) (send c get-client-size)) 66 | (define x (- (send e get-x) (quotient w 2))) 67 | (define y (- (send e get-y) (quotient h 2))) 68 | (for/or ([sprite (in-list (reverse (send land get-sprites)))]) 69 | (and (eq? land (send sprite get-land)) 70 | (send sprite hits? x y) 71 | (begin 72 | (send sprite mouse down? x y) 73 | #t))) 74 | (refresh)))))) 75 | 76 | (for ([land (in-list lands)]) 77 | (send land set-others lands)) 78 | 79 | (task-thread (lambda () 80 | (let loop () 81 | (sleep 0.03) 82 | (define continue (make-semaphore)) 83 | (queue-callback 84 | (lambda () 85 | (define-values (w h) (send c get-client-size)) 86 | (define new-land (let-values ([(l t) 87 | (for/fold ([new-land land] [time 0]) ([l (in-list lands)]) 88 | (define t (send l check-show)) 89 | (if (and t (t . > . time)) 90 | (values l t) 91 | (values new-land time)))]) 92 | l)) 93 | (unless (eq? land new-land) 94 | (set! land new-land) 95 | (send c refresh)) 96 | (when (for*/fold ([update? #f]) ([l (in-list lands)] 97 | [sprite (in-list (send l get-sprites))]) 98 | (or (and (send sprite tick w h) 99 | (eq? land l)) 100 | update?)) 101 | (send c refresh)) 102 | (semaphore-post continue))) 103 | (semaphore-wait continue) 104 | (loop)))) 105 | 106 | (send f show #t)) 107 | 108 | (define-syntax-rule (as-event e ...) 109 | (call-as-event (lambda () e ...))) 110 | 111 | (define (call-as-event thunk) 112 | (define t (current-thread)) 113 | (if (eq? t handler-thread) 114 | (thunk) 115 | (begin 116 | (queue-callback (lambda () 117 | (thread-send t (thunk)))) 118 | (thread-receive)))) 119 | 120 | 121 | (define handler-thread (eventspace-handler-thread (current-eventspace))) 122 | 123 | (define land% 124 | (class object% 125 | (super-new) 126 | 127 | (init [(get-lands-callback get-lands)]) 128 | 129 | (define sprites null) 130 | 131 | (define/public (add-sprite s) 132 | (set! sprites (cons s sprites))) 133 | 134 | (define/public (remove-sprite s) 135 | (set! sprites (remove s sprites))) 136 | 137 | (define/public (get-sprites) sprites) 138 | 139 | (define on-get-lands get-lands-callback) 140 | (define/public (get-lands ht) 141 | (define lands (on-get-lands)) 142 | (for/fold ([ht ht]) ([l (in-list lands)]) 143 | (if (hash-ref ht l #f) 144 | ht 145 | (send l get-lands (hash-set ht l #t))))) 146 | 147 | (define others null) 148 | (define/public (set-others other-lands) 149 | (set! others other-lands)) 150 | 151 | (define wants-show #f) 152 | (define/public (watch) 153 | (as-event 154 | (set! wants-show (current-inexact-milliseconds)))) 155 | (define/public (check-show) 156 | (and wants-show 157 | (begin0 158 | wants-show 159 | (set! wants-show #f)))))) 160 | 161 | (define sprite% 162 | (class object% 163 | (init [(init-land land)] 164 | image 165 | [(init-x x) 0] 166 | [(init-y y) 0] 167 | [(init-s size) 1] 168 | [direction 90] 169 | [key-callback void] 170 | [mouse-callback void] 171 | [message-callback void]) 172 | 173 | (define land init-land) 174 | (send land add-sprite this) 175 | 176 | (define on-key key-callback) 177 | (define on-mouse mouse-callback) 178 | (define on-message message-callback) 179 | 180 | (define-syntax-rule (as-modify-event e ...) 181 | (as-event e ... (set! modified? #t))) 182 | 183 | (define bm (make-bitmap 1 1)) 184 | 185 | (define w 1) 186 | (define h 1) 187 | (define w/2 (* w 0.5)) 188 | (define h/2 (* h 0.5)) 189 | (define -w/2 (* w -0.5)) 190 | (define -h/2 (* h -0.5)) 191 | (define argb #"\0\0\0\0") 192 | (define solid-pixels null) 193 | (define num-solid-pixels (length solid-pixels)) 194 | 195 | (define/private (reset-bm! new-bm) 196 | (set! bm new-bm) 197 | (set! w (send new-bm get-width)) 198 | (set! h (send new-bm get-height)) 199 | 200 | (set! w/2 (* w 0.5)) 201 | (set! h/2 (* h 0.5)) 202 | (set! -w/2 (* w -0.5)) 203 | (set! -h/2 (* h -0.5)) 204 | 205 | (set! argb (make-bytes (* w h 4))) 206 | (send new-bm get-argb-pixels 0 0 w h argb) 207 | 208 | (set! solid-pixels 209 | (for*/list ([i (in-range w)] 210 | [j (in-range h)] 211 | #:when (positive? (bytes-ref argb (* 4 (+ i (* j w)))))) 212 | (cons i j))) 213 | (set! num-solid-pixels (length solid-pixels))) 214 | (reset-bm! (read-bitmap (open-input-bytes (convert image 'png-bytes)))) 215 | 216 | (define visible? #t) 217 | (define x init-x) ; h-position: positive is right 218 | (define y init-y) ; v-position: positive is up 219 | (define r direction) ; degrees; 0 is up, 90 is to the right 220 | (define s init-s) ; scale 221 | 222 | (define cr (cos (radians r))) 223 | (define sr (sin (radians r))) 224 | 225 | (define pixels-per-point (ceiling (/ s))) 226 | 227 | (define hx 0) 228 | (define hy 0) 229 | 230 | (define/private (radians r) 231 | (- (/ pi 2) (* r (/ pi 180)))) 232 | 233 | (define modified? #f) 234 | 235 | (define/public (forward v) 236 | (as-modify-event 237 | (set! x (+ x (* v cr))) 238 | (set! y (+ y (* v sr))))) 239 | 240 | (define/public (move-x v) 241 | (as-modify-event 242 | (set! x (+ x v)))) 243 | 244 | (define/public (move-y v) 245 | (as-modify-event 246 | (set! y (+ y v)))) 247 | 248 | (define/public (change-size v) 249 | (as-modify-event 250 | (set-s! (+ s v)))) 251 | 252 | (define/public (turn n) 253 | (as-modify-event 254 | (set-r! (+ n r)))) 255 | 256 | (define/public (turn-to v) 257 | (as-modify-event 258 | (set-r! v))) 259 | 260 | (define/public (show) 261 | (as-event 262 | (unless visible? 263 | (set! visible? #t) 264 | (set! modified? #t)))) 265 | 266 | (define/public (hide) 267 | (as-event 268 | (when visible? 269 | (set! visible? #f) 270 | (set! modified? #t)))) 271 | 272 | (define-syntax-rule (define-getter-setter var get set) 273 | (begin 274 | (define/public (get) 275 | (as-event var)) 276 | (define/public (set v) 277 | (as-modify-event 278 | (set! var v))))) 279 | 280 | (define-getter-setter x get-x set-x) 281 | (define-getter-setter y get-y set-y) 282 | 283 | (define/private (set-r! v) 284 | (set! r v) 285 | (set! cr (cos (radians r))) 286 | (set! sr (sin (radians r)))) 287 | 288 | (define/private (set-s! v) 289 | (unless (positive? s) 290 | (error 'set-s! "size must be positive")) 291 | (set! s v) 292 | (set! pixels-per-point (ceiling (/ s)))) 293 | 294 | (define msg #f) 295 | 296 | (define/public (say s) 297 | (as-modify-event 298 | (set! msg 299 | (pip-wrap-balloon (text (format "~a" s) 'swiss 24) 300 | 'sw 0 20 balloon-color 12)))) 301 | 302 | (define/public (hush) 303 | (as-modify-event (set! msg #f))) 304 | 305 | (define/public (draw dc cw ch) 306 | (when visible? 307 | (define t (send dc get-transformation)) 308 | (send dc translate (+ (quotient cw 2) x) (- (quotient ch 2) y)) 309 | (send dc rotate (radians r)) 310 | (send dc scale s s) 311 | (send dc draw-bitmap bm -w/2 -h/2) 312 | (when draw-hit? 313 | (send dc draw-rectangle hx hy 2 2)) 314 | (send dc set-transformation t) 315 | (when msg 316 | (draw-pict msg dc 317 | (+ (quotient cw 2) x (* w 0.25)) 318 | (- (quotient ch 2) y (* h 0.25)))))) 319 | 320 | (define/public (tick w h) 321 | (and modified? 322 | (set! modified? #f) 323 | #t)) 324 | 325 | (define/public (key down? key) 326 | (task-thread 327 | (lambda () 328 | (on-key down? key)))) 329 | 330 | (define/private (transform px py) 331 | (if (and (zero? px) (zero? py)) 332 | (values x (- y)) 333 | (let* ([px (* px s)] 334 | [py (* py s)] 335 | [rpx (- (* px cr) (* py sr))] 336 | [rpy (+ (* px sr) (* py cr))] 337 | [px (+ rpx x)] 338 | [py (- rpy y)]) 339 | (values px py)))) 340 | 341 | (define/private (reverse-transform mx my) 342 | ;; reverse transform on mx and my: 343 | (let* ([mx (- mx x)] 344 | [my (+ my y)] 345 | [rmx (- (* mx cr) (* my sr))] 346 | [rmy (+ (* mx sr) (* my cr))] 347 | [mx (/ rmx s)] 348 | [my (/ rmy s)]) 349 | (values mx my))) 350 | 351 | (define/public (hits? mx my) 352 | (as-event (hits?/i mx my))) 353 | 354 | (define/public (hits?/i mx my) 355 | (let-values ([(mx my) (reverse-transform mx my)]) 356 | (and (<= -w/2 mx w/2) 357 | (<= -h/2 my h/2) 358 | (let () 359 | (define bx (max 0 (inexact->exact (floor (+ mx w/2))))) 360 | (define by (max 0 (inexact->exact (floor (+ my h/2))))) 361 | (if (= 1 pixels-per-point) 362 | ;; each point hits about one pixel: 363 | (positive? (bytes-ref argb 364 | (* 4 (+ (* (min by (sub1 h)) w) 365 | (min bx (sub1 w)))))) 366 | ;; each point hits many bitmap pixels due to scaling: 367 | (for*/or ([dx (in-range pixels-per-point)] 368 | [dy (in-range pixels-per-point)]) 369 | (positive? (bytes-ref argb 370 | (* 4 (+ (* (min (+ by dy) (sub1 h)) 371 | w) 372 | (min (+ bx dx) (sub1 w)))))))))))) 373 | 374 | (define/public (mouse down? mx my) 375 | (let-values ([(mx my) (reverse-transform mx my)]) 376 | (task-thread 377 | (lambda () 378 | (on-mouse down? mx my))))) 379 | 380 | (define/public (bounding-box) 381 | (define-values (x1 y1) (transform -w/2 -h/2)) 382 | (define-values (x2 y2) (transform w/2 h/2)) 383 | (define-values (x3 y3) (transform w/2 -h/2)) 384 | (define-values (x4 y4) (transform -w/2 h/2)) 385 | (values (min x1 x2 x3 x4) (min y1 y2 y3 y4) 386 | (max x1 x2 x3 x4) (max y1 y2 y3 y4))) 387 | 388 | (define/public (points-to-test) 389 | (* num-solid-pixels s)) 390 | 391 | (define/public (is-visible?) visible?) 392 | 393 | (define/public (touches? other) 394 | (as-event 395 | (and visible? 396 | (send other is-visible?) 397 | (eq? land (send other get-land)) 398 | (if ((points-to-test) . < . (send other points-to-test)) 399 | (touches?/i other) 400 | (send other touches?/i this))))) 401 | 402 | (define/public (touches?/i other) 403 | (define-values (x1 y1 x2 y2) (bounding-box)) 404 | (define-values (x3 y3 x4 y4) (send other bounding-box)) 405 | (and (or (<= x1 x3 x2) 406 | (<= x1 x4 x2) 407 | (<= x3 x2 x4)) 408 | (or (<= y1 y3 y2) 409 | (<= y1 y4 y2) 410 | (<= y3 y2 y4)) 411 | ;; bounding boxes overlap; check pixels 412 | (let ([dx -w/2] 413 | [dy -h/2] 414 | [pw (inexact->exact (floor s))]) 415 | (for/or ([p (in-list solid-pixels)]) 416 | (define i (car p)) 417 | (define j (cdr p)) 418 | (and (positive? (bytes-ref argb (* 4 (+ i (* j w))))) 419 | (if (pw . < . 3) 420 | ;; treat pixel as touching one point: 421 | (let-values ([(mx my) (transform (+ i dx) (+ j dy))]) 422 | (send other hits?/i mx my)) 423 | ;; each pixel hits multiple points: 424 | (for*/or ([ddx (in-range pw)] 425 | [ddy (in-range pw)]) 426 | (let-values ([(mx my) (transform (+ i dx (/ ddx s)) (+ j dy (/ ddy s)))]) 427 | (send other hits?/i mx my))))))))) 428 | 429 | (define/public (message m) 430 | (task-thread 431 | (lambda () 432 | (on-message m)))) 433 | 434 | (define/public (tell other m) 435 | (send other message m)) 436 | 437 | (define/public (broadcast m) 438 | (as-event 439 | (for ([other (in-list (send land get-sprites))]) 440 | (send other message m)))) 441 | 442 | (define/public (get-land) land) 443 | 444 | (define/public (set-land l) 445 | (as-modify-event 446 | (send land remove-sprite this) 447 | (set! land l) 448 | (send land add-sprite this))) 449 | 450 | (define/public (set-image image) 451 | (as-modify-event 452 | (define bm (read-bitmap (open-input-bytes (convert image 'png-bytes)))) 453 | (reset-bm! bm))) 454 | 455 | (super-new))) 456 | -------------------------------------------------------------------------------- /scratchy/scratchy.rkt: -------------------------------------------------------------------------------- 1 | #lang racket/base 2 | (require "runtime.rkt" 3 | "images.rkt" 4 | racket/stxparam 5 | racket/splicing 6 | racket/class 7 | racket/runtime-path 8 | racket/include 9 | racket/promise 10 | (for-syntax racket/base 11 | syntax/parse)) 12 | 13 | (provide (except-out (all-from-out racket/base) 14 | #%module-begin set! do) 15 | (rename-out [module-begin #%module-begin] 16 | [checked-set! set!] 17 | [do-keyword do]) 18 | 19 | (all-from-out "images.rkt") 20 | 21 | define-sprite task use 22 | 23 | forever while) 24 | 25 | ;; The methods listed here are also exported: 26 | (define-syntax-rule (provide-methods) 27 | (begin 28 | (provide-sprite-method move-y move-x set-x set-y 29 | turn-to change-size set-image 30 | forward turn touches? say hush 31 | show hide 32 | tell broadcast set-land) 33 | (provide-land-method watch))) 34 | 35 | ;; The additional keywords listed here are also exported: 36 | (define-syntax-rule (provide-keywords) 37 | (provide-keyword image is to by on x y size direction ---...- 38 | key message variable touches move change 39 | wait everyone send)) 40 | 41 | ;; ---------------------------------------- 42 | 43 | (define-syntax (module-begin stx) 44 | (syntax-case stx () 45 | [(mb decl ...) 46 | (with-syntax ([whole stx] 47 | [land-id (datum->syntax stx 48 | (or (syntax-property stx 'enclosing-module-name) 49 | 'anonymous) 50 | stx)]) 51 | #'(#%module-begin 52 | (top land-id () decl ...)))])) 53 | 54 | (define-syntax top 55 | (syntax-rules (use define-sprite) 56 | [(_ land-id lands (use land) decl ...) 57 | (begin 58 | (use land) 59 | (top land-id (land . lands) decl ...))] 60 | [(_ land-id (land ...) (define-sprite id . rest) ...) 61 | (begin 62 | (define land-id (new land% 63 | [get-lands (lambda () (list land ...))])) 64 | (provide land-id) 65 | (define-sprite land-id id . rest) ... 66 | (provide id ...) 67 | (module+ main (run+ land-id)))])) 68 | 69 | ;; ---------------------------------------- 70 | 71 | (define-syntax (use stx) 72 | (syntax-case stx () 73 | [(_ land-id) 74 | (with-syntax ([path-spec (datum->syntax #'here 75 | (format "~a.rkt" (syntax-e #'land-id)) 76 | #'land-id 77 | #'land-id)]) 78 | #`(begin 79 | (define-runtime-module-path-index other-land-path path-spec) 80 | (define lazy-land-id (delay (dynamic-require other-land-path 'land-id))) 81 | (define-syntax (land-id stx) #'(force lazy-land-id)) 82 | (define-syntax (module stx) 83 | (import-definitions stx (quote-syntax land-id) (quote-syntax other-land-path))) 84 | (include-at/relative-to module land-id path-spec)))])) 85 | 86 | (define-for-syntax (import-definitions stx context-id path-id) 87 | (syntax-case stx () 88 | [(_ name lang (mb elem ...)) 89 | #`(begin #,@(for/list ([elem (syntax->list #'(elem ...))]) 90 | (syntax-case elem (use define-sprite) 91 | [(use . _) #'(begin)] 92 | [(define-sprite id . _) 93 | (with-syntax ([id (syntax-local-introduce 94 | (datum->syntax context-id 95 | (syntax-e #'id) 96 | context-id 97 | context-id))] 98 | [(lazy-id) (generate-temporaries (list #'id))] 99 | [path-id path-id]) 100 | #'(begin 101 | (define-syntax (id stx) #'(force lazy-id)) 102 | (define lazy-id (delay (dynamic-require path-id 'id)))))])))])) 103 | 104 | ;; ---------------------------------------- 105 | 106 | (define-syntax (define-sprite stx) 107 | (syntax-parse stx 108 | [(_ land-id name:id (~or (~once (~seq #:image image-expr:expr)) 109 | (~optional (~seq #:x x-expr:expr) 110 | #:defaults ([x-expr #'0])) 111 | (~optional (~seq #:y y-expr:expr) 112 | #:defaults ([y-expr #'0])) 113 | (~optional (~seq #:size size-expr:expr) 114 | #:defaults ([size-expr #'1])) 115 | (~optional (~seq #:direction dir-expr:expr) 116 | #:defaults ([dir-expr #'90])) 117 | (~seq #:key key-name:id key-expr:expr ...) 118 | (~seq #:message msg:str msg-expr:expr ...) 119 | (~seq #:task task-expr:expr ...) 120 | (~seq #:variable variable-name:id variable-expr:expr)) 121 | ...) 122 | #'(define-sprite/method name 123 | [land land-id] 124 | [image image-expr] 125 | [x x-expr] 126 | [y y-expr] 127 | [size size-expr] 128 | [direction dir-expr] 129 | [key-callback 130 | (key-handler 131 | [key-name key-expr ...] 132 | ...)] 133 | [message-callback 134 | (lambda (msg-in) 135 | (cond 136 | [(equal? msg-in msg) msg-expr ...] 137 | ...))] 138 | [variable variable-name variable-expr] ... 139 | [task task-expr ...] ...)])) 140 | 141 | ;; ---------------------------------------- 142 | 143 | (define-syntax-parameter self #f) 144 | 145 | (define-syntax-rule (define-sprite/method name clause ...) 146 | (splicing-syntax-parameterize ([self (syntax-rules () 147 | [(_) name])]) 148 | (define-sprite/orig name clause ...))) 149 | 150 | 151 | (define-syntax-rule (provide-sprite-method id ...) 152 | (begin 153 | (provide id ...) 154 | (define-sprite-method id ...))) 155 | 156 | (define-syntax-rule (define-sprite-method id ...) 157 | (begin 158 | (... 159 | (define-syntax-rule (id arg ...) 160 | (send (self) id arg ...))) 161 | ...)) 162 | 163 | 164 | (define-syntax-rule (provide-land-method id ...) 165 | (begin 166 | (provide id ...) 167 | (define-land-method id ...))) 168 | 169 | (define-syntax-rule (define-land-method id ...) 170 | (begin 171 | (... 172 | (define-syntax-rule (id land arg ...) 173 | (send land id arg ...))) 174 | ...)) 175 | 176 | (provide-methods) 177 | 178 | ;; ---------------------------------------- 179 | 180 | (define-syntax-rule (provide-keyword id ...) 181 | (begin 182 | (define-syntax id #f) ... 183 | (provide id ...))) 184 | 185 | (define-syntax do-keyword #f) 186 | 187 | (provide-keywords) 188 | 189 | ;; ---------------------------------------- 190 | 191 | (define ready-sema (make-semaphore)) 192 | (define ready (semaphore-peek-evt ready-sema)) 193 | 194 | (define (run+ land) 195 | (begin0 196 | (run land) 197 | (semaphore-post ready-sema))) 198 | 199 | (define-syntax define-sprite/orig 200 | (syntax-rules (task variable) 201 | [(_ id clause ... [task expr ...]) 202 | (begin 203 | (define-sprite/orig id clause ...) 204 | (task (sync ready) expr ...))] 205 | [(_ id clause ... [variable var-id expr]) 206 | (begin 207 | (define-sprite/orig id clause ...) 208 | (define-variable var-id expr))] 209 | [(_ id clause ...) 210 | (define id (new sprite% clause ...))])) 211 | 212 | ;; ---------------------------------------- 213 | 214 | (define-syntax (checked-set! stx) 215 | (syntax-case stx () 216 | [(_ target-id rhs) 217 | (let ([id #'target-id]) 218 | (when (and (identifier? id) 219 | (not (variable? (syntax-local-value id (lambda () #f))))) 220 | (raise-syntax-error #f 221 | "target of assignment is not a variable" 222 | stx 223 | id)) 224 | #`(set! target-id rhs))])) 225 | 226 | (begin-for-syntax 227 | (struct variable (id) 228 | #:property 229 | prop:set!-transformer 230 | (lambda (self stx) 231 | (with-syntax ([id (variable-id self)]) 232 | (syntax-case stx (set!) 233 | [(set! _ rhs) (syntax/loc stx (set! id rhs))] 234 | [(_ arg ...) (syntax/loc stx (id arg ...))] 235 | [_ #'id]))))) 236 | 237 | (define-syntax (define-variable stx) 238 | (syntax-case stx () 239 | [(_ id rhs) 240 | #'(begin 241 | (define-syntax id (variable #'gen-id)) 242 | (define gen-id (let ([id rhs]) id)))])) 243 | 244 | ;; ---------------------------------------- 245 | 246 | (define-syntax-rule (forever expr ...) 247 | (let loop () expr ... (loop))) 248 | 249 | (define-syntax-rule (while tst expr ...) 250 | (let loop () (when tst expr ... (loop)))) 251 | 252 | (define-syntax-rule (task expr ...) 253 | (void (parameterize ([current-custodian task-custodian]) 254 | (thread (lambda () expr ... (void)))))) 255 | 256 | ;; ---------------------------------------- 257 | 258 | (define-syntax (key-handler stx) 259 | (syntax-case stx () 260 | [(_ [key expr ...] ...) 261 | (let ([keys (syntax->list #'(key ...))]) 262 | (for ([k (in-list keys)]) 263 | (unless (identifier? k) 264 | (raise-syntax-error #f 265 | "not an identifier for a key" 266 | stx 267 | k))) 268 | #'(lambda (down? given-key) 269 | (when down? 270 | (cond 271 | [(is-key? given-key 'key) expr ...] 272 | ...))))])) 273 | 274 | (define (is-key? given sym) 275 | (eq? (if (char? given) 276 | (string->symbol (substring (format "~s" given) 2)) 277 | given) 278 | sym)) 279 | -------------------------------------------------------------------------------- /scratchy/scratchy.scrbl: -------------------------------------------------------------------------------- 1 | #lang scribble/manual 2 | @(require (for-label (except-in racket/base do random if) 3 | racket/contract/base 4 | file/convertible 5 | (except-in racket/class send) 6 | scratchy/runtime 7 | (only-in scratchy 8 | use image is to by x y 9 | size direction on key message 10 | variable do random touches 11 | move turn forward change 12 | wait say hush send everyone 13 | watch forever while if 14 | hide show)) 15 | scribble/bnf) 16 | 17 | @title{Scratchy: A Scratch-like Toy} 18 | 19 | Scratchy provides a @link["http://scratch.mit.edu"]{Scratch}-like 20 | runtime environment plus a simple textual programming language. It was 21 | developed as an example of creating a language in Racket. 22 | 23 | @table-of-contents[] 24 | 25 | @; ---------------------------------------- 26 | 27 | @section{Textual Language} 28 | 29 | @defmodulelang[scratchy] 30 | 31 | Here's a program for a fish that swims randomly: 32 | 33 | @subsection{Example} 34 | 35 | @codeblock|{ 36 | #lang scratchy 37 | 38 | ------------------------------------- 39 | fish 40 | 41 | image is @fish-image 42 | 43 | do 44 | forever { 45 | wait 0.02 46 | forward by 2 47 | turn by (random 5) - 2 48 | } 49 | }| 50 | 51 | The @racket[---...-] starts a sprite declaration, where the 52 | sprite is named @racket[fish]. In addition, if the file name is 53 | @filepath{fish-land.rkt}, then @racket[fish-land] is defined as the 54 | land where @racket[fish] starts. 55 | 56 | @subsection{Grammar} 57 | 58 | @(define @nonterm{prog}) 59 | @(define @nonterm{use}) 60 | @(define @nonterm{sprite}) 61 | @(define @nonterm{clause}) 62 | @(define @nonterm{expr}) 63 | @(define @nonterm{statement}) 64 | @(define @nonterm{key}) 65 | @(define @nonterm{id}) 66 | @(define @nonterm{binary-op}) 67 | @(define @nonterm{unary-op}) 68 | @(define @nonterm{number}) 69 | @(define @nonterm{string}) 70 | 71 | Here's the grammar of this textual language (click on a keyword for more information): 72 | 73 | @BNF[ 74 | (list @BNF-seq[@kleenestar[] @kleenestar[]]) 75 | (list @BNF-seq[@racket[use] ]) 76 | (list @BNF-seq[@racket[---...-] @kleenestar[]]) 77 | (list @BNF-seq[@racket[image] @racket[is] ] 78 | @BNF-seq[@racket[x] @racket[is] ] 79 | @BNF-seq[@racket[y] @racket[is] ] 80 | @BNF-seq[@racket[size] @racket[is] ] 81 | @BNF-seq[@racket[direction] @racket[is] ] 82 | @BNF-seq[@racket[on] @racket[key] @kleenestar[]] 83 | @BNF-seq[@racket[on] @racket[message] @kleenestar[]] 84 | @BNF-seq[@racket[variable] @racket[is] ] 85 | @BNF-seq[@racket[do] @kleenestar[]]) 86 | (list @BNF-alt[ @nonterm{image} @nonterm{string}] 87 | 88 | @BNF-seq[ ] 89 | @BNF-seq[ ] 90 | @BNF-seq[@racket[random] ] 91 | @BNF-seq[@racket[touches] ] 92 | @BNF-seq[@litchar{(} @litchar{)}]) 93 | (list @BNF-seq[@racket[move] @racket[x] @racket[by] ] 94 | @BNF-seq[@racket[move] @racket[y] @racket[by] ] 95 | @BNF-seq[@racket[move] @racket[x] @racket[to] ] 96 | @BNF-seq[@racket[move] @racket[y] @racket[to] ] 97 | @BNF-seq[@racket[turn] @racket[by] ] 98 | @BNF-seq[@racket[turn] @racket[to] ] 99 | @BNF-seq[@racket[forward] @racket[by] ] 100 | @BNF-seq[@racket[change] @racket[size] @racket[by] ] 101 | @BNF-seq[@racket[change] @racket[size] @racket[to] ] 102 | @BNF-seq[@racket[wait] ] 103 | @BNF-seq[@racket[say] ] 104 | @BNF-seq[@racket[hush]] 105 | @BNF-seq[@racket[hide]] 106 | @BNF-seq[@racket[show]] 107 | @BNF-seq[@racket[change] @racket[image] @racket[to] ] 108 | @BNF-seq[@racket[send] @racket[to] ] 109 | @BNF-seq[@racket[send] @racket[to] @racket[everyone]] 110 | @BNF-seq[@racket[watch] ] 111 | @BNF-seq[@racket[move] @racket[to] ] 112 | @BNF-seq[@racket[forever] @litchar["{"] @kleenestar[] @litchar["}"]] 113 | @BNF-seq[@racket[while] @litchar["{"] @kleenestar[] @litchar["}"]] 114 | @BNF-seq[@racket[if] @litchar["{"] @kleenestar[] @litchar["}"]] 115 | @BNF-seq[ @litchar{=} ]) 116 | (list @litchar{-} @litchar{+}) 117 | (list @BNF-alt[@litchar{+} @litchar{-} @litchar{*} @litchar{/} @litchar{<} @litchar{>} @litchar{<=} @litchar{>=} @litchar{=}]) 118 | (list @BNF-alt[ @litchar{+} @litchar{-} @litchar{*} @litchar{/} @litchar{<} @litchar{>} @litchar{=}]) 119 | (list @elem{a letter (in @litchar{a}/@litchar{A} to @litchar{z}/@litchar{Z}) followed by letters, numbers, and @litchar{_}s} 120 | @elem{@litchar["@"] followed by a sequence of letters, numbers, @litchar{_}s, and @litchar{-}s}) 121 | (list @elem{a decimal number}) 122 | (list @elem{sequence of characters between @litchar{"}s}) 123 | ] 124 | 125 | @subsection{Syntactic Forms} 126 | 127 | @defform[#:id use (code:line use @#,)]{ 128 | Imports the sprite, variable, and land name of a land defined in the file 129 | whose name matches @ with a @filepath{.rkt} suffix. 130 | } 131 | 132 | @defidform[---...-]{ 133 | Starts a sprite declaration. Any number of @litchar{-}s can appear, as long as 134 | there are at least three.} 135 | 136 | @defform[#:id image #:literals (is) (code:line image is @#,)]{ 137 | 138 | Determines the initial image for a sprite.} 139 | 140 | @deftogether[( 141 | @defform[#:id x #:literals (is) (code:line x is @#,)] 142 | @defform[#:id y #:literals (is) (code:line y is @#,)] 143 | )]{ 144 | 145 | Determines the initial placement of a sprite.} 146 | 147 | @defform[#:id size #:literals (is) (code:line size is @#,)]{ 148 | 149 | Determines the initial size of a sprite, as a multiple of its image's size.} 150 | 151 | @defform[#:id direction #:literals (is) (code:line direction is @#,)]{ 152 | 153 | Determines the initial direction of a sprite, in degrees where 0 is north, 154 | 90 is east, 180 is south, and 270 is west.} 155 | 156 | @defform*[#:id on #:literals (key message) 157 | [(code:line on @#, key @#,kleenestar[]) 158 | (code:line on @#, message @#,kleenestar[])]]{ 159 | Declares actions to take when a key is pressed or a message is sent or broadcast.} 160 | 161 | @defform[#:id variable #:literals (is) (code:line variable @#, is @#,)]{ 162 | 163 | Declares a variable, which is visible in the whole land.} 164 | 165 | @defform[#:id do #:literals (is) (code:line do @#,kleenestar[])]{ 166 | 167 | Starts a concurrent task.} 168 | 169 | @defform[#:id random (code:line random @#,)]{ 170 | 171 | Generates a random number between 0 and one less than the integer produced by @||.} 172 | 173 | @defform[#:id touches (code:line touches @#,)]{ 174 | 175 | Produces true if this sprite is touching the one named by @||.} 176 | 177 | @defform*[#:id turn #:literals (to by) 178 | [(code:line turn by @#,) 179 | (code:line turn to @#,)]]{ 180 | 181 | Changes the sprite's direction either @racket[by] a number of degrees 182 | clockwise or @racket[to] a number of degrees like @racket[direction].} 183 | 184 | @defform*[#:id move #:literals (x y to by) 185 | [(code:line move x by @#,) 186 | (code:line move y by @#,) 187 | (code:line move x to @#,) 188 | (code:line move y to @#,) 189 | (code:line move to @#,)]]{ 190 | 191 | Changes the sprite's @racket[x] or @racket[y] location either 192 | @racket[by] a number of pixels left/up or @racket[to] a number of 193 | pixels from the screen's center. If neither @racket[x] or @racket[y] 194 | is indicated, the sprite instead moves to the specified @tech{land} 195 | (keeping its relative position from the current land).} 196 | 197 | 198 | @defform[#:id forward #:literals (by) (code:line forward by @#,)]{ 199 | 200 | Moves the sprite in its current direction by the specified number of pixels.} 201 | 202 | 203 | @defform*[#:id change #:literals (size image to by) 204 | [(code:line change size by @#,) 205 | (code:line change size to @#,) 206 | (code:line change image to @#,)]]{ 207 | 208 | Changes the sprite's size either @racket[by] an amount to add to 209 | its current size multiplier or @racket[to] a multiple of its image's size, 210 | or sets the sprite image to a new image.} 211 | 212 | 213 | @defform[#:id wait (code:line wait @#,)]{ 214 | 215 | Pauses a task for the specified number of seconds.} 216 | 217 | @defform[#:id say (code:line say @#,)]{ 218 | 219 | Causes the sprite to have a speech bubble with the specified content.} 220 | 221 | @defidform[hush]{ 222 | 223 | Removes the sprite's speech bubble, if any.} 224 | 225 | @deftogether[( 226 | @defidform[hide] 227 | @defidform[show] 228 | )]{ 229 | 230 | Hides or shows the sprite.} 231 | 232 | 233 | @defform*[#:id send #:literals (to everyone) 234 | [(code:line send @#, to @#,) 235 | (code:line send @#, to everyone)]]{ 236 | 237 | Sends a message to a specific sprite or to all sprites in the @tech{land}. 238 | A sprite can respond to the message using an 239 | @racket[on @#, message] clause.} 240 | 241 | @defform[#:id watch (code:line watch @#,)]{ 242 | 243 | Switches the Scratchy view to the specified @tech{land}.} 244 | 245 | @defform[#:id forever 246 | (code:line forever @#,litchar["{"] @#,kleenestar[] @#,litchar["}"])]{ 247 | 248 | Repeats the @||s forever.} 249 | 250 | @defform[#:id while 251 | (code:line while @#, @#,litchar["{"] @#,kleenestar[] @#,litchar["}"])]{ 252 | 253 | Repeats the @||s as long as @ produces true.} 254 | 255 | @defform[#:id if 256 | (code:line if @#, @#,litchar["{"] @#,kleenestar[] @#,litchar["}"])]{ 257 | 258 | Performs the @||s only if @ produces true.} 259 | 260 | @deftogether[( 261 | @defidform[is] 262 | @defidform[to] 263 | @defidform[by] 264 | @defidform[key] 265 | @defidform[message] 266 | @defidform[everyone] 267 | )]{ 268 | Keywords that are combined with many others.} 269 | 270 | @; ---------------------------------------- 271 | 272 | @section{Runtime Functions and Classes} 273 | 274 | @defmodule[scratchy/runtime] 275 | 276 | @defproc[(run [land land%]) void?]{ 277 | 278 | Runs a Scratchy program given a starting @tech{land}. The 279 | @tech{sprites} in the land are drawn last to first in the order of 280 | addition to the land (so the last added sprite is drawn under all 281 | others, for example).} 282 | 283 | @; ---------------- 284 | 285 | @defclass[land% object% ()]{ 286 | 287 | A @deftech{land} that holds @tech{sprites} and connections to other 288 | lands. One land is displayed at a time, and the displayed land can be 289 | changed with the @method[land% watch] method. 290 | 291 | @defconstructor[([get-lands (-> (listof (is-a?/c land%)))])]{ 292 | 293 | Creates a @tech{land}, given a procedure that gets connected 294 | @tech{lands} when the Scratchy program starts. The @racket[get-lands] 295 | callbacks for different lands can include each land in the other's 296 | lists. The lands available in the Scratchy world include the all 297 | of the lands reachable from the one given to @racket[run].} 298 | 299 | @defmethod[(watch) void?]{ 300 | 301 | Switches the Scratchy world view to this land.}} 302 | 303 | @; ---------------- 304 | 305 | @defclass[sprite% object% ()]{ 306 | 307 | A @deftech{sprite} implemented by the @racket[sprite%] class is a 308 | character in the Scratchy world. Each sprite has an image, a position 309 | on the screen (where the origin is in the center of the Scratchy world 310 | and positive Y-values correspond to north), a scale, an orientation 311 | (in degrees), and an optional cartoon bubble. 312 | 313 | The sprite's public methods are all thread safe, and they work by 314 | synchronizing with the eventspace in which Scratchy is run. 315 | 316 | @defconstructor[([land (is-a?/c land%)] 317 | [image convertible?] 318 | [x real? 0] 319 | [y real? 0] 320 | [key-callback (boolean? (or/c symbol? char?) . -> . any) void] 321 | [mouse-callback (boolean? real? real? . -> . any) void] 322 | [message-callback (any/c . -> . any) void])]{ 323 | 324 | Creates a @tech{sprite} that is initially in @racket[land]. 325 | 326 | The @racket[key-callback] function is called in a fresh thread for any 327 | key press or release in the Scratchy world, where the initial boolean 328 | argument is @racket[#t] for a key press and @racket[#f] for a key 329 | release. 330 | 331 | The @racket[mouse-callback] function is called in a fresh thread for a 332 | mouse click on the sprite. 333 | 334 | The @racket[message-callback] function is called in a fresh thread for a 335 | @method[sprite% tell] or @method[sprite% broadcast] call.} 336 | 337 | @defmethod[(forward [steps real?]) void?]{ 338 | 339 | Moves the sprite in the direction of its current orientation.} 340 | 341 | @defmethod[(move-x [steps real?]) void?]{ 342 | 343 | Changes the sprite's location in the X direction.} 344 | 345 | @defmethod[(move-y [steps real?]) void?]{ 346 | 347 | Changes the sprite's location in the Y direction.} 348 | 349 | @defmethod[(set-x [pos real?]) void?]{ 350 | 351 | Sets the sprite's location in the X direction.} 352 | 353 | @defmethod[(set-y [pos real?]) void?]{ 354 | 355 | Sets the sprite's location in the Y direction.} 356 | 357 | @defmethod[(get-x) real?]{ 358 | 359 | Gets the sprite's location in the X direction.} 360 | 361 | @defmethod[(get-y) real?]{ 362 | 363 | Gets the sprite's location in the Y direction.} 364 | 365 | @defmethod[(turn [degrees real?]) void?]{ 366 | 367 | Changes the sprite's orientation by turning it counter-clockwise.} 368 | 369 | @defmethod[(turn-to [degrees real?]) void?]{ 370 | 371 | Sets the sprite's orientation.} 372 | 373 | @defmethod[(change-size [amount real?]) void?]{ 374 | 375 | Changes the sprite's size as a factor of its original size 376 | by adding @racket[amount] to the current factor.} 377 | 378 | @defmethod[(show) void?]{ 379 | 380 | Makes the sprite visible.} 381 | 382 | @defmethod[(hide) void?]{ 383 | 384 | Makes the sprite invisible.} 385 | 386 | @defmethod[(set-image [image convertible?]) void?]{ 387 | 388 | Sets the sprite's image.} 389 | 390 | @defmethod[(say [v any/c]) void?]{ 391 | 392 | Sets the sprite's speech balloon to show @racket[v].} 393 | 394 | @defmethod[(hush) void?]{ 395 | 396 | Removes the sprite's speech balloon, if any.} 397 | 398 | @defmethod[(tell [s (is-a?/c other-sprite)] [v any/c]) void?]{ 399 | 400 | Calls @racket[other-sprite]'s message callback with @racket[v] in a 401 | new thread.} 402 | 403 | @defmethod[(broadcast [v any/c]) void?]{ 404 | 405 | For every @tech{sprite} in the same @tech{land}, calls the sprite's 406 | message callback with @racket[v] in a new thread.} 407 | 408 | @defmethod[(get-land) (is-a?/c land%)]{ 409 | 410 | Returns the sprite's @tech{land}.} 411 | 412 | @defmethod[(set-land [land (is-a?/c land%)]) void?]{ 413 | 414 | Returns the sprite's @tech{land} to @racket[land], removing the sprite 415 | from its current @tech{land}.} 416 | 417 | } 418 | --------------------------------------------------------------------------------