-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathnetpbm_test.go
290 lines (249 loc) · 63.1 KB
/
netpbm_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
// No tests but definitions used by the other *_test.go files.
package netpbm
import (
"bufio"
"bytes"
"compress/flate"
"image"
"strings"
"testing"
)
//go:generate go run helpers/testgen.go
//go:generate gofmt -w -s generated_test.go
// ppmRaw is a complete, raw PPM file, compressed with Flate compression.
const ppmRaw = "Ԛ\tL\xdbG\xd6\xc0\xa5|\x95\x12E_\xa5]\xb5\xd2vUm\x97\xddF]U[Uj\xb6\xcd\xeeF\xedn\xa26i\xb2m\x1aڒ&\xb4iK\xb8\x12RN\x1b\x8c9\x8c\x8d\x0fl\xb0\xb1\xf1}\x1f\x18c\x1b\x83\xef\x13\f6\xd8@8\xcai\xcedI/\x8e\x14\x04\xe40\xe1\n\xb0Ch\xb3Y\x02]\xa7\xf6\x9fdGO\xc8\xd8\xf3\x1f\xfff\xe6\xbd7\xef\xbdq\xf8\x81\xbdχ\xbd\xf9\xc1\x91\xc3\x11'?8\x18\xf6\xf6\xf1\x13\xe1a\xe1\xef\x9d\b;\x9a\x90\x98\x1e\a\v\xfb(\x0e\x06OHI\x0e{\xe5\xe5W\xf6\x1ex5\xec\xc0\xab{\xf7\xbf\xf6\xda\u07b5е\x95\x95\x95\xc5\xc5ť\xa5\xc5\xee\xae.\x9d\xa6\\\xc8$K\xd9$1\x83\xa0U\b]\xb5\xd57o\xdeX^^\xde\xe8v{\xce_\xefr\x9bM\xe6\xd9\xe9\x99;++k\x8f\xba\xad\xae\xad\x8d\x8d\x8d\xb546\x88Yd\x16\x1eVAG\xe8\x05h~Q\x16\r\x9f\x9d\x87H*\xc1\xc1u\x82|\x12\"ڠ\x14\x0e\r\xf4\xdbMF6>M\xc3̒S`\x89\x9f\u007f\xa8.W\xcc\xcd\xdd~\x84\xf0\xe3\xe3\xd7zڼrV\x01@\x1at\n\xbc\x1a\n\x8f\x92K\xa3R\xffy\xf5\xab\x8d\x0e\x13\xdfO\x1a\f\x86R\x0eQ\xcf\xcd\xe1\x11\xd2\xf2\x92?\xd5rP*N\xbeIL\x18v\x89\xa5Ep\x8bA\xbbtwkv\xbe\xb9kk\xedj\xbeKI\xf19\xf8\xfd5BW9\t\x8bL\xf2\xf9|\x0f\xf6\xbc\xe5\xf7\xf3\xa8\xf8V}Iiqƫ/\xed;|\xe8\xd0\xfe\x97_4\n\xf3\xfb\xab\xf92\x0e\xf9ƍ\x1b;L~\xcb\u007f[]*\xb2\xca\n\xbf4\xb1z\xec\xbcn\x1bo\xc0)\xc2\xc2Ϲ]u\x9bz\xce\xcd\xcd\xc1\xe1\xf0\xf0\xf0pr!\x89\x88\x88\x06\xddʨ\x99\u007fx\xfe\xb7\xbf\xfcœ\x16\t~\xa8V\xa4\x14Rw\x98\xbf\xbf\xaf_HE\xb7\xe8\x19\x00\xfb\x9e\xb4\xea\xe9*1crjjSg$\x12\xb9gϞ\xa7\x9ez\xeaȑ\xa3t\x02\xb2\xd7\xc1_\xefl`\x9e|\xeb\xafV)\x01l\x99ݨYXX\xdc\x19\xf2\x9b7o\xe5\xe5\xe6\x11\xe0QCu\xe2\xfb\xe1{\xec|\xab\x18kі\x03\a\xb4\xe9\x11\x18\f\xb6{\xf7\xee}\xfb\xf6ed \xcaE\x8c\x065\x19t\x06\x8f\xb4\x99X\x99\t\xa7yD\xd8\xe5\x01\xdf\x0e\x90\xdfYY\x1d\x1c\x18L\x8c\xfd\x8c\x95\x9fP\xa7.1\xc9\xc8V9\xc5!/l30\xc1\x92\x02\xa4\x1ay\x81\xb6\\\xe4\xf7\xcfmzptt4&&\xe6رc*\xb5ڦS\xb8\x95\x85\x1b\xfc\xe0/ز<X|wW7\xe4\xf0wV\x9a\x1b\xbd\x94\xbc\x94\x12t\xa2N%5\x18\x8c\x1eo\x93\xb3\xcem5\xebMJ\xaeQ\x90\x0f\x8c\xb7\xc7\xc6\x15\x95`\x81#\xddn\x90\xd9\xd9\xd9RVA\x97\x95so\xd7|\xd5\x02\x87\x8c\xc0 \x13!u\xa1+\xab\xab\x8d\r\r2j\x16\"\xe1c\xbb\xcd\x02\xfe\xbd\xffSpd9LU\x0e)\x16\x18\xa6\x82\x9e\xd5\xd4ذ\xdd8\xad\x97\x1a\xcbh\x99\x80\xf9~\xc5\x03\x13\x97\x92\xd3\x1d6\x1bt\xfcc\xa3\xa3l\x02\\FE\xbajk6}\xa4\xd1h\"\"\"h4Z.,~\xb0V\x04\x1c\x119\xf7\x8b\xcbW\xae<8\xc8\xe0\xe0\x10%/\xb1\xdbƽ\x1f\xfe\xc7]\xe0c\xd2\x13\xa0\xe3G!Қ*)&\xb5\xe8\xe6-\xff\xfd\xef{<\x1e`\x95\xbbv\xed:x\xf0`fz\x9a\x96\x8b\x02k\xdbW#`\xe1\xe1R\xa9\xf4\xfa\xf5\xeb?\xea\xff\x98B&\x92P\x80\xe7\x11<\b\xbf\xce\xef\x10\x18\x05\xe8\xd2R\x05\x14\xf0\xce\x1aW!\"\xaa\xb6\x8c\xa8SI6i\x8e\xcb\xe5z\xee\xb9\xe7\x9ex\xe2\t\x14\nUY\xa1fa\x93\x01\x89\xb7\x92V_Q\xacff\xc7G\x1eO\x8e\x8bĤǣS\xcevXؾm\xe07d\xd8%\x89\xfd䃕\xd5P\x92_\xbb\xf6=\xf0l\xa7\xde?\xd9nd\x9a\x84\x18\xa5\x8c\xbfi\xf8\x85\x85\x05\x1c\x0e\a\x1cKvv\xf6\xcc\xf4\x145/\xb1(+\xf6/\xfb\xff\x18\xf6\xbb\u07ff\xf5Ɵ\xeaUd\xbb\x94\xd0XI\x05v\xf1\x13\xe4\xf7\f\x99GH\xd6\xe9L\xa1\x82\xef\xea\xec\x161HUܼ\xb3'\x0f\x0fԊj\x15D\x93F\xb6\xb0\xb8\xb4]\xff\xd1o\xbf>\xfa\xc6\xfe\xbd{v\xef\xfd\xff'w\xef\xd9\xf3\xb7\x03/\xe1\xe1\x9f\xe5%\u007f\x9c\x9b\x14\xd9XE\xfb\xaf\xfc@\x80v\xa5%'\x85\xe6x\xed\x1fB$\xc6z5\xc5W=r\xe4\x85\xd3\xfdNQ\x97\x85S%)\x1e\x1f\xdf\xd67r\xe8\xc5\xf1g\x8e\xfd߮]\xbf\xf9\xf5\xd3g\xc3\x0f+h\x19\x06~\x9eY\x84\xc9M<\xa3\xe5\xe6\x05\xc2\x0f\x8e\x83bt\xea\xc4\xc4T\x90\xf0\xcb\xcbw\xa4b\t*\xf1\xccHC)\xf0l'\xde\xfc\xf3P\x9d\x04\x9cPF!\xa6T\xcc_\xd9JGU\xca\xf2\xe2\x9c\xf3\x88\xf3\xa7D\xa4\x14Y\x11L\xc3\xca2\n\xd1\x06>J\xcd\xc8\x04V`\x95\xe0\x03\xe1\a\xe2VSe\xd2\xd2 \xf9\x81VSHDy1\xbc\xae\xbc\xe8\xd9g\x9e>\xf2\xfa+\x80\x1f\f\xdeW-\u0530s\xf0\xe8,\xbf\xff\xdf^h~~\x9eH\xc0\xd1P\x17\f\x02\fP\x18=\x1f\xa5\xe3\xe6rqI\x91'\xdfDf\xa4E}rJ\xc5\xc8\xea\xfdI˽_@@%\xa1\x17\\\xbb6\x15\xdc\xfa/k\xcaˤ\x85iW\xeae\xa7O\x1c\xda\xffҾa\x97\xf4\x9e\x95\xf5\xday\xe8\x94\xcfȸ\\\x1a)_X\x82\xa7a\x12[t%`j@I\x90\x17>R3\x91\x05\x19QU\x95\x956\x9b\x1d\x8c\xd3\xe7\xf3\xa99\xb8n+7@\xfe^;_\xcbE\xf3\xd9,\xa0\x03\xc1L\xa1\xd1\xdb\x04\x8f=\x05B\xfao\x9b\xcb3\xe2O\r8\xff#T\x03\xfed\xa0F\xd0_#\xe8\xab\x16\xac\x87\rw\x83\x19\xb0t\x85\xc8\x18\x12\xe2\\L\xe4\xbb\xcbK\x8b\xab\xab\xab\x0e\x87\x03\fe\xa8\x90ի\x8b\x03\xe4\a\xd2af\xe7$}\xee\xaas\a\xc3?==C\xc0\xe20\xa9\xe7@JE\xca<\xe7\v@\x01\xc0,6\xa28\x8b\b}\xa9\xb9\t\f\xd2\xeb\xf3)U\x15\x15r^\x93\x96\x1e8\xff\xba\x962\xb3`\xc9I \xd0\rf\nSSӽ==n\xa7\xfd\xd33\x1f6ki\x1b\x8b\x1c\x88\xf4W\v0\x99I\xaezO\x95R\f\xf2\xdc&\x1d\xb33`\xfd\xb9\xb7\xbf\x1f\xbf\xf7\x168}BRR\x98\x9c\x9c\x12\x10S\xc1\xb2\x04\xf8\xed \x04\x02\xb9\xc9%\x03\xa7\xc3\xc2\xeb\xb4pz\x1e\x86\xfcLjN$,H\u0380\xc1\xe5\xf22\xbd^\xafRU|\xf5\xd57\xc1\xccBH\xc7\xf5U\xf3\xbb\x1f\x9e\xe4g\v\b\xc5iE\x84\x1f\x8c\xb1\xb1\xd1l\xb6\xae\x04Qf1\xe9\xb5Vq\xbe/`7\x18\xbc\f\u05c9\x93\xa3#\xc6\xc7\xc7A\x10\xd8\xd4\xd4\xe4v\aeγ3\xb38D\x02\xf09;\xc6\x0fL\xa00\xf3\\\\\xecy\xa7\xd3\xd9\xd0\xe0\x99\x9e\x9e\x0e\x86\u007fii\xb9\xc6jp\xca\v\x02\xb7\xe2 \x05\x98\x9b\x8a\x8e\x8c\x8b\xbd\x10\xaap\xee\xea\xc8\x15\x9d\x88\xd4W\x1d\x9a-\xb8\xebl\x05\x1b\x85\x88\xed:\xb4\x19\x99/\xbc\xf0b\xa8\xf8A~Z)\xe79\xcbB\xb0\x05`\x84K:\xbaY\x94o\x93\xe2\xc0\x14z\xb7\x19p\xb0N\xf2\xec3\xbf\xf2\xfbC\x96\x17[,\xb6r\x16z\xcb\x04\xf0\xa1d\xd0)$\xa23\xec\x0e\x87\xd9l\xe60\xa9z!~\xcb)\fՉ\x8f\x1fzm\xe4\xea7!\xcch$<\xa6[M\t\x92\xbf\xd7\xc6Q\xcbE?\x945VW\xadZE\xad\x82\xf4\xe0\xb6\x02\x13\x8e\x8b\xfc\x87\xd7\xdb\x1cB\xfeɩ\x19\x061\xbb\xcb\x1a\xd4\x16(K\x10\xa5\"ng{K\xff\xc0\xd0\xec\xf5\x1bE\x05\x18{)\xf1A\xfe\xbe\x1a!\x16\x1e%\x93\x95\x856\x1d\xf6x\x9a\x10\xe7O_vK\u007f\x1e|\x053\x87\x92\x13_\xc5\xc7\x1aE\x04)\x03\xa7\x94qKKr[\r\x8c-\xd31\x05\r\x89\xc6\xe0B\x9eѧ\xa5\xc0\xd9\u0604@\xb2\xdaM\xd2e\xe5y5\xb4K:Ɔ\xd9\x02\x0f\x03\xb4\x11\x04\x9c[\xfa\x04\xf0\xa6[E)( CP\x02\xf5\x1f\xfd\xfb\xeb\x83\x0f\xcf\xff\xb0\x02fJ$\x92\xa1(\xaa8l6\x16\xe6\"\b\xfe!\f\x81\xec<O%M\xa9TC\xc1\x0f\u0092\xe2\xfc\x8c~(#\n\xc0\xdfXU\"\x91ʡ\xe0\xf7\xcf\xcdi\xe4B\xaf\x86\x02]D\x01\xf8\x81\xb1\x10\b\x85Д\xa3\xef\x18\xb5\x15\x02Bb\xa8\"\x8a-\xa5Y\xcb\xc8\xc7\x12 *\x8a\x1a\r\xc6\xf4\xd8\b\xe8L`\xc3\xff\xd0hL\x88\xf8[Z\xdbPiqm\x06&D\xfc\xc0\xc7\xeax\x18\x99\\\x05ٵ\xe9\x04.7\xdd.\xc5Cd\x02 \x84\xa6\xe4\x9c\xef\xec\x82\xeaji\xee\xf6B\x11\x01\xa3\xe3\xa2 \xe2\a\x9a\x89\xbc\x189::\x01ݽ\x00\x8fI\xad\xe2\xe4B\xc4?T'\t\u007f\xfb\x8dť;\xd0\xf1W($F\x01\x06\"\xfe\xc1Zq\xf8\xbb\xef@z\xa9g3hl\xb2\x82\x8d\xcb\xeb\x90;\u007f\x10\x17\xc5\xc6\xc4C\xcao7U\xd9\x01?$\xca/b\xe7_T\x96\xab \xe5\xb7\x1a*mRH\xd6\x1f(\xff\x17\x9f\x9e\x18\x19\xf9\x1aR~1\x9f\xad\x85\xc6\xff\xf4\xdayi\x17c::;\a\x06\x06fff \xe2\x17q\xe9P\xf8O`\xb9\\\\b˥\xf5\"0\xe0oh\xf0\x04Y\xcbݮi\x95R\x8b\x18\x1bZ\xfd\x01iWS\x15\xf5\xfd\xe3\x87FFF\xee\xe6\x1a7i4Zww\x0f\x14\xfc\xaej\xb3SQ\x14Z\xfb\xed\xb2pP\xa9\xd1v{\x8d\xc1`\xe2px\xf3\xf3\xf3t:sff\x16\n~\x8f\xc7[\xa3,\t!\xfc\x97&6=?͠\xff\xe1\x16\xb5\xb9\xb9\x05\xe4/##W!\xd2\xff\x91\xab_3I9\xedFV\b\xcaqv~CE1\xaf0\xc7bq\xecد\x98ܮ\x06rQ\xd1\xfa\x11\x10\x84\t\x838ǫ)V\xb3\xd14b~wO\xff\xda\x0e\xb6\xe1\xe1+\xce:w^fj\xab\x9e\xfe3\xa6\x00\x0e\xa9^\aOA\xcb,!d\xebu\xda\xdb\xf3\x8bk;ۖ\x96\x96\xa6\xa7\xa7GG\xc7pY\xa9\xbdvN\x80\x17\x04`\xa6\x03\xb5\xe2\xe1:1\x17\xfbEvJ\xbc\xddb\x1a\x1b\x1d_{\xa4\r\x1c1ٰ\xc4\x1a9a\xc0)Z\xff\tJ\xf5ֵe\xf0&\xf0\xed\xadz\x06*)\xf2\xec\xa9\xf7\r:\xfd\xc2\xfc<HE\xd7\x1e\x836==\x93\x9e\x92\x8a\x83G\xf3\x99E\x99\xf0d5\v\xc4ռ.+\xb7\xd3\x02\x84\xd3a洛\xd8\n\x1a\xf2\xdcG\xefD\x9e>\xd3\xdcܶ\xf6\xf8\xb5\x95\x95\xd5\nM\xd5\xe4\xe4\xfa\xedy}\x83'9:®\xa0\n\xc9\xd9\xec\x02D!\x06A*\xc0K\xa5\n\xbf\u007f~\xedqm\xc3×\xdbۿ\xdcx\xed\xf56Ri\x8c\xaen_wo\xdfwߍ\xaf=\xf6\xcd\xef\xf7\xdbl\x8e\x89\x89\x89\xbb\xa9\xf1\x18Du3\xe8\xda\xe4\xe4$\x93\xc9joo\a\xaf\xb1X\xfc\xe2\xe2\xe2\xff\x16?p#\x1d\x1d\x9d\x04\x02!**Z\xaf7\xef\xd8\xf7\xfe+\x00\x00\xff\xff"
// ppmPlain is a complete, plain PPM file, compressed with Flate compression.
const ppmPlain = "\xec][r\x1c\xb9\xb1\xfd\xc7**b\xfe'\xf0\x06j\x05\xf7\xf7~\xdc\rh\xaei\x8f\xc2\x1a9\xc2#\xc7l\xdfyN\x02U(\x8aM5ɦ\xd8d\xc3&\xa6\x9b\xadj\xb0\x1e\a\x89̓\xaf\xff\r\xe6\x97\xe5\xff~\xff\xfc\xe7\xf2\xf7\xcf_\xee\x96\xdf?\xfd\xb9|Z\xfe\xf8ϗo\x9f\xbf|\xfez\xb7\xfc\xff\xbf\xfe\xf8\xe3\xee\xeb\xb7_\u007f\xfd\xd5\xc8q\xf2\xb2\xfc\xf5\xf9\xdb\xef\xcbo_>}\xfd\xe7\x82#\xfe\\>\u007f]~\xbb\xfb\xf6\xd7\xdd\xddW9&\x87%'SJ1\xfc\x8f\x8cex\xbd\xff\xfe\xa1\xdfO}\xc6\xcf\xcdr\xc6\xffN|y\x9b\xe4G\a<v\x06O\x19\xaf0\x87\xdbGZ\xf7\x91\xbd\x0ey\x9fC\x94\xe18R\xb0Kr\xd5$\x1b\x96X\xfc\x12c]\xa2\x8fK\xac2\x92\f'\xa3\xc8g1-Ѧ%\xf9\xb2$kyl*\xab\x8c\xb0\xa4\x1c\x97\x12\xe4<\x82\xfc}\x99\xbb䴏\x93\xe7f\x97\x12\xe5\xb3(߯I\xe7\xaa\xde$\xf9;)\xca\xdc\xf2Z|\x95!\xe7\xec1W\x1d\xbe\xff\x1e\x9f˜\xe3\xe5s\xc4m\x8e\xbc\xd6}X\xc1\xce*\xb8\xacU\xb1\x9a\x9cb\x18\xaf\xd6/Ap\x96\x9c\xe0Wp\x15\xb25)\b\xd6\xf3\xba\x84Z\xe45˱V>_\x97\x18\xb2\x1e/\xd8\x0e\x82\u007f9v\tA\xd6D\x90cW\x19\x82Y\xac\x17\xf9\xae\tk\xe0\xda\xc01^\xfe-\xc9w\x93\xcd\\\x179\xc99%y\x8d\xf2\xb9\xbc'\x9ee\x0e\xae'\x9eO\xe4\x9a\xc3Z\xe3\xdf]\xe5sYW8\xcf\xe0\xd7\xc5W\x19Iօ\x93\xefɺ\xc4zӵRt\xddL||\xec9\xac\xc30\xc5\n\xceE\xa6f'\xd8\x02F֎\xe9\n\xfc,\x1d?9A~\x12\x97<\x8e\xff\xe6\x81\xed`\x88+\xac\t`\x1b\xb8\x97\x91\xe5\xd8\\\xb2\x8c\xf5\x91s\x109\xee\x04k.\x18b\xbb\x8d\xb8\xca\xdfO2\xb7\xc3ށu$k\xa4$\xfc-\xee\x0f\xc06\xd7NH\x82\xe3\xc0\xfdB\x8e7\xa1\xca\xf1v\xe5w\xb1v\xb0&\xb8V\xe5;9;\xca\u007f\xfe\x8e}\a\xeb\x11kM\xae\x8f\u007fW搽\xcb<\xbc\xa7L\x8c\xbd\xd79d\xbfW\xfd\xa1\b\xc6 'E\xdeA\x1eS\x17\x80,\x95瞡\x1f\b>\xf09\xe5i.\xbb\xeea\x9b\f^\xb3\xac\x83l \xabq|\x1f\x17\xbb\x96h\xa9\xa7`\x10\xe7\xc0\xbd\xc8\xf1\f\xf9\xcc5\xb5\xea\xba\b\xc0m1N\xaeʼn\x1e\xe4d\xfd8ٟܚtȞ\xe0d.'\xfa\f\xf7\x03\xec3kh\xd7\x15u/\xc2\x1e&s`\xff\xa2.\xd5\xc7\xc4\xd8\xfb\x9a\xa3c\x06r\f\xb8\x06>DN\xa6\xe4\r\x9f\xb1\x13l{\xafr09\xcay\xac\x01\xe0\v\xfayJ*S\xa1GP\xb6\xcbw\x89\xf3\x04}#\x1b];п\xf3ˮ%\xee\x03s\xf7\xe1E\x8e\xf7A]\xca\x15\xb5\x05D\xeew\x9dG\xce\xcd\xf4s\x8b\xa2\u007fa]\x049g\xe7\xd6\xc5\xc9ޅ\xad\bW.\x8b\x85\xb2<V\xd5Ǡ\x1fa\xdd\xf3~\xd8lhw\xc8w_\x80\xf7\x89\xd37\x98\x03r+G\x95\xcb\xfd\x19B\xa7\xa6>\x0e\xb9\x18\x939`\xf9\x9c\xf7]\xa6Bg\xb6\xd4\t\flO\xd1Cdd\x1d/\xb8\x16\xd9'\xb6\xe1c\xfb\x01\x1e\xf9\xe3Eb\xeb\xd03\xa0FÝ\xc7b\x172܅\xbe;\xdbLM\xccG\xb7xA\xbd+\xf8w\xaf\x9a\x8cM\x87\x9dJV\xb8\x81䇆VRnc\x9d(\xbb\xa69B\x1b\xf2̩ɊV\x1aڳT\xe9\x1b\x9a\x04\xcb\xd4X\a<\x9c\x89\xf6.\xe9\xb3\xe2\x04\xf3\x8bd\xa7\xb6\xeb\v\x99\x98\x03c\xf3\x12\xb4\xc7}x\xd7~\xa8\x96\xb4\x11\xa0\x8ec\x88HW\n(\x91\xea\x11S\xdap\xdb\xf2\xf1p\xc2G\xf0\xe7m\xfb\x82\xd8\x0f\xa2\xb6\xfb\xdcL\x01l\x13\xb1\x98,j\x8d\x9a\xc2a\x82\xec\xad\xe7\xd8(\xb4h`2\xf2\xb9\xc8+(\x87`a\xaee}\x96\xab>K\x00\x9c\x18\x80\xc0\xc2s\xaeJ\r\x12\xb4k\xa4iI\xd5|U\xf5\x80xh°\t̆\x99\x01\xf0P\xdfq\xbc\xdd\xc1\x0e\xccu\xf5\x9a\xaa\xc8\v\xeeG\x165\xbb\x8f\x00\xaa\xa5\r/*I\x1f\xd8VH\xad`\xc0t\x0eրb\xa1J\x05\xb3ÕӘ\x1f?\x1f\xb6*\x11\x10\x86\v\u0379\x81^\x9dj̛\xcc\x01\x9c7\xacg+\xa6%\xa8\xc1N\xb1\x91\x9a\xa8J\xe9U\xa5\xdbH\x81CՐ\u007f۩\x0eP)\x8e\xdf\xcb\xd6R\xcd\xe5z\x00F\x92\xd2\xd3x\xf6\xa4\xf6\x80\x19\xc8O\x98t\xa0\x157\x93NMU\xc5L28\x86\xf2\x95tb>P\x98\xaf~OI\xa5s\x18\xa5p\x94F\xa2\v\x00\xeb9\x95\xf3\xd43\x9a\xe3\xb2\xf6A5a}W\xa5p\xe8\x1e\xf0j\x1e\x9c\xa0*'N/>\ae9G\xa3\xbf\r)p\f\x9ab\xabR\xd8ؗ\xa9\x94V\x95w\xb1\x1e\xbe\xfb\xe4\xf3\x18\\J\xc0\x00\xd7\x00\xf6\x05\xe2\x81t\x8c\x19\xcdV\xba\x8bH\xbd\xafXK\x1bU\xff\xda\xf7T\xe4\xb3\xc96\xf3\xef\xa9y\x9a\xa9\xa74\fs\xad\x9e\x81\xf9\xa3R7\xack\xa5*\xe5z\x93RT\xbc\xb7)M\x9c\xbe\xe2\x1c*/\xb9\xbf\x1bu\xa7\xa8R\xbec>\x0fnɗ\x9d\a\x8c\xb4>\xbc\x18j}(\x95\xaeC\x8c\x83}\xdf'\r\xaf\xfa\xccH\xe7\x10#P\xf2\xbd\xc8|\xe8\xc3r^9_\ue7aa.'\xa6v\xaa\xfb\x1e\xe7Gl\xdb\xe5L3ܜ)\xff\xa9\xff\x84\xd5\x12\xfb\x90/\x13\xa7\xaf7G\xa8\xceP\x8eǨ\xf2\xd3;>g\xca]\xe8\xe7П\xc3@9>\xf1<T\xcf\xd11چ\x99\xffw\xa5lC\xa4\xa7\xe1\x13\x87\x03\x93\x0e&\x98\xc8\xee(Qc\xd3\xf2\xe1\xd8\xec\x0eX\xae\xd0؇)\xa2ul\xe3\xe4J\xef\x9a|\xd5\x1d\x84\xceݤ$\xa2X\x0e\x03-s\xae$\u007f&\xdau\xfeM\xbb\x83\xd3\x18\x1a\x14\xee\x98h\x86\x13\xa9/\x9f\x83\xdau.\xea\x04t\xc5(\xc1\x1cT\x9a\xae\xdd\xd9صt\xf7\x98\xf6\xf2c\xb4sw\xd0!\x8fP\u007fd\x15\xe9\x0f\xd0܇\xac3\x83\xb0\x01\xae1\xdařn\xcd\x03*\xc8q;\xee\x05\fcA\x98Ah\x94?ܳ\xc5\x1b\xec\r^\xce\xd8{\xcf\xef\aѻ\xf1\xfb&?\xc1\x95\xc0\x16\x11\xbb\xc4WYw^u4\xeco\xedo\x99g\"\xfcih\x1f\xdfw\x97,\xee\x05\xb8\x01\xb9s>\x01\xed\uec7b>\xd1~p\xa1\xb7\x01Y:\xf0`^tg\x0fB.\x8a\xe4t+\ta`E]➸\xa0MY\x95g8\xe3~\x9f>\x8f\x8dd\xce\x1a\xc2\xd2\xc6ȇ0\xdc\x058--\xd4\n!W.7:_u\x89\x1e\"\x03,8\xc1\x00]\x99\"\xbd\xe1ݴ\xf2\xab\x8d\xca}\xd7l\x1c\xd4 ,\x05,V\xaff\xc7ƅC\xf5\xe7r9z\xb6^\x04\xd5s\xd4\xf6\xf3M[ݸ4\x9a\xc1`\xb9R\xf0`D?\xe1\xfe\xd0F\r\xaa\xcb+\x0f\xde\xe9c\xfa:@\ad\xe5\xd0!\xd6\x00w\xb7\xd6f\x1a6\xef_\xd1\xe8&\nx\xaa3j\xben~\x91\x87\xf9\xef\x8b^\v\x95\x8c*\xe2\xb5\x06\xfa}\x04Äw\xb0\xf4\x0eA\xfe\xc9\xf2\x80\x0f\x13\xf49\xfdEN\x0ew9\xc1\xc9o\xba~\x03\xf6t\v|)M\xe3\x0f\x9e\x92^a\x1f\xb9K<\x00?\xf3B\xa8\xbfl\xc9\xec:\x94a\xf0\x0ev\xa8\xe0\xa7tos\xa8\x93s\xa5\xcbG\xd9\x14\x95\x82[\xa0U\xd0`\xaa\xb4*\x13N\xe7\xa2+\xf4\x84\xc8\xf7\xcc.\xe2\\\xdb\xd5\x1b\x16\xaa\x06\x8c\xb4`\xaf\xc7X\xc0\x8b]\v\x03\xb7\xb0\xcb\x00\xd2\xd0Jr\xe5\x0e\xb0R\xd3Ǻ\x03\xab\xddVkd\xec\nW'\f]\x9cv\xc8\xf4\x80\x02\xe6 @5&\xc16\xe3v\xe5t\xbbY\x10/'\x99/\xb6dv\xf2^n\x81\xa1\xd2\x15\x9dƺ1\xde-ߠS\xa8\xc7jW\xc3]\xbah\x9c\x06\x95\xe0\xf6L3\xa44\x94\x91\xd5\x1dH/\x0fQ'\xf7\xcd\xe1\x18\xf5\x88\x9aHspw\xfe\xecqN\xb6\xc5\xc0t\xa5fT\xe3/\x14Of5n,\xd9`\bq\xe0\xb3\xc5\xe8\xe2\x15\x8a\x17w(ל\x00th\xd9\x16\x1f\\\x9b#s\xed\xe7L|СE̻\xa6\xd4'uv\x0eJ\xbdz\xfb[l\xcb5h2'\xd6\v\x9d\x17N\xe34x\xedx\x96\xab\xbb=ў\xb2\xe9J1\xe3d[\\\x13\x1d\x93\xa1Ş\x96\xac\x0eq\xc1\x87ܶ\x12(\x18\xc1\x8c\x88\x9a\xe0t?0\f\x01\xa8\xee\xde~\x9aU\x8d,M\x9dIQ\x03d\xa1'@\xe0\b\xc0vog8\xefbR\xd8\x06O\x14\xac\xe7\xaa\x01\xebd\x87\\\a\xea\xaa\vm\xd0I4H\xb7\x01\x98\xc1\xeb*\xb0\xf9\nk@u\x14\xa3\xe1+m\xffBD\x00\x82\xbf\xc4\x06W\xcbO\xbd\xa6\n\xfe\xf5\x14\xef\xf2\x86\x82\xfdĢ\xdb\x03\x91t\x812\xa4\xa7\x0e\x96Y\xbe\r=fH\xc8!\xa3m\x1b\xafR\xd5sOf\x11\xfcKM\x14\f\xd0] ܷ\xa0U\xb9\xa7d\x047V \x9eeF\x11'\x8d\x05\x17\xec\x1be8\xb2n \xc0^\x0fLg\x10oK@\x82\xf0\xb5^\xb1\xbd\xaa\xbe\xa5\xcf\x11\x8a\xc8j\x0e\xebkP6v\xbd\xcb\xef\xec\v6zy\xde\xc03\xf9$\x1f\x95\xd5\xf1\xbb\xb7\x06\xe77\xde\x1f\rhk\xd7\xe1|\vX\xef8\xf7\x9dM\xbf*\xc1\xfe\x9d>ߣ-\xb6\xfb\xd3\x12]\x92&\x10\f\x9b\xfeM\x98\xa8=\x02\x00\xec9\x03\\\xc1h!\x11n\f.\x87\t\xc8d\x1bp\xdc\xea\xd1\xe11\x1bMQ\x9f\xfe\\F\x8a\x03\xef\x1b/\xbey\x117\xbe<\x1e?ר\x01\xf3`\x04\xca(\xd3\\\vh\xc4zْ\x91\xf4w*'\xa1'M\xf8\x16f\x18w\x8f1\xd6r\x1b\x87{\x05&ө\x1cPF\xd3S\x99z3\xfb\xf4\xa9\xeb\x85\xeci\xda\xf6]\xeeo\xb5s\xbe\x1a8}\x13\xec#\x13'\x95\xd1S}\xa13\x80\x96F\x0fprHB#~\x02?\x1f\x19\xee7\x93c\xa7\xa2\xaeNE\x96E\xb9\x16<o\x06 g\xaee\xac\xf7c\xc0\xb2\xdde;\r\x85uQ\x86?\xa9\xf2\x87k\xa1\x87M\xed\xe4\xab\xd0a\xce\xe2p\xee\xe9\x9c\xfaL\xd53\xdd\xf9\x9c!\xac\xf5&\f\xdc\x1e,\xee\xbd>w\x91\xa7\xc4KU\x99\f\xdc A\x8d\x1cH\n*\xfb}i\x1cݩ\xe8\xbf+\xdb\xf7\xb7ġ\xb6\xae\xa1g\x85\x96\x18\x02\xd9\r\x1f%t\x1e\x9b[b잀ʨ6\xe8T\x88\xd6\xf4u\xd4m\xde^\x87y\xea\xfb!\x11\x05ܫ\x87\x9ei\x8f\x1e\x98ۦ\xea\x87\xc4{&Rh2\x05]\x1d\x8c\xd4v\a\x19r\x15\xbc\xf4I\x8c\r\x89RC\xfa\x05#\xbd\xf0\x1e\x91\x8c݃J}\xa0\xeaސzT\xef;\xd0a\xce^\xfbE\t\xad\xa2v-e}j!\xff\x88\xb9\xe8I\xc3\xd0\u007f\x11\xadڇ]M\xdf\xfb\x90\x04\xccQo\x83\xfc\xd4\"\x17^m\xbaM\xf7\xce\xd7\xc7]\\\x9b]yu\xd7R\xb6\xe86r\b\xdeR\xcf=\x85\x0f\xb5\x01ۈj#`\xcf;\xc8Ə\x1a_\x135S\x81\xc5[\x90\x80ʔ\xa3\xf0T=\xff\x061ve\xd7B\xfeMu9\xfa\x99\x11\xc9\x01\"\xbb\xf9\x10Y4b\x88\xad\x83-\xd3\a\xf5\xde6nB\x0fb\xb6C2x\xa5\xdd\xdb\"\xe1\x0f<\xcc\xc4\xd8\xf5_\xcb\xc0\xa1)\xdf\x15\x1a\xc7U\rx<8\xf64;\xa7\r\xf2V\x95\xb6\xcf\u0381\xf8\x1b\xe1\xf9[\xca(x\xfe\\4S\t|^\xb1[\xd6\xdd#\xb6\xed\x94\xc9\xd7r-#\x9fC\xbf\x9b7\xca\xf3\xd6E1?cs\x1e\fEcQ\xa3\xa0\xbe\xac`7g\xff\x81c\x9f\x18;ů\x9ax?\xa6\xfe\xc0\xb5\xbe\xf6\xb5lr\xc9h&\xb1F\xc5:y\xcf\xe1\xd3\xc4\xfa\x83\x85f\xf6lK\x86\xd6*\x8f\xddd~\xe92\xdf<\"\xf3oH&\x0f\x18#_\xa4\x99\x89{0[\xd0ckl\xfc\xc0\x80\xff\xc1\xaf\xfa*\xd7\xc2\xec1\x8d'р\x93\xb2W\x9d\x9a\xa9\xb4\xa7\f۪\x037\x0fA\r\x89\xa9\x14\xe6\x19\xa9o\x1fS\xb0ke@\xad\xb0\xd4\xd3L\x92.\x82\xcd\x01\xdc\xc9\x10:M\x8bV\x80mD\xa1\x12\x8bt\xa0\\^\x80\f5T\x10E\xc7`\x139\x1fn\xe0\xd8\xc8\x1f&$g\xc2\xd5HfVG\x9c2}\xa4G\xf7\xf9r\xdb\xca6\x05\xb5bY+\xafi^\xc2\xe3eQZPD\xf2\xad,\x89\x1dr\x13⏌\xa6\xf3\xafe\xac\xe6\xd6\xd2\xc0\xbco\xc1\xe4\fP\t\x13\xeb?\x9a\xa3W\x02\xf3=\xd7\xc41\x85i+e\xf1\xb8\xcc\xff\x90\xc6)\x1d\xbcAI\xae^i\x90\xf7\x01y9N\x03\xe84\x89A\xab\xef\x91\x1c#I\x882>V\x9dGkSp\xf0}瞂y\xf3cc\xb6\xb4(\xf0\xbc\xd5Њ\xbdT\xc5:\xb1\xfe\x9ctm\x06\xb3\xf5\xc8v\x04.\xe6\xc8=`\b\xce\xfcpd\x8eV\xf1\xae\x1aP\xcd\xcaƉ\x81z\x9ak\x96\xb5\x8eZhQ\xfeV\x15y\x06-\xaf\xabV\x9a\xac\x1a\xf8\xac\xd5Z5\x00uw\"\xa7\xcb]\xcb`Do\x194\f\xc2F0\xa958\x9f\x89\xf5\xe7͡IjU\x1dܩU\xff\xf5\xd6<\x92O\xfa\x0eu\xfe\xbe\x97\x85!\xd1,/\xbbњN\x1b\xa7J\x9e\x98\xeft\xc2!0\xf2L\xd9n\x9e\x9b]\xa5\xa5\xd4V\x16j\xc0\xde\xc2\xe1\xe3\xc4\xfas\xe7\u0602\xf7\x98\xa3j\xdcꙈ\xb2U~\u007f:\xe6'\xf9y\xe9k\x91\xfd\xa5\xafM&\xe98\xf7\x1c\xccO\xac?\x14\xbc1\x94\xd7\xd2R\x1cp\xe6\xde/\xb37\x1dR?\xd7Y\x10Z\x80i+\u007fb\xdbp~b\xfd\x12s\f\x81\x1c\xccJDY\xd6T\x8e\xc9#S&\xff\xa4kكN\xf7b\x0eZ\x1eG\xb3h\xe3\xc4\xfaE:m\x84͡E\x9dwmN\xf0\xa1\xab\xcd\xc1\x893e\xf2+^ˈ\xf9\xdd\x06\xa1]m5\x18gb\xfd\x02s\xf4rŨ\x9e\x81\xb2þu+Cp\xbe\xd5\xf2\xdc9\x8any~\xc9ҩ\xc3\\\xe2ZzBPT\xc70x\x86\a\x02\x8c'\xd6_8\a1\xdfJn\xb3\x1c\x9eM\x06A\xadg\xea\xf6S\x87\xb9H \xfdw\xbc\xcd^\xe66։\xd3K\x971\x86?ơ\x83Xfg<r\x9a\b\xd4\x19[(L\x99\xfcz\xd7r\xa8Pd\xb5@\xc5ڊ\xccBױ\xeb\xc4\xe9\xa5\xe7`GK\xad\xb6Ջ\u007f\xb0t\xfaV\x1fҟ\xc3KO\x1d\xe6\xb9\xd72\x04\x15ᄈ\b\x1f1\xfd\r/h\xd13\xb1\xfeXw=\xc4\xee\xa5=A\x8d~\xf6^\x88\xa9\xba\xf7\x93l\xfe.\x03\xe9w\x1d\x92\xfeW\x1f\fbnzqqV\xfd\x9b8}\xb59zl\x1a\xe3\tّ[\xbb\x11?\x80\xf9\xa9\xc3\\\xeaZz\\eEQ7T\xb0ͬi\xbb\xf7\x94\xab\x13\xa7\xaf8\a\vʰa\x81\x1bZB\xd9\xc9[\xbej\x01\x90d\xb4\xa6tծ\xb5(\xfa\xe4g_͟5\x87\xb6\xd1\xcbZ\\0\xa5\xd6\x16lL<\x99:̥}\xaf\x87Bg\xb6\xb5;tn\xe2\xf4g\xf1\x96\xa9\xee\xad\xcfh\xc3V\xb3'\xd8N\x99|\xb9x\xfe\xa1\xd0M\x8a\xad=i/\xe0\xc6b6\x13\xa7?i\x8e-\xa1\x1cET[\xa2\xdc1\xa9|\xea0\x97I\x06\xdctx\xb6\x8dc\xa1:\xb4\x1ebnT`\xaf\x8a\x89ӟ\x94cU41\x1a\xb2\xe7\xd0\xf4\xeci9AS\x879\xbbp\xb16\x98\x83\x8c\x87N\x03=\x87y,\x18\xcc_ѡ\xc5]\x92\xb6,\x9a8\xbdl\xa3\x90\x96?\xc4\xe4\xe8\xf3\xb8ʩÜ\x9d\xf7\xdaۄ\x0eE\xf8[\x91s-\\{\xafh\xad\xe2]\xf3\x1b\xc6\xe26O/\xe8:\xb1\xfe\xc8\x1c\x8c\xbba۵\xa8\xc5#Y$-\xffH\xb7\x99:̩k\x19\v\x89\xb0\xa8r$\x0f\xcc\xd6w-\xdf{\xd3gʽ\xbcװ\xe7<\x8c\xedv\xb5\xb5\xbe\xe6\xafL\xac_\xa00~\xd1\x02\xc2\xcc\xffG\xf1,\xf0\x96ޞ\xb2a\xa7\x0e\xf3\xc3kٛ|i\\\x87c\x91>m\xbd^\xb5(W\xd0\x18\x0f\xb6{L\x85\x85i\xf1\xddC\x93\x97\xe8ۨ˦\xe3\xf8:\xb1~\x819\xf6v\xc7Q\x9fG˝\x9e:\xcc\x13\xae\x05]\xaf\x88\xdf؊鶦\xd0A\x1b\x0e\x9d蕩\r\xf5lhc=\xe4\x8c\xec{A\x9e8\xbd\xf0\x1c{M\x95\xe6\x8fu\xda\x1c\x03\xb5\x01\x98+\x9a܍\xeb0\x87\x06\x13f\x8f\x87\xac[Kg\xfa\xb2\x9d\xc6\xcdlu\x87\xb2\x9b\x18\xbb\xd6\xdaP\xb57B\xd0\xdcc\xc6\xdf\xf8\xf6lw\xff\xd4\xf2\x8c\xbaF\x1f\"\x1e\xa6\xe5t\x98\xad]9\xb8\xf5\xda\xf4m\xd4TYæk\xe3{\x13c\xd7?\a\nD\xeb`S}6(\xc4:\xd0\x06iA\x1b=8\xdf\x1aH}\xb0x\xcb\xc1O\xb4۞a\xa8\xbf\x81\xae\xa0-\xa7\xa6\xb4\x82\xe8A\x9b\xfdh\x8c^hM\xb2&\xc6\xde\xd5\x1cZ\xf4X\x8b\x1f\x0f\x05\x9f{\x8c\x1f\x1a+k\x01\xf0\xb55:i<3si\x0f\x05\xf0\xafL\x87\x19\xd6\xe6\xd63\xbd\x1e\x8a\xc0+\u007f\x98\xe9#b\x1b\u007f\xd4EA=\x1c4'\x8d\xea\x9f\xc6\xf5k\xac\xa3\x9b\x18\xbb\xa596\xde@\xe5\x1d\x9b\xc2\xf8&#W4\xaeO\xc7\x06\x85\x87Ɲ\xf9\xd8\xc4\xf3\xe1\"\xc0\x17h:\x9f\xcdȇ\xef{SR\xfe\xa45\xd0gGr\x91\xcd\xe0\x0e\xd5ƴ<N\xbb\xf8\x06C\xd9=\xe4QN|\xcc9\x86\x06\x88\x86y\x85\x90\x8d\xd1\xe9^\xc0\x1at\xab6E\x8d\xad\v8\xf4#4\a\r\xa9\xe9\xc3n\x8cU6\x1b\xbf\xd7k\fjc\xa9\xe3\xfb4\xd6Y*j_7\x9eD\xf4\x10\xd3뀡\x81\x01\x1a\xd5\"F\x91\xf8F\xc3]tQ\xef\xdcȭ4&\x9es\xbc\xe2\x1c{\x87}mrY\xe9\x83\x19\x1b\xc0\x1d\xed\xe5\xd4}\x8bfl.Cޚ:t\xab\a\x8c\xe6ͥq\u007f\xa8\x1b\t?\xb1+\xad\x01\xa1\xd6K\x95\xcf\r\x9b8#>\xa8\x12\xfbC-\xeb0\x9f\xed\x9c\xe3U\xe6\xd8\xedߨuO1N7\u007f\x01\ab\xb4\xf6nQ|ou \x95\x0fe\xb3X\xbeZm\f\xbez\x8e{\xba\xf4|.s\x8e\x9f;G\x97\xa51\xec\x8d\xec\xb3\xe6\xd6n\xe3\x98{\xcb\xfc[\u0602Ϩ\xd35\x9f˜\xe3\xed\xe7\xd8\xf4\x96\xe6â\xbe\xedv9\xef\x0eܝц\xe7\x99y\xe5\xe4\xf5\xfa\x98\xf7t\xce\xf1\x0ekCi\x1c\xac\xc6\xc2n5\xb8,\xf4\xf4`PO\x9dq&\xbd\xc1oL\xf3\x9e\xce9\xe6\x1cs\x8ek\x98\xc3\xfc\xb2\xfcϧ\u007f\xff\xf6\xe9\x1fw˧o\xcb\xdd\u05ff\x99\xff\x06\x00\x00\xff\xff"
// pgmRaw is a complete, raw PGM file, compressed with Flate compression.
const pgmRaw = "\x9c\xd7kLS\xe7\x1b\x00\xf0\xc4\xfc\x93\xbf!\xfb\xb0d_日\xcb̾i\xe2\xa6.1\x99\xd1l:\xb7DW\x8dq\x9b\x9al\x8bb\x86\x1a\x8a\xd4ju\xe9V-\x14\xaaB\xb1\xad\a\xac\xf4Bk/\xb4\xf6zJ\xdb\xf3\x9e[[\x14\xb3\x91y\x99\x1b\xc4,\xb0dCd\x902\xc6ʀr9+-uT\xcfyρ\xe7\v=o\xce\xef9\xefyx\xcf{\x11o*{C\xf4\u07be\x1d\xdb\xf7\u007f\xbco\x8b\xe8\x83\x0fw\x8bE\xe2=\xbbE;+N\x9e.\xaf\x16\x1d(\xaf\x96VH*E\x1b\xd6o(ۼQ\xb4yc\xd9[\x9b6\x951\\17\x9d\xbd\xef1 z\a1>\xc3\xccMP\xe1\xf4\x1c\xb3\x8cxr\xe7\x9a\xda`\xba\xa2>[\xdb*w\xf5\xa0jD\xfb\xa5sB\xb0\x1e\xecF\x10\xda\xd7\xd0\xd8\xcf0\u007f\x04\x9b\x8d\xf5U\xd7[\xacɆЌ@Nz\xda\t\xca}\xeeQ\xe1*\xa3\r7\xad۶\xdeL6\xff%Hgl\xf6\x0e\x80\xd12*\u007f5!\x15k\xe4\xf4յ/\xb7%Z\x05\xf9\x9f\x9a\xc2X.\xc2\xe6\x91\xfc\xa5|\xf5+;\xeap\f\xddis\x87\xa7\xf8\xf5\xb8B\x96X\xe0\xc0\xea\xcf\xe6\x1b\xaa\xff\xbfVf\xf2\x02\xacㄦ\x97W\xcf\xf5\x94\xab\xbc\xb6\x9b\x0e\x14\a\x0eg&\xdf4pd\x97;\xd0\x0e0\x10>}\x9f\x8f\xcf\xdeV^p\a;I\xd4e\xa2\x80\xeeI\xb1\xf9O$\x9e\xeb\x11a\xbf\xc2\xf3\x0f\x9cO5\x9d\x88\xce/\xfc\x9aFm\xb4\xfev\xb1\xfd\xae\x8eXx%\xaa1\n\xf7\x03uMD\xfe\x87g\xbfVJ\x83o~)4\xf7*\xb1B\x10g\xe0\xfe\xac\xbf\xfd\uf17f\xa9\xb5\xab\xb6\x9c6\x12\xa4\xda2\x96K\xda\u0588\x17\xbd\xa9\r\xc6q\xb9ӝ\xef=\xf5\xda\xff\x14\xed5\x84\xff\x16r\xe8ؙS1\x02+F\xf2\xf0<\xa7\x1e\xea\xdd\x171\x17\xf2O\xa9v\x9dO+\xbf~\xfb\xf5\xad\x1e\x9b\x9f\xc6\xfe\v\xa2\xce\xcf\xc5\xef\xe9\x8d{i\x97w\xbax\xfd\xdb\xd6\xd5/\xad~GV%\t,\xf1\x18.\xe1\xe0?W\xfa\xba\x8eSq\xeb`\xb1Awp՚\xbd\xbaVK\xa5q\xa9\a\x17\x9e\xb2\xf2\x19S\xe5\x9d\xc6\xf7\x93\xb8ټ\xf8\x91;\x15\x15\x97\x1a\x9aͭ\xd7\x0e\xb5-\xf5\x98\xd7\xc2\xea\xa74M\xeeW\xdfMbd\x8bra\xd4M\xd6~k\x92\xb5\x1a\xd5b\xd9\xe1kx\x89\x0f\xeb\x87X\x9f\xef\xbcҹg]*W!\xfcT\x8d\xe6\xea\xc5\x10i<\x8e\x9c\xf5Fg\x1e\xb5\x94p\f7\"\xac\x93@\xe71\xe2\xfb\xaf\xf2\xa5\xa6)\x92\xa4\x00\x16>/?\x98\x9d\x8f3\x1eoi\x82\xa8\x84d\xf3iU5r\x8eXZ)\x1cX\xba\x98G.{\xb0ԓ\x88d\x9c-\xc1\xc8C\xe2\xb3 (\xbdU\x9ep\xa9C\xf1R\x8f\xd1\xe2!\x8eowXC\x96\xdc\tP4\x16\x03\xcfq\x8c\xd2Hm\x01\u05efl\x19t\x04& \xc0e\x86\xb9\x8d\xb2M\xe6\x01\xab\x90\x04ɣ\x83cwh\xb6\xe7\x8f\xca)\x01\x9e>w\x14O\xa6\xd9|6\xea\x00\xfc\x9e4\x94s}D}f\x92\xeb\xa5\xf1g\xe3\x10D\xde\xe4\xf2\x13v'{\a@\xc8b{\x96!\xb1&Õ \x82p\xbc\xb32\x8e\xea͋\t\x12\xdb\xfb9g\x91\xeb^\xf6\xe7\xdbs\xb3\xab\xdfU\xe8\x1c}\xb0\x93ӏ\xd4\xc7ټ\xde\xd4\xdd3\xa6\xbeY\xf0\xa4\xcc\xca=\t\xa6*R/rDq\xc3bhӡ\x8bߠN\t\x99E\xabj\xe8\xe7y\xdc\x17\xc2\xf1\x887\xbaX[\xe0Q\xc3\x16\xc0m4\xdf\b\b\xd5\xc1\xa6\xf1\xa8\x8ag\x14\x02\xbf\x13\xe6\xc7T$\x8f\x0fX`~\xc2\ue0cfbૅ.\xc2\xfez\x9e\x0e\x04/B\x97\xc1\xe01x\x01\x80G\v\xf5\xdfIQ\xa8\xc7o\xd8\xe0\x9b7\x85\rZ\x00R\x01߈\xfc\xa36B=ur\x00\xbe\x0f0\\\x87\xfa\xe4\xae,\xdc;LP\x9f\xd8ͳ\x8d\n\xd9a\x1eD\x8f\xf0x\x14\xea\xa9\x1a\a\xdf\xf3\xa1\xf5O~\xde\xc7\xe3\x8d\xd0\xfa\xe3'\xee\xf5\x8cB}\v\xcc'\xd4w\x99\x9e\xe48̻\xac\xdc\x1e\x0f|\xd4njk\x1f\xc0<pq\xfbxu,\x88L^\x85\xbe@\xaa\x9d\x93w\xa8\x02\f\xd3\xe5\x84W\xb0_\x13\xe1X\x84n]\x8e\b8AP\x97X\a\x00\xe5k\xae\u007f(\xe4\x04\U00098507_\xdc7\xe0\xba:\xff\xa4\xa0\x03P6=p\x1e\x94l\x05\x00\x9d\xac=\x15\x19\x10~\xfc\x1b\x95:h\x82\\\\\xf0\xf0DXr\xc0?9\xbb\x9c\xf3c\xbaJf\x906\x83x,\x16\xed\xd0}\xfaI\x17\xb3ܘ\xf3\f3ɣΆ\xfa\vjK\x86Y~<\xee\xce\xed*\xb5\x0f~\xfc\x9dYQd\xa2O\x99A'\xb3\xe2\x18\xd6w3\x17\xa7W\xeeg\u007f\xa8\xfd\" \xe0\xbe\u007f\x03\x00\x00\xff\xff"
// pgmPlain is a complete, plain PGM file, compressed with Flate compression.
const pgmPlain = "\xdc[[n\xdb\xc8\x12\xfd\xefU4\x90\xff\x80\xfd\xaaf\xaf\xe0\xfeޏ\xbb\x01\xe7\x8efb\x8c\xe3\x01&\x1ed\xfbsN\x15%\xcb2\xf5\f\x1fr\x020\xb2%\x8afU\x9d:\xf5\xe4\u007f\xa3\xfb\xe4\xff\xf7\xf5\xf1\xbb\xff\xfd\xf1i\xe3\xbf>|\xf7\x0f\xfe\xdb?O/\x8fO\x8f\xcf\x1b\xff\xff\xbf\xbe}\xdb<\xbf|\xfe\xfc\xd9\xe1<\xbc\xf8\x1f\x8f/_\xfd\x97\xa7\x87\xe7?=\xcf\xf8\xee\x1f\x9f\xfd\x97\xcdˏ\xcd\xe6\x19\xe7H\xf2R\\\xad\xd5\xe9\u007f8\xfc\xde\xeb\xe1\xcfc\xbf\xeb\x81\u007f\xa3\xef\xeb\x85\xfd\xc1\xbf\xf7'\x05_K\xf3U\xa2\x97\x14|\t\xbd\xcf%\xe0\xa8>\xe7ޗ.9_j\xf25\xe1d)\xaf_\xca\x15\xef7_r\xf45F{o\xfc.\x8e\xde\xf9\x95Ǥא\xd6{\xe9:\b\x9a}\xee\x06\xa1+^c\xd5\xdf\x13\xac\x93\xbb\x82\xf7\n~\x16(\xa2\xc1Z\x11\xf2\x16g\xe7\xe3\xbc$>6~&\xaa\x8f\xb5d\xb9\xf8肗\xd0\xec\xdeq\x94>\xbaBy\x13\xf4\x90\x80\xc6*\xaf\xe7\x86\xce\x17ȗ\x05\x9f\t\xbe\x13\xb2O\x19:\x12\xbe\a\xdd\xf4\x00\a\x0e|ו\xd4\xf6\xb0\xb1\xbem\x0f\x8f\x02\xb9\b\xec\x12\x8abYq\x1b\"\xec\n\x9b\xe6t\xfc\x1a\xf8\x8c6&\xc63d\f\xf0\x81Њ\x0f\x19:\xe9\x83^\x97\xfa\xa9)\xdf\x1f\xd6sr\xb9\x01\xdb\r\xf2\x13\xb7\x82Wɴ\xb9O\xc5|w\xfc{\x15\x9fw>f|7T\xa7\xd8\xc7w2t\x10\x80\x89\f(4\x88ޛk\x1c\x88\xbe:\xdc%\x8b\x9a\x8a&Sq\xf7\x8f\x1c\x1d\xcdV\x83\x8c~\x97\xa2Fj\xc8G\n\x1ah\xe0n\xf8f\xc1{\x00\x03\x14\n\xe08%\xbd\"\xf7\x01x\x802A*5*\xac\xf2Nj\x18^\x9d\x15NN\x96\x1f\xbbF\x82\xd1cP\xfb\xf22\xe4\xc1\x82\xdfw\x98\x01~R\x14\xe2\x01\x1cX\xee\x80ςrq\"O\xb7\xa6\xf7\xaa\xa6\xe9\xc0E]Rs\x99\xe9\xaa\xd7ߕ\x9f\xd38`\xe0ϩ\x8b\x10\xdf8\xa1\xa4\xe4\x94'\xb6\xb2\xf35\xd3g\x92\x06\xc8U\xf9L`\x17\xf8sj\xb0SK\xc3\xfd\xc2?);9\x8er#N\xa9\xfd\xc8qR]\xc6{\x8cug\xff^\xb4\x98V$\xbc\x85O%\x8fT\x8d\x8bWƸ\t\xf5\x81\xfbh\xc1ѱ\x89â\x18\x1c!\x9e\xd2T\a\x8a\x05\xe5,\xd3\u05f9\xfb\x10\xe0#\xe7!6\x1c\xba\x0f\xf4\xc8\xd8X^q\xbf(։OR\x91\x92Z\x1d\x8fU\x8cm\xb1\x88\xc6*r7e'nS\x9f\xbdȉk\x97∥\xf7\x94\xf1\xc6\xfe \xc6n\x15rg\x0eFڢ?\xd6\xfc\xfe\x1e\x80\t\xe5,\xf1\x81g\x17 U\xda\x10\xe1Ų:h\xa0\xeey\xadj\xb3\x05\xb3h\x1d\x95\xdc\xedK\xae\x19a\v\x8b\xa2\x9d\xf7\x85P\xe4\xc8Z\xf4\xf01\xa4\x13\x95\x14>*\xf5S?\x19\x1c\xa6\x92S_\x88b\xf4\xe5\x88;I\xc0\x0e\xed\x972y\xbc\x1f\xc7\xf8\u0601\x90\x11{\xea<Ϗ\xf7\xce\xe2J$vs\xaf\xb9Ո\xd6\xed\x1a\xc099\x9f|\x9d\xaa\xd5\x1eʇHF\x02\xae\x11\x90\u31beY!C\x1eH[\u007f8\xb0\xee\x19\xcck\xf8Oݬx\x17r.\xe5\x05jc\xaev\x9f\x9d\xc53-\xca\xce\\C 'e\x85\xb9\x91\x04\xe0\xff\x80\x00\xc1\x00\xceD=%\xc6\xfc\xb3\xc6~\xaf\x10\xc2/\xf5\xb3\xc1]\x90A\xa6\x04\xb2\x8d$^\x90KԄ\xdc1\xf00Oa\x91r\xee\x1a$\xeb\b\xb7@X\x17\xd5\x1c\xdf@:\xea\xe8X\xf2\xc0%\x96>H\x94\x10U]\xed\xf2\f\x91\xbb(\x97\xf0\u07b4\xea\x84abW\xd5˨pE<S\xd3\xd7*\xfa\xdd5\xc8\a\x9a\xe8E\x9cσU\x9b\f\xdf\x05\xfaY\xc9F*\xa7\x85\xebо=\x98E\xf5yz\xb4\x17q\xcc\x1c5\x82\x91\xcf\x12@+&\xba䡈J\xea\xc4\uf4b4bEx\xea5)u\x96\x9c\x9ayI\xef,R\xf8\x1e\x89\x8a\xe2\x1f\xa1\xf4\xd3x\xb7\xca@\x1d\x91D4)ޥ\xa8٘<1I\x8b\xf0+\x16\x91Lf\xf6\xc9F}\x8e\x05\x17H\\Uń\x93\x8d\x05\r\xfa\xa2\xf2\xd2OH\xea\x1a\x14\x99\x9c#x\xf3\xfa,`\xa9\xbf\xeb\xe1>\xe8\xa3\x0e\x05~\xa9\xb7\x16\xf1\xc7\voȜ\xb4\x8eB\xf2\x8c\xaa+\x85\xbaO\xc6{\xc1\x065U5Y\xedh\xaf\t8uQ\xa3Ug\f\x85b!\x91|\xb1M~\xacX\xb9\x12\xee\xdb\x03AC\xb9Қ\x1f\xd3\x05;\rLMk+\xb3[\xbb<\xf8\xeed\xa9\xbbB\x86\xaeI\xbe4\x0eM\x96賸g\x01p\r\xd6\xdfp\xbdؽ\x91\xef\xd3ĩ\f\xec-\xc4:\n\x88X\xc3p\x9f\xf56\x9cV\x19\x1a\x11C\x81\xd3\xf5\xe6\x1b\x87\xc5ʵ\xbe\x0f,\x92C.\xf4\xfb\x1b\xf4\xc1nCR\x9fV\\\xdfB\xcbZ\x80\x16;\x98\xc0\xf1@aw\xa3\xbf\xef\x176J\xcb,\x18,Q2LIm\x93\xc6\xfe\xa3\x85\xd558\xbdŶ\x17\xe85Ǽ\xc7U\xd0i.\xe7\x1a\xd9W\xe9\x83:\xd5\xdeKM3\xcbr\xe55pO\tqUs-\x94GLI\xe8\v\x93\x86\xfeX\xac\x8c\xa9m\x05۞\xb8Fo\x8d_ʯ\xdcʜ3Ɖ\xe3~Ը\xa2ͧ\xb7\x9c\xb7\x12\xd6\xf7\xf9>\xb0q6kQ',\xa0\x86\x06\xf9\xbc\xb6\xd5\xf8\xe8.\xc8\xfb\x06\x1eE\xfe5\xde\xfd\x9dN\x1f\x8c\xf7\xcd\xd2\xf5\x1b❻Xn\xc4?\xe6\x04\xcaݔ\xffU\a\xe3\xd7@\xec\xac\xc7\xfb\xa0S\xa9D\xeb\xf7R\xe7\x83{o\xf5\xbe\x86~V}C\xbf\xe0$\x04\xfa\xe2\x02\xe7}u\xfe\x96=\xe7cC::\v\xdc\x01-\xf7\xa6/\xca\xfeF\u05ceC\x8d)\x8e\xf6O\x17\x98Q\x05\xd19\xe1\x15i\xd9\xc5\xfaP;\xa3\x82\xe6\xfc\x92\xbd\u007f\x86-M\x03\xd9\xf3?&{\x15\x9bg\xf4\xfd\"\xfdz\xf6#Y\x9d\x97\x16&\xa3vMϵ\u008f\xe6\xee\xc5zcy\x9b\x12\x1e\xbb\x06\xcb:|\xaee\xf5B\xfdz\x9d\x0f\xb3\x0fi%\xdeOb=\xb0E\xe4\xac\x04\x1e\xe8-\xf7\xdb\xd2\xf7\f\xb5ZYH|,֯\x1ffã\xe5\xedҡ\x9f\xa1!\x84E\xfb\xf5ZFs\x16wy\xba7\x83>\xea\xc0\x87\xb2\xec(6\x05g\xb2ˊi\xae\x96\x1bn\xa4\x837\xaf\xefo\xd3\x1d\xb6\xb8\xa4\xae\x94\xe6\xda\xdfg\xabpѹ\xb4\xd8X]c\xdei\xdbϫ\x0f\xce\xfd\x9a,>\x97ֿ\xab\xed\xbd\xb6RI7\xf0|\x92\xc5\xe7\xd2\xc2ٛΫ\xca:%\x1d\xe3;s\x82\u05fcn\xb9\xb9t\x17,'iy,\x0eϯ\x8fj\x93\x903\xfb\x18\xf3\xe8\x83\xed\xb2\xae\x1f&Lu\xf98W9\nh:\xc9^c\xe5H\xf3O\xf9\x89V\xee\xcf\xe8\x833\xe9\xa0˪\xab\xecر\x9d\xa3\xbb5k\xc49\x94\xef1\x95\xd5\x16\xec4\xa7l\xf5\x9c\xdd\xe7\xc9\xe9\x8a\xedh\xad\xb5Oj;Eu\xc6v\xce\xd1\x16=\xeb)\xddi[k\x9f\xd4잧\x199\\\xa3\x0f\xdd?i\xdaJ\\k\xd7PǢ\xc7y~>}p\x1c\x1cE\xf7C\xb4\xd7\x11\xcb\xe2qNw\xbc/\x8fq\xd3裷\xddz\x19\xea7ݷ\uf3ce&g\xd3G\xe9\x9aӱ\xcd\xed1\xee:}\xb0\xb7\xc1\x8d\x10\xd8y\x87\xf7\xa4\xcf\x178I\xcb\xd6s\xb63\xdb\x16\x1c[\x04\x1d\x91\xebX3\xd98Z\xd7>\xf2(\xee\xe7}N\xa0\xd9.\xdd\"X/\xd1z\x06)\xed\xed\xa1ڮ\xf2\b\xe7\xcd\xee\xfb\xec\x8d\xeb\x98:\xf73a}Xe\xe0n\"\xb7\xecs\u007f7\xcf\bi\x9c\xe5F\x95\xc5\xf8\xc9\xf3u\xedM\x88\xf5\t$\xdd\xd73B\"6\xa6\xd3\xf5\x8a\x1c\xa7\xa9\xe7j\xdb\xf5\x9f\x87=JG\x9f\xbe\xa7翶cZ\x8e~\xf5\x19\x80:\xc8^oX\x99\x94a\xad\x89\xcfCq]-\x1b\xbeO\xd4h\xf7\xf5<\x1cG\xf5\xece\x90\u007f\xfa\xb8۠>9S\xd3\xd1yчj\xb8>\x149\xf2\xe6\xbe,\xed,\xfd]=\xffu~U!\xda\xcal\xb1\xfaVWbdx~\x84\xfe\xb1]\xbb\xe1ܡD[?\x15\xca\\v+Y\xf7\xfc\xac\xe3%kJ\xec\xa3qUI\xf9pX\x0fA,ry\xe8o\xf2y\x93\xddF}N\x1fǶ\xe7\x9e\xfd\x10{&r\u007fe\x91\xfdD\xe6]\x92;\xf8p\xfc\xe0\xb6=\xfe|\xa0>Ӳ\xddv\xeeµs\x93\x8f\xab\x0f\xae\xe4\xe5~gw흗\xf6\xeb\xd8\xf6\xcc\xccBb\xd18\x15\xf9\fYJ\xbf\x96m?\xe65\xdc'\xff\x9f\x87\xbf\xbf<\xfc\xb1\xf1\x0f/~\xf3\xfc\x9b\xfb7\x00\x00\xff\xff"
// pbmRaw is a complete, raw PBM file, compressed with Flate compression.
const pbmRaw = "T\x91?\xaf\x94@\x14\xc5\a\x16t\x98\n\b\x1a\xcbY\xa4\x00\n\x93\x97\x90W\xbc걲\n\xe6=\x9d%heaL6q\x13\xa3f\xd5D+\xd1@\x82\u007f\n0\xbb\xfdB6f\xb5\xb2\xf0#XX\x1a?\x91\xf7\x0e6\xd2\xfcrn.gνWD\xec*\xbf\x9e\xcf\xe3\xe2N~\xc2of炋\xdb\xe7\xfc\xc6\xea\xf1\x8b\xe5\x9a\xdf[\xae\x9f\xaf\x9e>\xe1G\u05ce\xd8qď#F\bQK\"\xbf\xf0\xeb\x03\xc9\xf6r\x8b\xd0Z\xe5\x17R\xe5\xd1o\xa4\xc5ON\x91i\xf9\xfa\x19\xb2\xd89&@\xa9\xb9\x9ab{\xc9\x15\x8a퓖%\xa8/&\xb6\ad\x17\xb6??\x00\xcd\xc9}o\x86\xbf\x917\xef\xa7\xc0\x9c\xbc\xea\x03\xf8}K\xea\x06\xfb\xbf\xbf}y˅$?\x8a\xb63\x81[[$\x1bxP4\x9d\xa5s\xf0I>mz \xed\xa6S'\a\xff\xccpb\b\xa0\x9bC\x1c.@'~@ \x80\xfa\xb9־\x1d\xc0\xb0\x11{\x15\xb5ˬ\x03h%\x883\xaf\x81z\x15\x9a\x86\x0f\x1cʏ\x14uz\xd7\xfb\x83:<\xadh\x05\x04\xf7\xa1\x00:s\xd3\x1e\xe7\x9eg\xa8\x8dK~\x8a\x03\xd3\xddL?\xc3\xc1X p!t\xa8\x98\x83\xdaw{\xb9\x88w\x9d\\\x8c\xea75j#\xc9\xc5\x15\xac\xbb6\xc3\xf7t\xa7\xc29\x88\x92\f\x86\xf4\xb3,\xb1\xc3z\xbaaR\xdbj\xff\x10\xfd\xda\x03ͱ\x8f\xe99\xe6\xd2\xfa\x85̣926\x99\xcc\xf6g\xf2^~&$k:\x1e\xf2ї\xf1\x9e\xeeX&\x1a\xf9\x9f\xe9?\xe2c\xe4o\x00\x00\x00\xff\xff"
// pbmPlain is a complete, plain PBM file, compressed with Flate compression.
const pbmPlain = "\xa4W[\x8e\xd3@\x10\xfc\xafS\x8c\xb4\xff\xab)!\xf6\n\xfc\xf2\xc1\x05\x1c0\xc4\"1\x12\t\xda\xeb\x938\xf6\xb8\xbb\xe7\xd5\x01'\xf1f\xa3釻\xaakz>\x13/\xe1\xcbq\xba\x84\xef\xd3i\f\xc7\xe1\x12\x86p\xfes\xbaN\xa7i\x1e\xc3\xd7_\xe7\xf38____q[w\xfb\x13ާ\xeb1\x1cN\xc3\xfc3\xdcW\\\xc24\x87\xc3x}\x1f\xc7\xf9\xb6\xe6\xedCx\xfb\bD\xc4\xfb{\xf9<n\xeb=\x02\xa1t\xc5\xed\xe2\xed\xe5\xb9 l\xa2\xb2\xde^\xf7\x9b\xc3\x17\xa4u\n\xbe؊\xff\xfbn\x18\xedz\xf2\x19\a\\>\xd8L\x17g\xdeb\xac\xc6{\xf6x*{&\a)\xf1G\xf9@\xfa\xec\xb7z[\x14iK\\\xb2f\xb2`\x96\x14\xcbH\x1513\xcf\xcb엢\x1b\x16\xd1bV\x94\x8a\x1bi\xbe\xafg\x06I\xadr\xa0B|!\x1e\xa5\av`߲\xe1n\xabrg\x0f6\xc9W\x902|ہ\x85,\x99\x12)\x89z\x05H\x93\x01S\xdfm\xdf\xd1K_\xe6\xc7\x15\x02AE\x99MŞ\x92\xbe\xd1\x16O=?J\xccc\x94բiF\x16(\x04+u\xd4\xfd\xabb\xd7+\x88\x8c\xa6LEU\xed\xc8&\x82ȸ*a\xdf\xebS\xf1\xb1\x19\xc2\xd6N\xb5B\x87B\ty\x91\x8d,/\xeb>\fP\xab%\xb2\x84\xbb\x1c\xa6q\xb1\xb6\xa6\xd8M:ҫ]HR\xa3\x1d?C;!\xa9\xd8\x19\xd1\xd0nE>F\xfb\x96\xe1Q\xd4\x10*=\xa0\xd5`6D\x94F\xa7hZ\xb3+\xa2T\xe1\xf7\xbc\xe9\xd3\xc0G\x87S\xe8@T\xdf;\"(\xd9\x0eIw\xd1\xd9\xfd\x04T\xbf\x80\xa5\xbdɻy'\xcc!\xa2ӷ\u007f\x97\xfa\x1e\xfd$T\x91\x8d\xa6\xaeP4\xf7p\xc5=]\xbf\xba\xfa\x15\xe33\v_\xc6\x1fE\x00\xa8\v\x18\xdb\xda%\xdc0\x93[fCLs\x84\xa4\xa1\x81\xee(:\xc6/*7\xaa\xeb\xe8\xc1o\x0f\n\xf54\x8c\x1e\xfc\xb5\xccs\x1fL\xdc\x14\x16͢\x14\xdcI\xbfh7?\x83=\\\xf3\xa7.\x1c\xf3\xdeG;>\xedd$Ǒ&\xfdh5T\xed\n\xec\x1d=4ϙ\xb7r\xff\xe8A\x8b\xb8{\xfe\x97\xbb\xa6K\xb5\v\xa3\xdc\x1e\x1d{t\xb7\x83hT\x8b\"\x1b\xff#\x98y\xcaq\xf4\xc8\x1e\x81\x95\xbc\xe1\x17q\xfaΚ\xcdi\xde\u007fd\xfd'\xfb\x82\x1b>o^9\b\xc5\xffs\xd3^\xf3\x12>\r\xbf\x0fÏ1\f\xd70\xce\xdf\xf07\x00\x00\xff\xff"
// pbmRawComments is a complete, raw PBM file with a challenging comment
// structure, compressed with Flate compression.
const pbmRawComments = "4\x8e=j\xc40\x10\x85_\xd6\x01\x83\x1a\xb7\xe9<\xe0^\x84\xb0\xa4\\]!E.`\x8cMD\xfc\x13,\x13\xd8F\xda\\'\xa7\xd8\xdc\xc4Gp\xe9Bh\xc2lH\xf5\xc10\xef\xbd\xef\xe5\xa8*z}\xb3\x8e:۷\xd4L\xe3R\xdbѩg\xb9\xd7\xf4Y϶]\xce4u\xd4L\xc3Ў\x8b\xd3Z\xabJUDDZk;R\xdd\xf7\xe4\xa6yq꩒\xc7e\xb6\xcd\xfb\x99\xbai\x1e\x9cVG\x05 \a\xee\x01 l\xe0+\x00\xde3^\x81\x8cc\xc1;\x90s*\x85\x05s\xc9\xf1\xf0]\xac\xde|%\xa0\xbc>\x06x\xc0\\\xe0\xe1C2@\x84\x01L\xce7\x9e\xfe\x18\xbd\xb4\x9c\x80\u007f\x86C\x88\xb7\x1cLD\x92\xbcO\x88\x80\xf9I\x9cE\xa0\xe4\x18d\xaf\xe4\xdd\xf0&\xbb\x9b\x11\x9f\x9c\xd7B\xfc\xee\xf8\x92\xb3\xf8>\x00\x1f\xf8\r\x00\x00\xff\xff"
// pamRawColor is a complete PAM file with RGB colors, compressed with Flate
// compression.
const pamRawColor = "ԚyL[g\xb6\xc0\xa5\xbcJ\x89Ы\xf4\x9eZ\xe9\xf5\xa9\x9aNf\x06uTM5Ҥ\xdbL\xd5\xce$Ӥ%Ӥ\xa1-iB\x9b\xa6Y\bY\n$`0f7^\xb0\xc1\xc6ƻ\xaf}\xbd\xe0\x18\xdb\x18\xbc/\xd7\v\xb6\x03\x06\xc2R\xc0\v6\x90\f\xe9ƒ\x82XBL\xc0l\x1e\x11\xdaL\x86\x84\x0e\xa9}i\xe6\xe8\xfcaٟ\xbf\xfb\xfb\xeewι\xe7\x9c\xef&\xbe\x16wd\xffޤ\x84\x9d\xaf\xbe\x1c\x97\xb0o\xff;\tI\xab\x9f\xf6\xeeKLJ\xd8\xf9R\xdc\xc1=G?\xdas`\xe7\xaeW^\x89K:\x9cx )9q\xdf\xce\x0f\xde\xf9kܾ\xf7\xf6&\xec\xfd .\x12;Y^^\x0e\x87\xc3\v\vaOO\x8fZY\xc3g\x90D,\xa2\x80\x8eWI\xf9\xce\x06\xeb\xcc̭\xc5\xc5ŵawfCW\x9c.\x83\xde051\xb9\xb4\xbc\x1c\xf9\xb9e%\x12\x19\x1e\x1enkn\x140IL\\V-\r\xa9\xe1\x95\x00\x15yT\\~12\xbd\n\x8bP\xf3J\x89\xc8SZ\x19\xbf?\x18\x80\xf4:\x16.S\xc9ȓ\x90\xb3\xd2>\xfbPQ#\x9d\x9d\xbd\xf33\u008f\x8c\xdc\xf4v\xb8%\xcc2%#\xaf\xcf\xces+\xc9\\r!\x95B\xf9\xfb\x8d/\xd7\x06\x8c~7\xa6\xd5j\xab\xd9\x04\r\xa7\x80\x8b\xcf,\xce\xf8T\xc5.\x92\xb3K\xf5\x02\xfc\x80S \xaa@\x18\xb5\xaa\x85\xbb[\xb3\xf5\xe2jh\x80\x14\x80SF\xf6[\x80\x80\x8d\xef\xac!bP\xe9~\xbf\xff\xc1\x91\xb7C!.\x05\u05ee\xa9\xaa\xae\xccy\xf9\xc5\xf8=\xbbw\xef\xfa\xfd\v:~i\xc0\n\x88٤[\xb7nm1\xf9\xed\xd0\x1dE5h\x12\x97\u007f\xa1gz!\xae\xc7\xcc\r\xdaA\f\xe2\xa4\xcb\xe9X7rvv\x16\x81@$&&\x92ʉ\x04䩠\x1d\xbcL\xc9\xfd\xedo~\xf9\xbf\xff\xf3\xa4Q\x88\xebo\x00e|\xca\x16\xf3\az\x03|JI\x9b\x86\xee1s\xefi\xbb\x86&\x17\xd0\xc7\xc6\xc7\xd7\rF\xa1P;v\xecxꩧ\xf6\xed{\x9b\x86G\xf9,\xc0\xea`-\xe3\xd0\xde?\x99Dxg\r\x11\xd2)\xe7\xe7\xc3[C>3s\xbb\xb8\xb0\x18\x8f8\xd1\xef\x10\xdc\x0f\xef\x85\x00\x93\x00cTՄ\x17\x16\xd6\xfd%++k\xfb\xf6\xed\xf1\xf1\xf199\xc8\x1a\x90ި y\xa1\xd5%t虹\xe7\x8fp\tYׂ\xfe- _Z^\xe9\v\xf6\xa5\xa5\x1cg\x96\x9ew(\xaa\xf4b\x92IB\xb6H\xca;\xb4\f\x9f\x05\xf0B\x80MR\xa6\xaa\x01C\xa1\xd9u\u007f\x1c\x1a\x1a:}\xfatBB\x82\\\xa10\xab\xa5.Y\xf9\x1a\xbf\x17\x02\xda5\xb4\xe2\xacTO\x8f\av\xf8\xa5\xe5\xd6f7\xb9\xf8bUI\x9aZ.\xd2juM\xee\x16\xbb\xc3e2h\xf42\x8e\x8eW\x1a\xb0\xf1\xbdf\x0eX\x85\x19\x1e\x1e\xdeh\x92\xa9\xa9\xa9jfY\x8f\x89}o\xd7\xfcV\x9eE\x8c\xa7\x93\b\xb0\x86\xd0啕\xe6\xc6F1%\x0fy\xfec\xc8l\\^Y\xb9\xff\xd7px\xc1\xa2\xaf\xb7\x880A;(\xa5\xe5\xb547n4O\xfb\xd5\xe6\xcb\xd4\\\xbf\x95w\xbf\xe1\x05l|\x11)\xdbb6\xc3\xc7?<4\xc4\xc2#\xc4\x14\x94\xb3\xc1\xb6\xee'\xa5R\x99\x94\x94D\xa5R\v\xb3R\xfb\x1a@/\xc4%\x15~~\xed\xfa\xf5\a'\xe9\xeb\xeb'\x17\xa7y̜\xfb\xe1\u007f\xd8\x05\x00\x9d}\x1e>\xfe\"dfK\x1dY\xaf\x00gn\x87\xee\xff\xbe\xa9\xa9)>>~۶m\xaf\xbf\xfeznv\xa6\x8aS\xe4\xb7\xf2zm<&\x0e!\x12\x89\xa6\xa7\xa7\u007f\xb0\xffa\xa9\x18\x14\x92Q>\v\xefA\xf8U~\vO\xc7+\xa9\xae\x96\xc2\x01o\xb79ˑ'\x1a.\x13\xd4r\xe1:\xcbq:\x9d\xcf=\xf7\xdc\x13O<QTTTW\xab`b2\xfc\x16\x9e\xbb\x8ez\xa5\xb6R\xc1\xc8OMޟq&\x19\x9d\x9dZr\xf1X\x97\x91\xe5\xdf\x00~M\a\x9c\u0094O>X^\x89%\xf9͛\xdf]\v\xfa\x0f\xbf\u007f\xa8S\xc7\xd0\xf3\xd121\xb0n\xfa\xf9\xf9y,\x16\x9b\x90\x90\x90\x9f\x9f?91N)N\xab\xc8K\xf9\xe3\xae\xdf\xed\xfcկ\xf7\xbe\xf9\xd2\x159\t\x12\xe1\x9b\xeb(A;\xf8#\xe4\xf7\x1c\x99\x8b\xcfP\xab\xf5\xb1\x82\xef\xe9\xf6\x80tb=\xa7\xf8ء=\xc1\x06\xb0AJ\xd0+\xc5\xf3ᅍ\xc6\x0f}\xf3\xd5\xdbo\xee\x8a۱=\uefdfܾcǟ_}\x11\x878^\x9c\xf1qazrs=\xf5\xdf\xf2{\xcc\\\x9f\x85\x97\x99\x91\x1e\x9b\xc7k\xa0\x1f\x99\x96\xe2VV\xdeh\x92\xa0\xce\x1d\t\xd8\xc1\x1e#\xbb^X92\xb2ald\xd3*S\x8f&\xfc\u05f6m\xbf\xf8\xff\xa7\x8f%\xee\x91Rs\xb4@\xb1\x01D\x17\xa6\x1dUq\x8a7\xc3\uf140ʒK\xa3\xa3\xe3Q\xc2/..\x89\x04¢\xb4\xa3\x83\x8d\xd5\"R\xf6\xc1\xb7^\xebw\b}\x16@\xc7GW\v\x80\xe5\x87٨\\VSYp\x16y\xf60H\xbc(\xae\xc8R2\xf3t\xfc\x12-P\xa4\xa0\xe7\xa6&\xef7\tq\x9b\xe1\xf7\x98\xb9.\x05E,\xaa\x8e\x92\u007f~~\x9eL$H*\x11\x8e\x9a\x8ag\x9fyz\xdf\x1b\u007f\xe8w\b=fn\xaf\x95\xafd\x15\xe0J\xf2B\xa1\u007fF\xa1\xb9\xb99\x02\x1eK-:\xa7\xe5\xa1q\x88\xe3\x1a\xa0H\xcd)\xe4`ӓ\x0f\xbd\x85\xca\xc9<\xf1\xc9a9=\xcf\xf7\xa3\x9e{\xbf\xb6i\xe8BZ\xd9͛\xe3\xd1\xdd\xffEe\xcdeQy\xe6\xf5+\xe2#\aw\xefz1~\xc0)\xba\xe7e>\x88[r\xf18\t[H%\x96\xf2\xabpTtZ\x9b\xba\xaa\xd7\xcaWq\x8aQ\xe7>R0Pe9'\xea\xeb\xea\xccfhqq\xb1\xd7\xefW\xb0\xb1\x1e\x13g\x93\xfc>\bPqJ\x00\x16sqq)\x9a%4\xbb[\x10)\x87\xfd\x16\xe0\x9b֚\x9c\xd4\xc3A\xfb\xbf\xa4jA;\x18\xb4\xf1\x026^\xaf\x95\xb7\x9a6\xdcMf\xda4\xf4r\xd4i\"\xf2\xe4\xe9\xe4\x03\x8b\vᕕ\x15\x8b\xc5\x12\x89D\xb4\xb5\xe2+\x8a\xcaM\xf2{\xcc\xdc.\x03\xab \xfd3\xa7\xc3\x15\r\xff\xc4\xc4$\x1e\x83E_:\xa9d\xe4\x11sO\xfa7a\x00^\bX\xcb\xe2\x8c`\xc9\xd5֖H$\xe2\xf3\xfbe\xf2\xdaZ\t\xb7EE\xdb<\xff\xaa\x952\xf2\xb22\xd2gfnG\xb3\x84\xf1\xf1\t\x9f\xd7\xeb\xb2C\x9f\x1e\xfd\xb0UE]\xbbɛр\x95\x87\xceMw^i\xaa\x97\tX\xb8\xcc\x165\xa3{\xd3\xf6so\u007f?~o\xef͛\xdfŤ\xa5066\xce#\\\xea\xb5\xf27yu/\xb4Z\x9b\\ղ\xbb\x8c\xdcn#\xdb\xfb(\xe4?dt \xbf,#'\v!\x91\\\xd6h4ry\xed\x97_~\x1d\xcd*\xf84l\xaf\x15\xf0<:\xc9OV\xaf\x99C\xad\xc0\u007f\xef\x8c\xcd\xcd\x06\x83i9\x8a6\x8b^\xa32\tJ\xfd\x9b\x0e\x83\xd1\xeb\x80C\x90q*idddzz\xba\xa5\xa5\xc5\xe5\x8aʝ\xa7&\xa7\xb0\xc8\xf3A\xdb\xd6\xf1\a\xed`y\xee\xc93)g\xedv{cc\xd3\xc4\xc4D4\xfc\v\v\x8b6\x93\xd6.)ۼ\x17G\xa9\xbdV\xbe\x9c\x86:\x93r.V\xe9܍\xc1\xebj\x90\xd8k\x8d\xcd\x16\xdc\r\xb6\xbc\xb5F\xc4F\x03:t\x8c\xe7\x9f\u007f!V\xfc\xb3\xb3w\xea$\\\xfb\xe5\x18l\x81\x17\x02\xae\xaai\x06\xb0\xd4,\xc2\xfa,\x80o\x83\t\xfb\x1c\xc2g\x9f\xf9\xbfP(fu\xb1\xd1h\xaea\x96<\xb4\x00|$\xed\xb3\xf3\t%9\x90\xc5b0\x18\xd8\f\x8a\x86\x8f{\xe8\x12\xfa\x1d\x82\xfd\xbb_\x19\xbc\xf1u\f+\x1a!\x97\xe1R\x90\xa3\xe4\xf7\x99\xd9\n\t\xf8}[ceŤ\x926H\x89\x0fnk\xd0\x0e\x9eI\xfe\x9b\xdb\xdd\x1aC\xfe\xb1\xf1I:!\xbf\xc7\x14\xd5\x16Ȫ\x90\xd5 \xa7\xbb\xb3-\x10쟚\xbeUQ\x86\x86\xaa\t\x0f\xf2\xf7\xda\xf8\x18\xc4\t\xb1\xf8rl\xcbᦦ\x16\xe4\xd9#\xd7\\\xa2\x9f\x06_\xcb( \x17\xa4\xd6\x03\x18\x1d\x88\x17ѱ21\xa7\xba\xaa\xb0]K\u007fh9&\xa5\xa2J\xd0ؘW\xf4\x99\x17\x11,\xcc\xf9\xcdT\xb5\xeb\xb4\xc7\xc4u+\xa9W\xd5\xf45\xb7\xedЭZc\x97\x81\xf5И\xe0\x85\x00\x97\x9c\\VF\x82\xa1\x05\x1az\xfb/o\xf4=:\xff\xa3\xeaU5\x9d@ \xc1\xd1T\xb1\x98\xcdL\U0010500d\x0fc\n\x04q\x9b\xea\xa82\x99\x02\x0e\xfe\xe9\xe9\xe9\xcaҜ\x00\x9c\x19\x85\x17\xe26\xd7W\tE\x128\xf8C\xb3\xb3J\t߭$×Qx\xa1Ug\xc1\xe3\xcb\xe1iG/\xe9T\xb5<|Z\xac2\x8a\x87j\xab\x8a^\x8a\xc1\xc3\xd4\x14\xd5iu\xd9)I\xf0\xb9\xc0Z\xfc\xa1R\x190\xf1\xb7\xb5w\x14e\x9e\xe9\xd02`\xe2\xf7Y\x005\x17-\x96\xc8a;6\x1d\xc5\x16fC\"\x1cL.\xd0k\xe5\x93\v\xcev\xf7\xc0u\xb44{g\xbe\x02\x8fVs\x8a`\xe2\x0f\xd8\xf8\xa8\v\xc9CC\xa3\xf0\x9d\vp\x19\x94zv!L\xfc\xfd\x0ea\xe2;o\x86\x17\x96\xe0㯕\nu<4L\xfc}\r\x82\xc4\x03\xef\xc2z\xa8g\xd6*\xcdⲵ\xc3\xeb\x98\a\xff.\x03+\xe5t*\xac\xfc\x90\xbe\x1e\x12\x97ya1~\x90UzAV#\x87\x95ߤ\xad3\x8b`\xb9\xff\xfd\x0e\xe1\xe7\x9f\x1e\x1c\x1c\xfc\nV~\x01\xc0R\xc1\x13\u007f|\x107\xf3\xc2\xe9\xae\xee\xee`0899\t\x13?ȡ\xc1\x11?\xfb\x1a\x04\x1clZ\xdbՖH$\x12\f\x06\x1b\x1b\x9b\xa2\xec\xe5n$*\x99\xc8(\xc0\xc4\xd6~|\x16^K=\xe5\xfd\xfd\xbb\a\a\a\xef\xd6\x1a3T*\xd5\xe3\xf1\xc2\xc1\xef\xb4\x1a\xecҊ\xd8\xfao\x8f\x91]t\xe9\x14\x04ٴZ=\x9b͝\x9b\x9b\xa3\xd1\x18\x93\x93Sp\xf075\xb9m\xb2\xaa\x18\xc2\u007f\xa1g\xd1J3\xb5\x9a\xefOQ[[\xdbd2\xc5\xe0\xe0\r\x98\xec\u007f\xf0\xc6W\fbA\xa7\x8e\x19\x83v\x1c\x044\xd6Vr\xcb\v\x8cF˖\xbd\xc5\xe4r6\x92**V\x1f\x01Q\xb8p\xc0\xc6w++\x15\xac\x12*\xa1\xd4\xe3\rl\xe5[X\x03\x03\xd7\xed\x0eWq\xee\xa5v\r\xed',!`\x03}\x16\xae\x94\x9a[\x85\xcfרUw\xe6\u0091\xad\x95\x85\x85\x85\x89\x89\x89\xa1\xa1al\xde%\x1f\xc4\xde\xe4\x01\x81\x17\x02\x82\r\x82\x01\x87\x80\x83\xf9<\xffb*d\xd4\x0f\x0f\x8dD~V\x99\x9c\x9c\xcc\xcfJ\xb3I\xf0A;\xe8\xb7\xf2z\xad\x0f\xef-\xfb,@_\x83\xa0]C/JO>v\xf8}\xadZ3?7\xb7\xb4\xb4\x14y\fdbb2\xfb\xe2%,\xe2\x14\xc0\xa8\xc8Ed(\x98\x85^\x88\xdbc\xe2t\x1b9\xddFv\x97\x81ݩgI\xa9\xa8\x93\x1f\xbd\x9b|\xe4hkkG\xe4\xf1\x93\xe5\xe5\x95Ze\xfd\xd8\xd8x$\x12\xb9\xd2ؔq*\t\x92R\xf8\xa4|V\x19\xb2\x1c\x8d$\x96\xe1D\"i(4\x17y\\e`\xe0Zg\xe7\x17k\x9f\xdd\xeef\n\x95\xde\xe3\xf1{|\xbd\xdf~;\x12y\xec%\x14\n\x99͖\xd1\xd1ѻ\xa5\xf10L}3\xf8dll\x8c\xc1`vvvF\"\x11\f\x06\x17\x0e\x87\xff\xb3\xf8\x97\x96\x96\xba\xba\xba\xf1x\xfc\x89\x13\xa74\x1aÖ]\xf7\x1f\x01\x00\x00\xff\xff"
// pamRawColorAlpha is a complete PAM file with RGBA colors, compressed with
// Flate compression.
const pamRawColorAlpha = "\xe4\x9b\tP\x9bgz\xc7w\x89\xb3\xa6\xa4i\x9bc'\xc9\xec4u\xb7\x9e\xed\xec\xd4ә\xbaI\xb6\xcdlZ\xbbk'\xb8\xeblH\x16\xc7&\x9b\xc3\a\xc6q\x02\xd8 #n\x10\bq#\x01\x12\xba\x85\x84,\x84\x10\xe8D\x17\x970\xa7\x0fb\xee\xcbvq\xb2\xbb\x1c^\x18\xc0\xc6\xc2\xe6\x12\xff\xce\xf7\xb9\xc6v\x8d\xcd\xdaF\x12\xde\xfdf\x9e\x81\x19]\xdf\xef}\x9f\xf7\xff\xbc\xcf\xf3>\x9f\xdf\xcf|\xf6\xee\xda\xe1\xef\xbb\xe9\xad7||w\xeez\xcfן\xf8o\xc7N?\u007f\xdfMo\xf8\xbc\xbf}\xdf\xc7\xdbwo\xda\xfa\xe6\x9b>\xfe{\xfcv\xfb\a\xf8\xed\xdc\xf4\xd1{\xff\xf5\xc5\xf6\xdd~\xbe\xdb}v\xfej\x87\uf38f|\x00|\xcf\xd5\xe6t:\xbd\xe6\xe6\xe6~0??\xf7lG{;\xb4\xeab\x88\xd8Y\x90\x16\xa4C\x92πF!\x82\xbd\xa6\x12\xd3\xd3װ\xb0\xb0\x00\xe2r:\x9d\xb81\xe3\xc0){\x1d*\x8c\x15\x98\x9a\x98|q\xd1\xe9\xf4r\xc7\xfd\xae\x95-\x01\xdf\x1b\x1e\x1e\xfe\xf1\x99\xa6zH8Yऄ\xa34\x8f\n\x9d0\x11\x82\xcch\xb0Rb\x90@\rA.\x9d\x02\xad0\t\xe9ԃ\xd0+E\x18\xe8\xeb\x85\xd5h@AJ\x18\xd4\xechȳ\xc3\x11\xfců\xa1*V`f\xe6\x86\xcf\xd3\xc0>2r\xe5\xb5\xces\x8d\x90sRI\x86\xfej!\x1a\xd5\xd9\xe0gǁ\xc5d\xe2\u007f.\u007f\x8b\xdb\xd7\xe8\x1fƠ\xd7\xebQ\xc4M\x83\x8e\x17\v>#\f\t\xa1\x9fAÍG\t7\tF\t\x03\x17\xec\x12H3)0\xe95\x98_Xذ\x9e\xd9\xebjj`U\t`Wf\xa3\xdb&@o\x95\b\xf6\xe2t$G\x85\xa0\xbb\xbb\x1b\x0f\xba\xae;\x1c\xe03SpV\x97\x8b\xa2\x9c\b\xbc\xb1e3\xb6oۆ\xad\xff\xfcS\x18DI\xe8\xad\x14@\xc6\xcdµk\xd7\xfej=r_w\xdcxNU$\x86Y\x96\x81o\x8c\x1ctZ\xf9\xe8\xb0\xf0\xd1W-F2\xe5\x00\xea\xec\xb5+r\xcf\xcc̀B\xa1\xc0\xcf\xcf\x0fY\x19\xe9H\xa3\x1e$?s\x92\x19\x89\u007f\xfc\x87\xbf\xc3\v\u007f\xf3<L\x85)\x18\xa8\x11C)b\xaeK\xfeޞ^\x88\x98\x898\xa3\xcb'\x99ﶳ\xba<\x94H\xf216>\xbe\"\u007fTT\x14\xbc\xbd\xbd\xf1\xd2K/a\xe7\xcew\x91LjB\x97Mp\xeb\xb3z6>\xd8\xf1\xef0K\x19\xa4\x0fY\rj\xcc\xce\xcem\\/\xdc\xd3\xd3ןO\x88K\x00\x83\xb2\x1f\x03\xb5\x92\xfb\xd8;\xad\x02\x98%\xc90i\x8a17?\xbf\"\u007fxx86n܈͛7#\"\x82\x8abq>\xeaUY\xe4g\x89\xef8g\xe4 \xf2\xe8^\xf0\xd3\xc2q\xb1\x8f\\?\x1e\xe7^t.y\xf5\xf7\xf5#8\xf0sp\x92\x8e\xa2V\x95\v\xa3,\vfy6l\xf2\f\x9cӳ\xc99$\x18\xaa\xe4\xa9\xd0\x14\x8b\xe1p̬\xc8?44\x84C\x87\x0e\xc1\xd7\xd7\x17%*\x15,Z\x05\xea\x94\x19\xcb\xfc\xc4_\u0087\x12\u0083\xd0\xd1\xde\xe1q\xfe\xc5E\xe73-M\x8d\xc8N8\x86\xdc\xc4`hK\xa4\xd0\xeb\rhhlFum\x1d\xcc\x15:\x18\x95<\x18\x84I\xa4\xf6uZx\x10\xe7&cxx\x18\xab]SSS(⤢\xdd̽Ǐ\xba+\x85\xb0\xc9\x18\xc8\xcfJ\xf3h\ft.-}\xbf\xa9\xbe\x1e2f4\xa8G?\x81\xd5b\x82si\xe9>\x8e\xb9\xb9y،\xe5\xb0I\x93I-S\xe4E\xa3\xb9\xa9~U\xfe\xb3\xa7\x9bp\x92\x15I\xf2\xfe\xff\xb5D\x8c\xa54\xeb\x04l\x16\x8b\xc7|`xhhK\x01\x83\x02\x193\n\xf6\x9a\xaa\x15\x19\xd4j5\xfc\xfd\xfd\xc1b\xb1\x10\x17\x1e\x84\xfe\x1a1\x19\v\xb2\xe2\xbe\xc6\xc5K\x97\x1e\xc8\xde\xdf?\x80\xec\x84`tXx\xf7\xb1\xdf\xf1\x03\x01h'\x8ez\x8c?\x9e\x1a\x86\xe6\xb2l\x18UbL_w\xdc\xc7\xd0\xd0\xd0@ꘗ\x97\x17\xde~\xfbmD\x9e\b\x83\x86\x17O\xcegO\x95\x10\x9c\x14\n\xa4R)\xae^\xbdz\xd7\xfa\x1f\x86B&Fa6\xa1\xfb\xc2\a\xb2\x93\xfc6!\f\xc2D\x14\x15)\xdc>\x06\xd5UvdP\xf7\xa3\xe6d\x1a\xb4%\x85+\xfa\xbd\xddn\xc7믿\x8e\r\x1b6 >>\x1ee\xa5*p\x92C\xc9\xfbn,c\xe1Ti\x0eT\xec\x18\x04\x05\xecB\xe8\xe1\x00\xd0N\x04!\xf1ا8o* \xdf\xf30\xf6\xdbv\xc1^\x88\xc0\xdf|\x04\xe7\x12\xbe\xef\x0e\xee+W\xfe\xf0\n\x11w\xf6|\xf8\x01Z\rl\x18E4(e\x02,\xad\xe0ó\xb3\xb3\xa0\xd3餖\xc7\xc4\xc4`rb\x1c̄`dF\a\xe2߶\xfe\x136\xfd\xfd\x8f\xb1\xe3\x9d\u007fũ\x92,X\xa5\f4\x951I}\xf8c\xb8\xef\xd6B>#\x14Z\xad\xd1\xe5>\xd0\xde\xd6\x01q~:\xcay\t\xf8\xf4\x83\xed\xe8\xab\x11\xa3F\x91\x06\xa3Z\x86ٹ\xf9U\xf5l\xe8w\xdf\xe1\xddw\xb6\xc2\xc7{#|\xfe\xf2yl\xf4\xf6\xc6\u007f\xbc\xb5\x05)\x94ϑ\x10\xfa\t\xe2B\x02\xd0T\xcez$~\u0088u\x12\x16\x1a\xe2R\xfe\xde\xde\x01P\x83\x03Ѩ\xce\xc1\xe5\x069\xa2\xbe܋\xdej1\xdaM\\\x94\x17\xe6`dd\xf5x\xc6\xcd\xcbA\xd0>_<\xe3兿}\xede|\xea\xb7\x1d\nV\x04\xf4\x82\x04T\x88i\x88\v\xde\a\r/\xe1\x91\xf9\x89=AN\xe2q\x8c\x8e\x8e\xbf\xea\n\xf6\x85\x85\xc5\rRI!\xe2\x83\xf7a\xb0\xbe\x88\x8c;\xef\xff\xe2g\x18\xa8-$\xf75\x06\x11\rE\x12\x01\x9cΥ\a\xb2\x97(\x8b\x91\x13{\x04\xd4#{ N?\x06Yf8Ԝh\x18D\x89\xd0\v\xe2\xa1ʏ$u\xc0\\\x98\xf2\xc8\xfc\x84թ\x98\x90I\x8b\\\xe2\x03\xb3\xb3\xb3\x1b\xb3\xd3\xd3 ϡ\xa0\xb68\x13?z\xf5e\xec\xfc\xf9\xbf\x90\xfc\xc4o\xf7T\x8a\xa0.\x88EJb4\x1c\x8e{\xe3\xc0͛7\x91Ơ\x83\x15\xff%\xf4B\x1a\xe9\xeb:A<\xb4\xbc8\xf0\xe8!\b\xf8\xe0\x17\x88\x8a\b\xc3\xfe\xdf\xecAI~\xf4\xaa\x9a\xff #r\x8d¼T\\\xb92\xfe\xca\xda\xcf\xff\xc2\x06u\xf1IH3\xc2p\xe9\x94\f{\xdf߆\xad[6\xe3\x82]z\x8f\x0euY\xf9H<\xf69\xb2\xe8q`\xa5'A\x94\x9b\x02\x16-\x18g\xb4\xb9\xe4\x18\x11\xbe\x1d\xf5\xe5\xc7P\xb1\xa3\x90\x1a\xb1\x1f\xe5ee\xb0X\xacd\x9d\xa7\xa7\xbb\x1b*.\x1d\x1df\xdec\xf1wY\x05\xd0\xf0\x12!(\xe0\x80\xf0\u05f5\x1e\x83\xa6\xc6fP\x02\xf7\x909\xfc\xefZ\x8a\x11\x11\xb4\a}\xd5\xf7\xe78\x84~\xf7U\t\xd1[%DO\xa5\xf0֞\xf7\xff\xf6\xee\xc4\x1ceD\x1dB:\xf5\x00\x0e\x05\xec\xc6\xc2\xfc\x1c\x96\x96\x96`\xb3\xd9H_ї\xcapJ\x95\xf3X\xfc\x84\x9d\xaf(@l\xc8\x17\xb0\xd7֭\xf9:\x98\x98\x98|\x91\x91L\a\xed\xf8\x01\xb2\x86\x93\x1ey\xe0\x8f\x8e\xd1w\xeb\xd4\xed<\xc8$N\xc4\xe9\x96f\x92\xbb\xab\xbb\x1bʒR\x94\xca\xf9h\xd6\xe4=6?\xb9\x0e\xd9\xd1\b\x0f\r\x01\x91\x8b\xae\xf5\x18\x8c\x8fO\xbc\xdc\xd5ى\xbaj+>\xdb\xf7k\xb4hX\xcbs\xfb\xa8\xd6[)\x04-2\x04\xf6S\r(WJ\xc8\xfa^\xb3\x96\x8d\xb6\xc7\xf4\xff\xbb\xfd\xef\x93_\xed\x00\xb1Oqe\rwll\xfc\x87´\xe3\xe4\x98?\xce}\x129\xc0Y=\x1b\xa7\xf5\\\x9c7\xf1\xd1f\xe2\xa2\xf3\t\xb8\xef\xe4Eb\x88RC\x11\x11N\x81\\~\x12:\x9d\x0e%%\xa5\xf8\xf6\xdb\xdf\x1e^\xebq\x10\xe5\xd1\xd1S)x\xe2{^k#rlV&c9\x06555\xa1\xa2\xc2\f\xe7\x1a\xd7̍:\r̒\xa4G\xd6\x01WۅZ\tB\x0f\xfacdd\x84̭\x9a\x9b\x9bQW\xb7\xf6\x9a859\xf5\x02\x9dz\x94\xd4\xfb\xf5\xc4Oh@F\xe4\x01\x1c\x0e<\x82\xea\xeaj\xd4\xd77`bb\xe2ŵ柟_x\xb6ʬG\xb5<\xf5\xb1u\xd0\x15FhRI^\x14\x0e\a~\xe9\xf2\x9c\xe8\xf2\xe0%\xbaV\x9cN\xc6z\x97\xaei2v\n\x97k\xc1\xab\xbd\xf7\x9c\x81\x8d\x9f\xfc\xe4\xa7.矙\xb9\xe1S&\xe7\xa3\xfa\xa4\xeb|\x80\xf8\xde\xd3\xda<T\x88\x93`\x91\xd2\xc91\xe8Z\xe5\xb7\xfak\v\xf1\xa3W_\x81\xc3q\xe39W\x8f\x81\xc9dA1'\U00061d6a'\xb1\xfej\x11\xd2\x12#`\xb5\xd9PQQ\x01.\x9b\t\x9d(\xe5\xa1c0P+\xc1\xaemob\xf0\xf2o)\uea0b\x14\xf2٨Se\xbb\x84\xbf\xcb\u0085J.^\x8eg\x8bKK0k\x14\xa8Q\xa4?\xd0\xe7\b\r<\x1c\xf0\xdfhllqKmll|\xf2\xe5\xfc\xb4\x18\xb4\x9b\xd7\xde\a\x94\xb9T\x14\x89yhk=\x83\u07be\x01L]\xbd\x86\xccT\x1a\xacEi\x0f\xe4\xef\xa9\x12!\x99\xb2\x1f2\xd9I\xb7\xd5\x06\x1b\x1a\x9aA=\xb2\x17\x17\xeb\xa4k\xc6^ʎEvl\x10\xca\x05\xc90\x88\x19\x90\xe6ӡ\x94\xf1P\x94\x1b\x87\xb3\xfa\xfc\x87ք\x14\xac($\xd2\xe8n\xad\x8d\x86\x1d\xa3\xa0 \xf9\xe8#\xd7\xf1V\xb2v3\x1f\x8dj\x16Nk\xf3\x975\x8f\xd0ub\x9d\x11\xb9\xde\xc3\xf4\x96x\xad\xae$\x1b\xa9\xa9Yp\xef\x19\xa0\xe3\xf9w\xff\xf3\xe7\xe8_\x03\xfe'5b\xdc\xd2Ҳ\xdc^\x1b\xb7Y,\xe0о\"s\u007f\x8f\xe5\x00V>\x1a\xcaXP*Un\xe7\xbfz\xf5\xea_\xe7$E\x905\x10O\xf27\x95\xe7\xa2P*w;\xbfcf\xc6G-\x17\x91=.\x9e\xda\x17\x13\xfc\x84v0\x18\x19p\xff\x99\xf0\xe23\x06M)\x84\x8c`\x97\xef\x8b\x1ff-\x9a|$%3<r>h\xd0\x1bp\"\xd0\xdfc\x1ap[\xffY,\xb6G\xf8Ϝ=\x87\xf8\xb0\xc3d\xef\x83'\xf8\x89x\xa9\xe5\xd3 \x93\x97\xc03=o\xa3\xaf\xd1\xe3N\xc0*M\xf1\x88\x06\x109pv\xec\x11\xb4\xb5{\xa6Gf\xe6\xc6\xec_d2h\xd0\xf2\xe2=\xc2O\xac\xbb\xa8\xaf\x02044\xba\xc5S\xfd\x01|6\x13\xe5\xdc8\x8f\xf0\x0f\xd4\x16\xc2\xef\xbdw07\xbf\xf8\xac\xa7\xf8K\x15\x850\bi\x1e\xe1\ufbd1\xc0o\xf7/=\xda\x1feѫa\x91\xa5.\xf7>\xba3\xf6\x13\xf9A\xe0\xa1 \x8f\xf2[\x8d\xe5\xb0\x12\xfcn_\xfbb\x14$}\x05eq\x89G\xf9\xcd\xfa2X\xa4\xee\x9f\u007fb\xed\u007f\xfd\xd9\xfb\x18\x1c\xfc\x8e\xeeI~\x89\xa0\x80\xecwr\xf7\xfa\xef\xb2\xf2\x11\xf6\xd5!\x9cokC__\x1f&''_\xf0\x04\xbf\x98\x97\xe7\xf6\xf8G\xe8\x1e\x8f\x1e\x8c3\xa7o\x9d\xad\x12\xfc\xf5\xf5\r.9\x0f]\xcd4J)L\x92d\xb7\xf9\u007f\x97M\x88\xe6r&>ܵ\r\x83\x83\x83$\xff\xf4\xf44\xd9{\xd8\xd1\xd1\xe9v-\xb0WV\xa0Z\x91\xe96\xfdk7q\x11\u007f\xfc \xac\xd6*\xe8\xf5Fp\xb9|\xb2\xff$/\x8f\x8d\xc9\xc9)\xb7\xaf\x81\x86\x86FT)s\xdd\xc2\xfe\x8d\xb1\x00yIa\xd0\xeb\xee\xf4\xc1\xb5\xb4\x9c!\xeb\x1f\x83\x83\x97=\xa2\x83\x83\x97\xbf\xa3\xb0\xd3c\xd1j\xe0\xb8\xeeL\xc8*@}i\x0e\xf8\x19\xb10\x99lXWϾ\xd8둕\x99yk\x0f\xb0\xc6\x1aH\xec\xef\x1b\xd59P\x15$\x82\x95\x96\x84\x8e\xce^\xac\xb7\xe7@.\\\xb8D\xf6\xc0'D\x1e'{\xf6\xd7b\f\x88\xbdM\x97\x8d\x0f\x05+\x12\xb9\x8c\x18\xe8\xb4\x1aܸ9\xe7\xbd\x1e\x9f\x01\x9a\x9f\x9f\u007fvbb\xe2š\xa1\xe1-\xf4\xe8\xe3\xe8\xb2r\x1f\xabW\x80\x18\xb7\xbe\x1a\ty\xae\xcfK\xfe\x1a1ǂ`5\x191<4\xb2\xe5iy\xfe\x8f\u0603Ą\a\xa3J\xce \xcf\x06\xc8\x1e\xf0ʇ\x9f\xe7\x12\xaf\x11\xf1\xfc\xac.\x1f\xf1!\x01\xf8tχ\xd0ku\x98\xbdy\xd3{qq\xf1\x99\xa7\xe9\xf9\xc7\xdb=d'\x8e\x1d\a\x9dr\x10\x02v&\")\xa1Pq\xe2\xc8\xfdA\xbb\x99\x876\x13\x8f\xec\x03:_\xc1E\xab\xb1\x80<\xbf9\xf0\xf1/\x11\xb0w\x1fZZ\xce\xe1i\xe3]\xb9wjɫT]\x8e\xb1\xb1[\xcf\u007f\x9d\xaao {U\xac\n&DY1(H\xa5\"\x83FEzj\n\xa4R\x05\x1c\x8e\x9b\xcf\xfd)p\xdf\xd1ċhm\xfdf\xf9,\xb7\xb1\xb1\tLV>\xda;\xba\xd1\xd1Ճ\xdf\xff~\xe4\xad?%\xde{\xce\x05\x1c\x8e\xe7,\x16\x1bFGGI\xf6\x91\x91a\x8f\x9c\xcfx\xca\xc6\xc6\xc6~\xc8fs\xd0\xda\xdaJ\xf2''\xa7`nn\xee\a\u007f.\xfc\x84f\x9f?\xdf\x06\x06\x83\x81\xfd\xfb\x0fB\xa7\xabXWs\xff\xbf\x01\x00\x00\xff\xff"
// pamRawGray is a complete grayscale PAM file, compressed with Flate
// compression.
const pamRawGray = "\x9c\xd7klS\xe5\x1b\x00\xf0\x84\xfc\x93?Y\xfc`\xe2\x17\xf9bfB\xfc\x86\x89\x17$1\x91\xb0\xb8I1@\nN\xee\x89\x1a.\x110l0\n\x053\x1dt\xebV`\xebh\xcb\xd9(\xebe-\xbd\xac\xa5\xd7ӵ}\xdfsk;\x18\xd1E.\xa2#Ā\x89\x96\x81\x90✝c\x1d\xdbkڮ\xb8\xc29\xef9\xe3\xf9\xd2sޜ\xdfs\xcey\xfa\x9e\xf7\"_V\xb1qUu\xad\xac\xf2\xbdw+d5\xabV\xcaj\xf3G\xd55\xf2ZY\xe5[\x15k\xaa6m\xa8Z]\xf9\xf6ҥ\x15\xb5\x9f\xcaW\xd7n\x96\xd7T\xae\\_\xb5\xf9\x93\x0f\xabV\xd7TԬ\xad\x96U\xaf\xaf@B1=\x99\xbb\xea1\x10z\a=6\x85\xa6\xc7\xd9pf\x1a\xcd#\xee^:\xa36\x98N\xa9\x0f\xb7\xf4(]ä\x9a\xd0~\xe1\x1c\x97\xacG\x86\b\x82\xf3\xb5w\xdcA\xe8\x8f`\x97\xb1\xad\xfel\xb75\xd9\x1e\x9a\x92\xc8\x19O\x1fͺ\x8f\xdc(\x9ee\xb5\xe1\xce%+\xde43]\u007fI\xd2Y\x9b\xbd\x1f\x02N\xc1\x16\xce\xc6\x1b\xe4\x1a%wz\xf1˽\x89\x1eI\xfe\xa7\xce0\x00\x00\x84\xcd\x0f\v\xa7ʅ\xafԴR\x80\xfc\xc8\xe6\x0e?\x16\xd7c\x8d\x8aD\x9eC\xab?Wh8\xf0\xff\xc5\n\x93\x17\x82\xfe\xbd\x9a\x9b\xa2zzx\xa7\xcak;\xef )\xe8pf\vM\xe9\xed2w\xa0\x0f\x02\x18>xU\x8c?\xb9\xd8t\xcc\x1d\x1c`H\x97\x89\x85\xba\xbb\xa5\xe6?\x898\x00\x80\xb6\x9f\x12\xf9\x03gR\x9d{\xa33\xf9\xa3I\xd2\xc6\xe9/\x96\xda/\xeb\xe8\xfc+\xb1\x1dQ\xbcO\xb7v҅\x03O\xad\xb6\x81\x83\xdf\xfcRl\xbe\xd9\x04\x8aA\x1f\xc2\xfb\xc3\xfe\xbe\xbf\xf3\xbf\xa9\xc5\v\xde?h\xa4\x19\xb5e\x14\xa1to\aU\xf2\xa6^\x1c\xa7\x94Nw\xe1\xe9\xd9\xd7\xfe\xd7\xd8\xd7L\xfb/\x10[w\x1d\xda\x1f\xa3A)\x92\xdbf\x04\xf5\xfd\x9b\xeb#\xe6b\xfe\xc7*\xd9\xd1L\xd3\xd7^\xdcc\xf3s\u0fe0[\xfdB\xfc\x8a\u07b8\x8esy'K\xe7\xbf-_\xf8\xd2\xc2e\x8a\xfa\xba\xc0\x1c\x0f\xa8:\x01\xfe\xf3>\xdf\xe0\x1e6n\x1d)5\xe8\xb6,X\xb4N\xd7c\xd9g\x9c\xeb\xe1\xb1{\xbc|ʴ\xefRGu\x922\x9bg?rg\xe3\xee\x13\xed]\xe6\x9e3[{\xe7z\xe0\xb5\xf0\xfaǚN\xf7\xab\x1f$\x01\xd3ݔ\xefu\x13-ߚ\x14=F\xb5\\\xb1\xed\fU\xe6\xc3\xfa\xfb\xbc\xf7w\x9e\x1aX\xbb$\x05\x00M\xedo֜>\x1eb\x8c{\x88\xc3\xde\xe8ԍ\xee2\x0e(#\xc1;\b\f좿\xff\xb2Pj\x8ee\x18\x16\x82\xf0Q\xe5\x96\xdcL\x1cy\xbc\xe5\t\xa2u\f\x9fϨ\x0e\x10G蹕\xa2\xa0e\x10\xddpك\xe5\x9e!\xea\xc6\xf8\x12<\xbcNo\x0e\xc2\xf2K\x95\t\x97:\x14/\xf7\x80\x93\xdf\x17\xf8v\x1fh\x98\xb2+!I\xc6b\xf0\x19\x0eXM\x83-\xe0\xfa\x95/\x83\x8e\x06\x12\x02\x9eD\xe8\"\xc97\x98\a\xacR\x12$w\x8c\x8c^\xe2\xf8\xee\xffH\xc9J\xf0ܑ\x1dT2\xc3\xe7sQ\a\x14\xf7\x8ca\xa7\xd0Gt\xdb\xcc\b\xbd4\xf5\xb4\x1f\xc2\xc8\x1bB~\xdc\xee\xe4\u007f\x00\x18\xb2؞fH,\xca\n%\x88\x10\x02\xef\xdc\x14'\xf5\xe6\xd9\x04\x89\xaa;\x82\xa3\xc8Y/\xff\xfd\xed\b\xcd\xf8]Ň\xe3\xb6\f\b\xfa\x87mq>\xaf7\r\r\x8f\xaa\xcf\x17=\xa3\xb0\n\x0f\x82\xa9ݩ\xe79\xd1x\xceb\xe8Ց\xb3ߠ\xae\t3\x8a\xd67s\xcf\xf2\xb8/DQ\x11ot\xb6\xb6У\xc6M\x80+8\xb1\x1e\x10j\xc5\r\xe3Q\x95H/\x84~'Ώ\xaa\x18\x11\x1f\xb0\xe0\xfc\xb8݇\xef\xc5\xd0ׂ\x9d\x84\xfdm\"\x0f\x10<\x8e\x9d\x06\x83\xbb\xf0\x05\x80\x1e-\xd6\u007f\xd7@b=uΆ_\xbc5ڰ\x05`\x1a\xf1\v\x91\u007f\xd4F\xacg\xbfJ\xe3\xd7\x01\x86\xb3X\x9f\x94\xe5\xf0\xdea\xc2\xfa\xc4\x1a\x91eTȎ\xf30\xba]ēX\xcf6;\xc4\ue3ed\u007f\xf2\xb3\xdb\"ވ\xad?\xb5\xf7\xca\xf0#\xac\xef\xc6\xf9\x84\xfa2\x1aN\x8e\xe1\xbc\xcb*\xec\xa9\xc0Ƿј\xf6\x1a\xceC\x97\xb0\x8f\x1f\x88\x05\x89\x89\xd3\xd8\x17H\xf5\t\xf2~U\x00\xa1A'\xbe\x82w4\x11\x81I\xe8\xc2Ɉ\x84\x1d\x04{\x82\xb7\x03\xb0\xbe\xae\xb6\xebRv \xb7\x18e\xf8\xf9u\x03\xa5k\xf5OH\xda\x00\xe52飰l)\x00\xb9d\xcb\xfeHZ\xfa\xf6\xefQ\x83\x83\xa3\x99\xd9\t\x8fJ\x84\xeb6\xf8'\x9e\xccg\xff\x98\xa9W\x18\x1a\xba`<\x16\x8b\xf6\xeb6m\x1cD\xf3\x8di\xcf\x03\x94\xdc\xe1lo;\xa6\xb6d\xd1\xfc\xe3\xd6\x10B\x03\xdak?\xfe\x8e^(\xb2\xd1{hĉ^8\x1e\xe8\x87\xd0\xf1\xc9\x17\xf7O~h\xf9< \xe1\xba\u007f\x03\x00\x00\xff\xff"
// pamRawGrayAlpha is a complete PAM file with gray + alpha, compressed with
// Flate compression.
const pamRawGrayAlpha = "ęmL[\xe7\x15\xc7W\x924\xcc]\xb7\x95\xb5j\xf3ebS\xb4O\xe9>tk+MZU4X݉Vn\xc6\xda&\xad\xd4Mm\xa2\xb5\x99\x02\x89\xeb\x86db#1\x18h\xc3K\f1\xc4\xc5\x06L\xb1y)\x06l0p\xfd\x0e\t\xd5\x16\xad]\x97\x8dh\x9a\x92I\x1b\xa5]\":\xc6`\t\x10\xf8M\xbe!\x8e1\x18|\xefu\xb6{\xbe >\xf8w\x9e\xf3\xfc\x9fs\xces\x1e\xcd\xe3\xaa\x17\x9e\xce\xceSg>\xf6]\x95:\xe7\xe9\xa7\xd4y\x91\xbf\xb2s4y\xea\xccGT\xcfd\xbd\xf8|Vn\xe6#\x8f>\xaa\xca\xfb\x89&7o\x8f&'\xf3\xa9\xddY{~\xfc\x83\xacܜW\xb2r5\xea,Uγ\xd9\xea\xec\xdd*\xbe Ֆ\xd2\xe6\xef^\xd8\xf6\x11\x9d\xd4a\xa2\x966|̰\b,1G\x00\x17S\x19Ki\xd2\u007f79\xfb\xe4\x9b\xe78\x8d\x81:,\x9c\xc4\xc0\x11Ji\xa4\x10\a\xe3\xb81`\xa2\x9a\x9fagN\x95z\xf6\xe4\x8e\xf3\x980\x11\xa4\x9bJ\xaa\xb8L\xe4\xfb\a\xbd\xd4c\xa6\x9c\x02\xce\xd0@3a*\xe9cqkj\xe9~:\xe9\xc0G\x80v\x8er\x81\xd8o\x96j\\\xd4\xf00O\xf2m\xac\xf8\xa9\xe7__N\x1d{\xf6\x1e\x1b\xad\f 0L\x10\x1d\x81\x18\xf6\x1cZ4TPH\x90S\xec䫴\x10\xa21\x85\xfc?R\x83\x8b\xe1\x15sa\xe5j\f\xbf\x90t\xbeF\x0eex\x19\xc6\xcd\x0f\xb1ю\x8b\xeb\xdbS\xc1\x9e\xb9\xb7\b\x1d\xa1(]\xa0\x19'\v1\xfc\xc3lg':,t\x89\xf1\x19\xe0\x00\x15\\D9{)m\x9c}\xe8\xe9\xc2\xc6{\xb4\xe1Ƌ@\x1bvfc\xf8\x13\xbc\x8a\x9avz\xe8\x10\xf9\x02.\xde\xe4#\xc5\xfc\x1b[\xceR\xccq\xda\xe9e\x14?n\x1cX\b `\xe4\x13\xe2\xbf\u007fbbh%F>Z9\xa9\xf0\x04.\xdf5B\r\a\xf0\xb0\x1ce\xcc\xe3\xc6F\x90Zή\xe1\u007f\x80\x11_t\x97\x02T\xe1Q\x14\x81\x89]e\xd4\xe0\x8b!t\x92G5Z\x82\b\xfc\x8a\xbf\xac\xa2_\xa48ʾ\x15\x83\xb7\x14\xf1\x8fः\u007fG\t#\xec$\x8d\xef\xf1&f|\xf81\xd0\xc4\xf4\xca\xfe\xb7P%j\u007f5\xdfB\x8bl\x0f\xbc\x14b\xa7=&\xf6\x01\xbe\xceV\x8a\xe8\xa0\x04\x1fN\xde\xc7\xc4K\xec\xe7-\x0e1\x18\x13\xf9\xdb\x16\xe6e\x96\xef\x92\xce\xfe\xec\xc1\x8b\xec\xa6\x1fk\xc4\xff\xe8w\x1d=j\x8e1E1\xbf\xe4;|\x83'\xe8Ć\x93\xe0:\xec\x9b\x11(\xc3)9\x02\x1fR\x8b\x99\xe7\b⠋\xf95:\xfb\x1bO\x90ΗH\xe7qt\x14\x90OO\x02\xfe0^\xf2%\xf2\xff\xc4A\xba\x19\xe3\r\x02\f\xd1\xcc\xe4\x1a\xbe\x91\xbd\xa4\xb1\x83\xe70\xd2H\x13\a1'\xe4\v\x1c\xe7Ӈ\x92\xa7/n\xb5p\x90sT\x91M\x18/V\xac,\xad\xa2\xdb)\xe2uަ\x92z\xac4r\x9a\x97hI\xc8\x1f\xa6\x8b&\t\x11\xb8\xbe\xbd\x82\x1a\xday\x88\xef\x13f\x18?\r\x14Gs\xdd5J\xf95\x16t4bƀ\x06\x1d/sz\x8d\xf2c\xcdE-\x9f=\x98\xfc\xfa\xed\x9cd\x94gy\x98\x91\x15\ry9D\t\x15\x9c\xe2\x04}\xf81\xf3\x06&\x8eЅ\x87E.а\x01=\xa2\x003&\t\x9d\xc0(\xfb\xf1\xf1[~\x1e\xa3\xea \x01\xfc\xf8\xc5\xcc\x1bY\xd11\n\xd9\xcb\x02\xcb\f\x89Y\xa9kC\x0f<\xe4\xe3Oz\x0f\xa62\xf4\x1c\xc6\xc4\xd1uO\xf4MMEjP\x13c\xc0\x05\x1c\xb4һ!ߏ\x89|f\xeeMփ\xab\xf7\u007f\x8c\x8f=\xf4\x8a\xabM\xfc\xab\x85\x84p`\xa0/Zu\x12Y\x10\x8d\x04\rܬ\xbbW\x1e\xa8\xc0\xbf\xc1o\n\xb8q3\xc8\xe0\x86^ުE\x15h\xb1у\x83\xbf\xeeK\xd6\ac\xc2\x1d\x90n\x02\xef\x88'\xe8,n\x92\xed\xcc{hN\x99\aa^c\x92i\xce\x11LZ\x89\x9f\xdfWH E\xfc Gy\r/a\xa62\x92\xe5/l\xf3Ж\xc4\xee&c~\xea\xd8'\xb9\x12]\xd2[7\xd4`\xa2\xd3\xe9]\xe7\xbf\xfd|K2\u007fNՊ]R\x04\x04\xfah¶\x8e\x0f!v0{\x8fT\x0f\xfa1I\xdc\xe7b\x86pS\x8b5\u0383\x10Y\\\xd6J\xefE\xcel\x92]\xe3\xd7\xdf*\x9e\xb3e\x9c8VE.\xc8^FetcW\xef/\xdf4\xbfݶZ,\x9cg\x9ci\f\xbc\xb7\x8a\xefGG\xb3\xacnp\x84\xd7Wj\xe1ff\xa2\x88wi\xa2\x8e\x16\x8c\xb8\xe3ꠑb\x99\xddh\x01%\t{\xbc\xdb6D7}\xa2\xf2\xfa\xc5\xda,\xc4\xedL'\x06\xe4\xde\x00\x9fL\x82\xbf\x99\xf5Q&\xbb\x1b\xf7\xa0W\x98\v\x05\x9c\xd8e\U000e7fe2\x97\x9c\x89\xe2\xf9=\x92:\xc1\xb5\x99\xa8[Q.\x16\xe8\xa6\x14\xf97a'\xe5\n#\xd0\xcb\t\x05\xf7\xc1^\xf6+R@D\xff\xd5\n\xf8\xbfA\x1bw\xa2\xa5\x99\x97w\xb1\xa1d\xf2V\x84M\x81\x02\xfc\x14)\x9a\x88\xfc\xe7\x8b\x06\xcc\n\xf8\x01~\xc1\xc4.%\xf3\x80:\xce(\xe0\x87Q\xb3\xb0M\t\xbf\r\x8b\x02~\x88g\x14Σ\xfah\x95\xcd\x17\xf0\xf0\xaaB\xbe[\x01?@\tm\x8a\xd7/_\xffa^\xe1\x92^\x19߬@\xff^\x0e\xf0!\xe3|~\x9f|~\x83l~\b\x03\x1f\x00\xe3\x84%\xdcC\xe3\xcdA\xb3,\xbe\x97\x1e~\xc4%`\x86j~/[\x05B\\G\x99\xac\rq\x98Az1q\x8dS\nv`\x84\x0e\x19\xf4\x01\xf4\xf4\x88k\x1eîH\x83\x97\xb5\x15\xf4K\xbc\t\xbd\xcf;\xf4\x93\x9a7\x88\x00oK\xc8\x00\x01\xba\xa9\xa7\x9c\x8fI\xd5\x1bȟř\x87+\xa9yC\xa4\xdb.\xc3ɵ\xf4Խ\x00-l\x9bʘ\xd8u\fa\x83\xa9\x80@\x900\xa5\x1c\xa2_a\xb5K<\x15\xd0\xd2FP\x9c\x80{\xe3\xceY\b\x17\xf9</\xae\xfbƖ;\xf5\xfe8\x95Q\x80\x8e:\xb4\xd4#0$\u0380<\f`\xe4E^`\x8c;ō\x9dNur\x05ĩ\x8a\x9dJ\xca9.\xbe\x06H\xbf_\xcbU\xe2y\xf1\x96;*\xe6\xb3?\xf0\xf7\xc7\xfe7\xdc[/\x91\x1e>\x05&\x15\xdcg\x94ؕ\aj\xc5\xf5\x9f`\xfe\xee\xff\a\xffƖ\xdfQ\xcaOW\xb2\xaar\xfbo\x00\x00\x00\xff\xff"
// imageFromString returns an image from a string, verifying correctness.
func imageFromString(t *testing.T, imgStr string, iFmt Format) image.Image {
r := flate.NewReader(bytes.NewBufferString(imgStr))
defer r.Close()
img, err := Decode(r, nil)
if err != nil {
t.Fatal(err)
}
if img.Format() != iFmt {
t.Fatalf("Expected %s but received %s", iFmt, img.Format())
}
return img
}
// repeatDecodeEncode confirms that encoding and decoding do not alter a Netpbm
// image.
func repeatDecodeEncode(t *testing.T, imgStr string, dOpts *DecodeOptions, eOpts *EncodeOptions) {
// Decode a raw Netpbm image.
r1 := flate.NewReader(bytes.NewBufferString(imgStr))
img, _, err := image.Decode(r1)
r1.Close()
if err != nil {
t.Fatal(err)
}
// Encode the image to w1.
var w1 bytes.Buffer
err = Encode(&w1, img, eOpts)
if err != nil {
t.Fatal(err)
}
s1 := w1.String()
// Decode the image from w1.
img, err = Decode(&w1, dOpts)
if err != nil {
t.Fatal(err)
}
// Encode the image to w2.
var w2 bytes.Buffer
err = Encode(&w2, img, eOpts)
if err != nil {
t.Fatal(err)
}
s2 := w2.String()
// Complain if s1 and s2 are different.
if s1 != s2 {
t.Fatalf("Decoding and re-encoding changed the image")
}
}
func TestGetNextByteAsRune(t *testing.T) {
r := bufio.NewReader(strings.NewReader("123"))
nr := newNetpbmReader(r)
rn := nr.GetNextByteAsRune()
if nr.err != nil {
t.Fatalf("unexpected error: %s", nr.err)
}
if rn != '1' {
t.Fatalf("wrong output: %c, expected '1'", rn)
}
}
func TestGetNextInt(t *testing.T) {
type testCase struct {
in string
out int
}
testCases := []testCase{
{
in: "123",
out: 123,
},
{
in: " 123 ",
out: 123,
},
{
in: "ABC 123",
out: 123,
},
}
for _, tc := range testCases {
r := bufio.NewReader(strings.NewReader(tc.in))
nr := newNetpbmReader(r)
n := nr.GetNextInt()
if nr.err != nil {
t.Fatalf("unexpected error: %s", nr.err)
}
if n != tc.out {
t.Fatalf("wrong int: %d, expected %d", n, tc.out)
}
}
}
// compareImageMetadata is a helper function that ensures that two images have
// the same color model and bounds.
func compareImageMetadata(t *testing.T, img0, img1 Image) {
if img0.ColorModel() != img1.ColorModel() {
t.Fatal("Color model mismatch")
}
bnd0 := img0.Bounds()
bnd1 := img1.Bounds()
if bnd0.Min.X != bnd1.Min.X || bnd0.Min.Y != bnd1.Min.Y ||
bnd0.Max.X != bnd1.Max.X || bnd0.Max.Y != bnd1.Max.Y {
t.Fatalf("Image bounds don't match (%v vs. %v)", bnd0, bnd0)
}
}
// addRemoveAlpha confirms that adding an alpha channel and then removing it
// does not alter a Netpbm image.
func addRemoveAlpha(t *testing.T, imgStr string, dOpts *DecodeOptions, eOpts *EncodeOptions) {
// Decode a Netpbm image.
r1 := flate.NewReader(bytes.NewBufferString(imgStr))
img0, _, err := image.Decode(r1)
r1.Close()
if err != nil {
t.Fatal(err)
}
// Add an alpha channel.
imgA, ok := AddAlpha(img0.(Image))
if !ok {
t.Fatal("Failed to add an alpha channel")
}
if !imgA.HasAlpha() {
t.Fatal("Image claims not to have an alpha channel after adding one")
}
// Remove the alpha channel.
img1, ok := RemoveAlpha(imgA.(Image))
if !ok {
t.Fatal("Failed to remove an alpha channel")
}
if img1.HasAlpha() {
t.Fatal("Image claims to have an alpha channel after removing it")
}
// Ensure the before (img0) and after (img1) images' metadata match.
compareImageMetadata(t, img0.(Image), img1.(Image))
// Ensure the before (img0) and after (img1) images' data match.
bnd0 := img0.Bounds()
for y := bnd0.Min.Y; y < bnd0.Max.Y; y++ {
for x := bnd0.Min.X; x < bnd0.Max.X; x++ {
c0 := img0.At(x, y)
c1 := img1.At(x, y)
r0, g0, b0, a0 := c0.RGBA()
r1, g1, b1, a1 := c1.RGBA()
if r0 != r1 || g0 != g1 || b0 != b1 || a0 != a1 {
t.Fatalf("Color at (%d, %d) changed from [%d, %d, %d, %d] to [%d, %d, %d, %d]",
x, y, r0, g0, b0, a0, r1, g1, b1, a1)
}
}
}
}
// decodeImageCheckAlpha is a helper function for removeCompareAlpha that
// decodes an image, interprets it as a Netpbm image, and confirms that the
// image either contains or lacks an alpha channel, as specified.
func decodeImageCheckAlpha(t *testing.T, imgStr string, alpha bool) Image {
r := flate.NewReader(bytes.NewBufferString(imgStr))
img, _, err := image.Decode(r)
r.Close()
if err != nil {
t.Fatal(err)
}
nimg := img.(Image)
switch {
case nimg.HasAlpha() == alpha:
case alpha:
t.Fatal("Image was supposed to have an alpha channel but doesn't")
case !alpha:
t.Fatal("Image was not supposed to have an alpha channel but does")
default:
panic("Internal error -- we weren't supposed to get here")
}
return nimg
}
// removeCompareAlpha removes the alpha channel from one image then ensures it
// matches a second image.
func removeCompareAlpha(t *testing.T, imgStrA, imgStrNA string) {
// Decode a Netpbm image that contains an alpha channel.
imgA := decodeImageCheckAlpha(t, imgStrA, true)
// Decode a Netpbm image that lacks an alpha channel.
imgNA := decodeImageCheckAlpha(t, imgStrNA, false)
// Remove the alpha channel from the image that has one.
imgRA, ok := RemoveAlpha(imgA) // Image with alpha removed
if !ok {
t.Fatal("Failed to remove an alpha channel")
}
if imgRA.HasAlpha() {
t.Fatal("Image claims to have an alpha channel after removing it")
}
// Ensure the two images' metadata match.
compareImageMetadata(t, imgNA, imgRA)
// Ensure the two images' data match.
bndNA := imgNA.Bounds()
for y := bndNA.Min.Y; y < bndNA.Max.Y; y++ {
for x := bndNA.Min.X; x < bndNA.Max.X; x++ {
// Ignore pixels that were originally transparent
// (either fully or partially) because these don't have
// a well-defined color. (In practice, the RGBA method
// blends them with black.)
cA := imgA.At(x, y)
_, _, _, aA := cA.RGBA()
if aA != 0xffff {
continue
}
// Ensure the pixels' red, green, blue, and alpha
// channels match.
cNA := imgNA.At(x, y)
rNA, gNA, bNA, aNA := cNA.RGBA()
cRA := imgRA.At(x, y)
rRA, gRA, bRA, aRA := cRA.RGBA()
if rNA != rRA || gNA != gRA || bNA != bRA || aNA != aRA {
t.Fatalf("Color at (%d, %d) changed from [%d, %d, %d, %d] to [%d, %d, %d, %d]",
x, y, rNA, gNA, bNA, aNA, rRA, gRA, bRA, aRA)
}
}
}
}