xref: /inferno-os/appl/lib/imageremap.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1implement Imageremap;
2
3include "sys.m";
4	sys: Sys;
5
6include "draw.m";
7	draw: Draw;
8	Display, Image: import draw;
9
10include "bufio.m";
11
12include "imagefile.m";
13
14closest:= array[16*16*16] of {
15	byte 255,byte 255,byte 255,byte 254,byte 254,byte 237,byte 220,byte 203,
16	byte 253,byte 236,byte 219,byte 202,byte 252,byte 235,byte 218,byte 201,
17	byte 255,byte 255,byte 255,byte 254,byte 254,byte 237,byte 220,byte 203,
18	byte 253,byte 236,byte 219,byte 202,byte 252,byte 235,byte 218,byte 201,
19	byte 255,byte 255,byte 255,byte 250,byte 250,byte 250,byte 220,byte 249,
20	byte 249,byte 249,byte 232,byte 248,byte 248,byte 248,byte 231,byte 201,
21	byte 251,byte 251,byte 250,byte 250,byte 250,byte 250,byte 249,byte 249,
22	byte 249,byte 249,byte 232,byte 248,byte 248,byte 248,byte 231,byte 201,
23	byte 251,byte 251,byte 250,byte 250,byte 250,byte 233,byte 233,byte 249,
24	byte 249,byte 232,byte 215,byte 215,byte 248,byte 231,byte 214,byte 197,
25	byte 234,byte 234,byte 250,byte 250,byte 233,byte 233,byte 216,byte 216,
26	byte 249,byte 232,byte 215,byte 198,byte 198,byte 231,byte 214,byte 197,
27	byte 217,byte 217,byte 217,byte 246,byte 233,byte 216,byte 216,byte 199,
28	byte 199,byte 215,byte 215,byte 198,byte 198,byte 198,byte 214,byte 197,
29	byte 200,byte 200,byte 246,byte 246,byte 246,byte 216,byte 199,byte 199,
30	byte 245,byte 245,byte 198,byte 244,byte 244,byte 244,byte 227,byte 197,
31	byte 247,byte 247,byte 246,byte 246,byte 246,byte 246,byte 199,byte 245,
32	byte 245,byte 245,byte 228,byte 244,byte 244,byte 244,byte 227,byte 193,
33	byte 230,byte 230,byte 246,byte 246,byte 229,byte 229,byte 212,byte 245,
34	byte 245,byte 228,byte 228,byte 211,byte 244,byte 227,byte 210,byte 193,
35	byte 213,byte 213,byte 229,byte 229,byte 212,byte 212,byte 212,byte 195,
36	byte 228,byte 228,byte 211,byte 211,byte 194,byte 227,byte 210,byte 193,
37	byte 196,byte 196,byte 242,byte 242,byte 212,byte 195,byte 195,byte 241,
38	byte 241,byte 211,byte 211,byte 194,byte 194,byte 240,byte 210,byte 193,
39	byte 243,byte 243,byte 242,byte 242,byte 242,byte 195,byte 195,byte 241,
40	byte 241,byte 241,byte 194,byte 194,byte 240,byte 240,byte 239,byte 205,
41	byte 226,byte 226,byte 242,byte 242,byte 225,byte 225,byte 195,byte 241,
42	byte 241,byte 224,byte 224,byte 240,byte 240,byte 239,byte 239,byte 205,
43	byte 209,byte 209,byte 225,byte 225,byte 208,byte 208,byte 208,byte 224,
44	byte 224,byte 223,byte 223,byte 223,byte 239,byte 239,byte 222,byte 205,
45	byte 192,byte 192,byte 192,byte 192,byte 207,byte 207,byte 207,byte 207,
46	byte 206,byte 206,byte 206,byte 206,byte 205,byte 205,byte 205,byte 205,
47	byte 255,byte 255,byte 255,byte 254,byte 254,byte 237,byte 220,byte 203,
48	byte 253,byte 236,byte 219,byte 202,byte 252,byte 235,byte 218,byte 201,
49	byte 255,byte 238,byte 221,byte 221,byte 254,byte 237,byte 220,byte 203,
50	byte 253,byte 236,byte 219,byte 202,byte 252,byte 235,byte 218,byte 201,
51	byte 255,byte 221,byte 221,byte 221,byte 204,byte 250,byte 220,byte 249,
52	byte 249,byte 249,byte 232,byte 248,byte 248,byte 248,byte 231,byte 201,
53	byte 251,byte 221,byte 221,byte 204,byte 250,byte 250,byte 249,byte 249,
54	byte 249,byte 249,byte 232,byte 248,byte 248,byte 248,byte 231,byte 201,
55	byte 251,byte 251,byte 204,byte 250,byte 250,byte 233,byte 233,byte 249,
56	byte 249,byte 232,byte 215,byte 215,byte 248,byte 231,byte 214,byte 197,
57	byte 234,byte 234,byte 250,byte 250,byte 233,byte 233,byte 216,byte 216,
58	byte 249,byte 232,byte 215,byte 198,byte 198,byte 231,byte 214,byte 197,
59	byte 217,byte 217,byte 217,byte 246,byte 233,byte 216,byte 216,byte 199,
60	byte 199,byte 215,byte 215,byte 198,byte 198,byte 198,byte 214,byte 197,
61	byte 200,byte 200,byte 246,byte 246,byte 246,byte 216,byte 199,byte 199,
62	byte 245,byte 245,byte 198,byte 244,byte 244,byte 244,byte 227,byte 197,
63	byte 247,byte 247,byte 246,byte 246,byte 246,byte 246,byte 199,byte 245,
64	byte 245,byte 245,byte 228,byte 244,byte 244,byte 244,byte 227,byte 193,
65	byte 230,byte 230,byte 246,byte 246,byte 229,byte 229,byte 212,byte 245,
66	byte 245,byte 228,byte 228,byte 211,byte 244,byte 227,byte 210,byte 193,
67	byte 213,byte 213,byte 229,byte 229,byte 212,byte 212,byte 212,byte 195,
68	byte 228,byte 228,byte 211,byte 211,byte 194,byte 227,byte 210,byte 193,
69	byte 196,byte 196,byte 242,byte 242,byte 212,byte 195,byte 195,byte 241,
70	byte 241,byte 211,byte 211,byte 194,byte 194,byte 240,byte 210,byte 193,
71	byte 243,byte 243,byte 242,byte 242,byte 242,byte 195,byte 195,byte 241,
72	byte 241,byte 241,byte 194,byte 194,byte 240,byte 240,byte 239,byte 205,
73	byte 226,byte 226,byte 242,byte 242,byte 225,byte 225,byte 195,byte 241,
74	byte 241,byte 224,byte 224,byte 240,byte 240,byte 239,byte 239,byte 205,
75	byte 209,byte 209,byte 225,byte 225,byte 208,byte 208,byte 208,byte 224,
76	byte 224,byte 223,byte 223,byte 223,byte 239,byte 239,byte 222,byte 205,
77	byte 192,byte 192,byte 192,byte 192,byte 207,byte 207,byte 207,byte 207,
78	byte 206,byte 206,byte 206,byte 206,byte 205,byte 205,byte 205,byte 205,
79	byte 255,byte 255,byte 255,byte 191,byte 191,byte 191,byte 220,byte 190,
80	byte 190,byte 190,byte 173,byte 189,byte 189,byte 189,byte 172,byte 201,
81	byte 255,byte 221,byte 221,byte 221,byte 204,byte 191,byte 220,byte 190,
82	byte 190,byte 190,byte 173,byte 189,byte 189,byte 189,byte 172,byte 201,
83	byte 255,byte 221,byte 221,byte 204,byte 204,byte 204,byte 186,byte 186,
84	byte 186,byte 186,byte 186,byte 185,byte 185,byte 185,byte 168,byte 201,
85	byte 188,byte 221,byte 204,byte 204,byte 204,byte 187,byte 186,byte 186,
86	byte 186,byte 186,byte 232,byte 185,byte 185,byte 185,byte 168,byte 201,
87	byte 188,byte 204,byte 204,byte 204,byte 187,byte 187,byte 186,byte 186,
88	byte 186,byte 186,byte 169,byte 185,byte 185,byte 185,byte 168,byte 197,
89	byte 188,byte 188,byte 204,byte 187,byte 187,byte 233,byte 216,byte 186,
90	byte 186,byte 186,byte 215,byte 185,byte 185,byte 185,byte 168,byte 197,
91	byte 217,byte 217,byte 183,byte 183,byte 183,byte 216,byte 216,byte 199,
92	byte 182,byte 182,byte 215,byte 198,byte 198,byte 181,byte 214,byte 197,
93	byte 184,byte 184,byte 183,byte 183,byte 183,byte 183,byte 199,byte 182,
94	byte 182,byte 182,byte 182,byte 181,byte 181,byte 181,byte 181,byte 197,
95	byte 184,byte 184,byte 183,byte 183,byte 183,byte 183,byte 182,byte 182,
96	byte 182,byte 182,byte 182,byte 181,byte 181,byte 181,byte 164,byte 193,
97	byte 184,byte 184,byte 183,byte 183,byte 183,byte 183,byte 182,byte 182,
98	byte 182,byte 228,byte 165,byte 181,byte 181,byte 164,byte 164,byte 193,
99	byte 167,byte 167,byte 183,byte 229,byte 166,byte 212,byte 212,byte 182,
100	byte 182,byte 165,byte 211,byte 211,byte 181,byte 164,byte 210,byte 193,
101	byte 180,byte 180,byte 179,byte 179,byte 179,byte 179,byte 195,byte 178,
102	byte 178,byte 178,byte 211,byte 194,byte 177,byte 177,byte 177,byte 193,
103	byte 180,byte 180,byte 179,byte 179,byte 179,byte 179,byte 195,byte 178,
104	byte 178,byte 178,byte 178,byte 177,byte 177,byte 177,byte 177,byte 205,
105	byte 180,byte 180,byte 179,byte 179,byte 179,byte 179,byte 178,byte 178,
106	byte 178,byte 161,byte 161,byte 177,byte 177,byte 177,byte 160,byte 205,
107	byte 163,byte 163,byte 162,byte 162,byte 162,byte 162,byte 208,byte 178,
108	byte 161,byte 161,byte 223,byte 177,byte 177,byte 160,byte 160,byte 205,
109	byte 192,byte 192,byte 192,byte 192,byte 207,byte 207,byte 207,byte 207,
110	byte 206,byte 206,byte 206,byte 206,byte 205,byte 205,byte 205,byte 205,
111	byte 176,byte 176,byte 191,byte 191,byte 191,byte 191,byte 190,byte 190,
112	byte 190,byte 190,byte 173,byte 189,byte 189,byte 189,byte 172,byte 201,
113	byte 176,byte 221,byte 221,byte 204,byte 191,byte 191,byte 190,byte 190,
114	byte 190,byte 190,byte 173,byte 189,byte 189,byte 189,byte 172,byte 201,
115	byte 188,byte 221,byte 204,byte 204,byte 204,byte 187,byte 186,byte 186,
116	byte 186,byte 186,byte 173,byte 185,byte 185,byte 185,byte 168,byte 201,
117	byte 188,byte 204,byte 204,byte 204,byte 187,byte 187,byte 186,byte 186,
118	byte 186,byte 186,byte 169,byte 185,byte 185,byte 185,byte 168,byte 201,
119	byte 188,byte 188,byte 204,byte 187,byte 187,byte 187,byte 186,byte 186,
120	byte 186,byte 186,byte 169,byte 185,byte 185,byte 185,byte 168,byte 197,
121	byte 188,byte 188,byte 187,byte 187,byte 187,byte 170,byte 170,byte 186,
122	byte 186,byte 169,byte 169,byte 185,byte 185,byte 168,byte 168,byte 197,
123	byte 184,byte 184,byte 183,byte 183,byte 183,byte 170,byte 170,byte 182,
124	byte 182,byte 169,byte 152,byte 152,byte 181,byte 168,byte 151,byte 197,
125	byte 184,byte 184,byte 183,byte 183,byte 183,byte 183,byte 182,byte 182,
126	byte 182,byte 182,byte 182,byte 181,byte 181,byte 181,byte 164,byte 197,
127	byte 184,byte 184,byte 183,byte 183,byte 183,byte 183,byte 182,byte 182,
128	byte 182,byte 182,byte 165,byte 181,byte 181,byte 181,byte 164,byte 193,
129	byte 184,byte 184,byte 183,byte 183,byte 183,byte 166,byte 166,byte 182,
130	byte 182,byte 165,byte 165,byte 181,byte 181,byte 164,byte 164,byte 193,
131	byte 167,byte 167,byte 167,byte 166,byte 166,byte 166,byte 149,byte 182,
132	byte 165,byte 165,byte 165,byte 148,byte 181,byte 164,byte 147,byte 193,
133	byte 180,byte 180,byte 179,byte 179,byte 179,byte 179,byte 149,byte 178,
134	byte 178,byte 178,byte 148,byte 177,byte 177,byte 177,byte 147,byte 193,
135	byte 180,byte 180,byte 179,byte 179,byte 179,byte 179,byte 178,byte 178,
136	byte 178,byte 178,byte 178,byte 177,byte 177,byte 177,byte 160,byte 205,
137	byte 180,byte 180,byte 179,byte 179,byte 179,byte 162,byte 162,byte 178,
138	byte 178,byte 161,byte 161,byte 177,byte 177,byte 160,byte 160,byte 205,
139	byte 163,byte 163,byte 162,byte 162,byte 162,byte 162,byte 145,byte 161,
140	byte 161,byte 161,byte 144,byte 144,byte 160,byte 160,byte 160,byte 205,
141	byte 192,byte 192,byte 192,byte 192,byte 207,byte 207,byte 207,byte 207,
142	byte 206,byte 206,byte 206,byte 206,byte 205,byte 205,byte 205,byte 205,
143	byte 176,byte 176,byte 191,byte 191,byte 191,byte 174,byte 174,byte 190,
144	byte 190,byte 173,byte 156,byte 156,byte 189,byte 172,byte 155,byte 138,
145	byte 176,byte 176,byte 204,byte 191,byte 191,byte 174,byte 174,byte 190,
146	byte 190,byte 173,byte 156,byte 156,byte 189,byte 172,byte 155,byte 138,
147	byte 188,byte 204,byte 204,byte 204,byte 187,byte 187,byte 186,byte 186,
148	byte 186,byte 186,byte 169,byte 185,byte 185,byte 185,byte 168,byte 138,
149	byte 188,byte 188,byte 204,byte 187,byte 187,byte 187,byte 186,byte 186,
150	byte 186,byte 186,byte 169,byte 185,byte 185,byte 185,byte 168,byte 138,
151	byte 188,byte 188,byte 187,byte 187,byte 187,byte 170,byte 170,byte 186,
152	byte 186,byte 169,byte 169,byte 185,byte 185,byte 168,byte 151,byte 134,
153	byte 171,byte 171,byte 187,byte 187,byte 170,byte 170,byte 170,byte 186,
154	byte 186,byte 169,byte 152,byte 152,byte 185,byte 168,byte 151,byte 134,
155	byte 171,byte 171,byte 183,byte 183,byte 170,byte 170,byte 170,byte 153,
156	byte 182,byte 169,byte 152,byte 135,byte 135,byte 168,byte 151,byte 134,
157	byte 184,byte 184,byte 183,byte 183,byte 183,byte 183,byte 153,byte 182,
158	byte 182,byte 182,byte 182,byte 181,byte 181,byte 181,byte 164,byte 134,
159	byte 184,byte 184,byte 183,byte 183,byte 183,byte 183,byte 182,byte 182,
160	byte 182,byte 182,byte 165,byte 181,byte 181,byte 181,byte 164,byte 130,
161	byte 167,byte 167,byte 183,byte 183,byte 166,byte 166,byte 166,byte 182,
162	byte 182,byte 165,byte 165,byte 181,byte 181,byte 164,byte 147,byte 130,
163	byte 150,byte 150,byte 166,byte 166,byte 166,byte 149,byte 149,byte 182,
164	byte 165,byte 165,byte 148,byte 148,byte 164,byte 164,byte 147,byte 130,
165	byte 150,byte 150,byte 179,byte 179,byte 179,byte 149,byte 132,byte 178,
166	byte 178,byte 178,byte 148,byte 131,byte 177,byte 177,byte 147,byte 130,
167	byte 180,byte 180,byte 179,byte 179,byte 179,byte 179,byte 132,byte 178,
168	byte 178,byte 178,byte 161,byte 177,byte 177,byte 177,byte 160,byte 142,
169	byte 163,byte 163,byte 179,byte 179,byte 162,byte 162,byte 162,byte 178,
170	byte 178,byte 161,byte 161,byte 177,byte 177,byte 160,byte 160,byte 142,
171	byte 146,byte 146,byte 162,byte 162,byte 145,byte 145,byte 145,byte 161,
172	byte 161,byte 144,byte 144,byte 144,byte 160,byte 160,byte 159,byte 142,
173	byte 129,byte 129,byte 129,byte 129,byte 128,byte 128,byte 128,byte 128,
174	byte 143,byte 143,byte 143,byte 143,byte 142,byte 142,byte 142,byte 142,
175	byte 175,byte 175,byte 191,byte 191,byte 174,byte 174,byte 157,byte 157,
176	byte 190,byte 173,byte 156,byte 139,byte 139,byte 172,byte 155,byte 138,
177	byte 175,byte 175,byte 191,byte 191,byte 174,byte 174,byte 157,byte 157,
178	byte 190,byte 173,byte 156,byte 139,byte 139,byte 172,byte 155,byte 138,
179	byte 188,byte 188,byte 204,byte 187,byte 187,byte 187,byte 157,byte 186,
180	byte 186,byte 186,byte 156,byte 185,byte 185,byte 185,byte 168,byte 138,
181	byte 188,byte 188,byte 187,byte 187,byte 187,byte 170,byte 170,byte 186,
182	byte 186,byte 169,byte 169,byte 185,byte 185,byte 168,byte 168,byte 138,
183	byte 171,byte 171,byte 187,byte 187,byte 170,byte 170,byte 170,byte 186,
184	byte 186,byte 169,byte 152,byte 152,byte 185,byte 168,byte 151,byte 134,
185	byte 171,byte 171,byte 187,byte 170,byte 170,byte 170,byte 170,byte 153,
186	byte 169,byte 169,byte 152,byte 135,byte 135,byte 168,byte 151,byte 134,
187	byte 154,byte 154,byte 154,byte 170,byte 170,byte 170,byte 153,byte 153,
188	byte 169,byte 152,byte 152,byte 135,byte 135,byte 135,byte 151,byte 134,
189	byte 154,byte 154,byte 183,byte 183,byte 183,byte 153,byte 153,byte 153,
190	byte 182,byte 182,byte 135,byte 135,byte 181,byte 181,byte 164,byte 134,
191	byte 184,byte 184,byte 183,byte 183,byte 183,byte 166,byte 166,byte 182,
192	byte 182,byte 165,byte 165,byte 181,byte 181,byte 164,byte 164,byte 130,
193	byte 167,byte 167,byte 183,byte 166,byte 166,byte 166,byte 149,byte 182,
194	byte 165,byte 165,byte 165,byte 148,byte 181,byte 164,byte 147,byte 130,
195	byte 150,byte 150,byte 150,byte 166,byte 149,byte 149,byte 149,byte 132,
196	byte 165,byte 165,byte 148,byte 148,byte 131,byte 147,byte 147,byte 130,
197	byte 133,byte 133,byte 179,byte 179,byte 149,byte 132,byte 132,byte 132,
198	byte 178,byte 148,byte 148,byte 131,byte 131,byte 131,byte 130,byte 130,
199	byte 133,byte 133,byte 179,byte 179,byte 179,byte 132,byte 132,byte 178,
200	byte 178,byte 178,byte 131,byte 131,byte 131,byte 177,byte 160,byte 142,
201	byte 163,byte 163,byte 179,byte 162,byte 162,byte 162,byte 132,byte 178,
202	byte 161,byte 161,byte 144,byte 131,byte 177,byte 160,byte 160,byte 142,
203	byte 146,byte 146,byte 162,byte 162,byte 145,byte 145,byte 145,byte 161,
204	byte 161,byte 144,byte 144,byte 143,byte 160,byte 160,byte 159,byte 142,
205	byte 129,byte 129,byte 129,byte 129,byte 128,byte 128,byte 128,byte 128,
206	byte 143,byte 143,byte 143,byte 143,byte 142,byte 142,byte 142,byte 142,
207	byte 158,byte 158,byte 158,byte 112,byte 174,byte 157,byte 157,byte 140,
208	byte 140,byte 156,byte 156,byte 139,byte 139,byte 139,byte 155,byte 138,
209	byte 158,byte 158,byte 158,byte 112,byte 174,byte 157,byte 157,byte 140,
210	byte 140,byte 156,byte 156,byte 139,byte 139,byte 139,byte 155,byte 138,
211	byte 158,byte 158,byte 124,byte 124,byte 124,byte 157,byte 157,byte 140,
212	byte 123,byte 123,byte 156,byte 139,byte 139,byte 122,byte 155,byte 138,
213	byte 125,byte 125,byte 124,byte 124,byte 124,byte 170,byte 170,byte 123,
214	byte 123,byte 169,byte 152,byte 152,byte 122,byte 168,byte 151,byte 138,
215	byte 171,byte 171,byte 124,byte 124,byte 170,byte 170,byte 170,byte 153,
216	byte 123,byte 169,byte 152,byte 135,byte 135,byte 168,byte 151,byte 134,
217	byte 154,byte 154,byte 154,byte 170,byte 170,byte 170,byte 153,byte 153,
218	byte 169,byte 152,byte 152,byte 135,byte 135,byte 135,byte 151,byte 134,
219	byte 154,byte 154,byte 154,byte 170,byte 170,byte 153,byte 153,byte 153,
220	byte 136,byte 152,byte 135,byte 135,byte 135,byte 135,byte 134,byte 134,
221	byte 137,byte 137,byte 137,byte 120,byte 153,byte 153,byte 153,byte 136,
222	byte 136,byte 136,byte 135,byte 135,byte 135,byte 118,byte 164,byte 134,
223	byte 137,byte 137,byte 120,byte 120,byte 120,byte 166,byte 136,byte 136,
224	byte 136,byte 165,byte 165,byte 118,byte 118,byte 164,byte 147,byte 130,
225	byte 150,byte 150,byte 120,byte 166,byte 166,byte 149,byte 149,byte 136,
226	byte 165,byte 165,byte 148,byte 148,byte 118,byte 164,byte 147,byte 130,
227	byte 150,byte 150,byte 150,byte 149,byte 149,byte 149,byte 132,byte 132,
228	byte 165,byte 148,byte 148,byte 131,byte 131,byte 147,byte 147,byte 130,
229	byte 133,byte 133,byte 133,byte 149,byte 132,byte 132,byte 132,byte 132,
230	byte 115,byte 148,byte 131,byte 131,byte 131,byte 131,byte 130,byte 130,
231	byte 133,byte 133,byte 133,byte 116,byte 132,byte 132,byte 132,byte 132,
232	byte 115,byte 115,byte 131,byte 131,byte 131,byte 131,byte 160,byte 142,
233	byte 133,byte 133,byte 116,byte 162,byte 162,byte 132,byte 132,byte 115,
234	byte 161,byte 161,byte 144,byte 131,byte 131,byte 160,byte 160,byte 142,
235	byte 146,byte 146,byte 146,byte 145,byte 145,byte 145,byte 128,byte 161,
236	byte 144,byte 144,byte 144,byte 143,byte 160,byte 160,byte 159,byte 142,
237	byte 129,byte 129,byte 129,byte 129,byte 128,byte 128,byte 128,byte 128,
238	byte 143,byte 143,byte 143,byte 143,byte 142,byte 142,byte 142,byte 142,
239	byte 141,byte 141,byte 112,byte 112,byte 112,byte 157,byte 140,byte 140,
240	byte 140,byte 127,byte 139,byte 126,byte 126,byte 126,byte 109,byte 138,
241	byte 141,byte 141,byte 112,byte 112,byte 112,byte 157,byte 140,byte 140,
242	byte 140,byte 127,byte 139,byte 126,byte 126,byte 126,byte 109,byte 138,
243	byte 125,byte 125,byte 124,byte 124,byte 124,byte 124,byte 140,byte 123,
244	byte 123,byte 123,byte 123,byte 122,byte 122,byte 122,byte 122,byte 138,
245	byte 125,byte 125,byte 124,byte 124,byte 124,byte 124,byte 123,byte 123,
246	byte 123,byte 123,byte 123,byte 122,byte 122,byte 122,byte 105,byte 138,
247	byte 125,byte 125,byte 124,byte 124,byte 124,byte 124,byte 153,byte 123,
248	byte 123,byte 123,byte 152,byte 122,byte 122,byte 122,byte 105,byte 134,
249	byte 154,byte 154,byte 124,byte 124,byte 124,byte 153,byte 153,byte 153,
250	byte 123,byte 123,byte 135,byte 135,byte 122,byte 122,byte 105,byte 134,
251	byte 137,byte 137,byte 137,byte 120,byte 153,byte 153,byte 153,byte 136,
252	byte 136,byte 136,byte 135,byte 135,byte 135,byte 118,byte 105,byte 134,
253	byte 137,byte 137,byte 120,byte 120,byte 120,byte 153,byte 136,byte 136,
254	byte 136,byte 119,byte 119,byte 118,byte 118,byte 118,byte 118,byte 134,
255	byte 137,byte 137,byte 120,byte 120,byte 120,byte 120,byte 136,byte 136,
256	byte 119,byte 119,byte 119,byte 118,byte 118,byte 118,byte 101,byte 130,
257	byte 121,byte 121,byte 120,byte 120,byte 120,byte 120,byte 136,byte 119,
258	byte 119,byte 119,byte 102,byte 118,byte 118,byte 118,byte 101,byte 130,
259	byte 133,byte 133,byte 120,byte 120,byte 149,byte 132,byte 132,byte 119,
260	byte 119,byte 102,byte 148,byte 131,byte 131,byte 101,byte 101,byte 130,
261	byte 117,byte 117,byte 116,byte 116,byte 116,byte 132,byte 132,byte 115,
262	byte 115,byte 115,byte 131,byte 131,byte 114,byte 114,byte 114,byte 130,
263	byte 117,byte 117,byte 116,byte 116,byte 116,byte 116,byte 132,byte 115,
264	byte 115,byte 115,byte 131,byte 114,byte 114,byte 114,byte 114,byte 142,
265	byte 117,byte 117,byte 116,byte 116,byte 116,byte 116,byte 115,byte 115,
266	byte 115,byte 115,byte  98,byte 114,byte 114,byte 114,byte  97,byte 142,
267	byte 100,byte 100,byte 116,byte  99,byte  99,byte  99,byte  99,byte 115,
268	byte  98,byte  98,byte  98,byte 114,byte 114,byte  97,byte  97,byte 142,
269	byte 129,byte 129,byte 129,byte 129,byte 128,byte 128,byte 128,byte 128,
270	byte 143,byte 143,byte 143,byte 143,byte 142,byte 142,byte 142,byte 142,
271	byte 113,byte 113,byte 112,byte 112,byte 112,byte 112,byte 140,byte 140,
272	byte 127,byte 127,byte 110,byte 126,byte 126,byte 126,byte 109,byte  75,
273	byte 113,byte 113,byte 112,byte 112,byte 112,byte 112,byte 140,byte 140,
274	byte 127,byte 127,byte 110,byte 126,byte 126,byte 126,byte 109,byte  75,
275	byte 125,byte 125,byte 124,byte 124,byte 124,byte 124,byte 123,byte 123,
276	byte 123,byte 123,byte 123,byte 122,byte 122,byte 122,byte 105,byte  75,
277	byte 125,byte 125,byte 124,byte 124,byte 124,byte 124,byte 123,byte 123,
278	byte 123,byte 123,byte 106,byte 122,byte 122,byte 122,byte 105,byte  75,
279	byte 125,byte 125,byte 124,byte 124,byte 124,byte 124,byte 123,byte 123,
280	byte 123,byte 123,byte 106,byte 122,byte 122,byte 122,byte 105,byte  71,
281	byte 125,byte 125,byte 124,byte 124,byte 124,byte 107,byte 107,byte 123,
282	byte 123,byte 106,byte 106,byte 122,byte 122,byte 105,byte 105,byte  71,
283	byte 137,byte 137,byte 120,byte 120,byte 120,byte 107,byte 136,byte 136,
284	byte 136,byte 106,byte 106,byte 118,byte 118,byte 105,byte  88,byte  71,
285	byte 137,byte 137,byte 120,byte 120,byte 120,byte 120,byte 136,byte 136,
286	byte 119,byte 119,byte 119,byte 118,byte 118,byte 118,byte 101,byte  71,
287	byte 121,byte 121,byte 120,byte 120,byte 120,byte 120,byte 136,byte 119,
288	byte 119,byte 119,byte 102,byte 118,byte 118,byte 118,byte 101,byte  67,
289	byte 121,byte 121,byte 120,byte 120,byte 120,byte 103,byte 103,byte 119,
290	byte 119,byte 102,byte 102,byte 118,byte 118,byte 101,byte 101,byte  67,
291	byte 104,byte 104,byte 120,byte 103,byte 103,byte 103,byte 103,byte 119,
292	byte 102,byte 102,byte 102,byte 118,byte 118,byte 101,byte  84,byte  67,
293	byte 117,byte 117,byte 116,byte 116,byte 116,byte 116,byte 115,byte 115,
294	byte 115,byte 115,byte 115,byte 114,byte 114,byte 114,byte 114,byte  67,
295	byte 117,byte 117,byte 116,byte 116,byte 116,byte 116,byte 115,byte 115,
296	byte 115,byte 115,byte 115,byte 114,byte 114,byte 114,byte  97,byte  79,
297	byte 117,byte 117,byte 116,byte 116,byte 116,byte  99,byte  99,byte 115,
298	byte 115,byte  98,byte  98,byte 114,byte 114,byte  97,byte  97,byte  79,
299	byte 100,byte 100,byte  99,byte  99,byte  99,byte  99,byte  82,byte  98,
300	byte  98,byte  98,byte  81,byte 114,byte  97,byte  97,byte  97,byte  79,
301	byte  66,byte  66,byte  66,byte  66,byte  65,byte  65,byte  65,byte  65,
302	byte  64,byte  64,byte  64,byte  64,byte  79,byte  79,byte  79,byte  79,
303	byte  96,byte  96,byte 112,byte 112,byte 111,byte 111,byte  94,byte 127,
304	byte 127,byte 110,byte 110,byte  93,byte 126,byte 109,byte  92,byte  75,
305	byte  96,byte  96,byte 112,byte 112,byte 111,byte 111,byte  94,byte 127,
306	byte 127,byte 110,byte 110,byte  93,byte 126,byte 109,byte  92,byte  75,
307	byte 125,byte 125,byte 124,byte 124,byte 124,byte 124,byte 123,byte 123,
308	byte 123,byte 123,byte 106,byte 122,byte 122,byte 105,byte 105,byte  75,
309	byte 125,byte 125,byte 124,byte 124,byte 124,byte 107,byte 107,byte 123,
310	byte 123,byte 106,byte 106,byte 122,byte 122,byte 105,byte 105,byte  75,
311	byte 108,byte 108,byte 124,byte 124,byte 107,byte 107,byte 107,byte 123,
312	byte 123,byte 106,byte 106,byte 122,byte 122,byte 105,byte  88,byte  71,
313	byte 108,byte 108,byte 124,byte 107,byte 107,byte 107,byte  90,byte 123,
314	byte 106,byte 106,byte 106,byte  89,byte 122,byte 105,byte  88,byte  71,
315	byte  91,byte  91,byte 120,byte 107,byte 107,byte  90,byte  90,byte 136,
316	byte 106,byte 106,byte  89,byte  89,byte 118,byte 105,byte  88,byte  71,
317	byte 121,byte 121,byte 120,byte 120,byte 120,byte 120,byte 136,byte 119,
318	byte 119,byte 119,byte 102,byte 118,byte 118,byte 118,byte 101,byte  71,
319	byte 121,byte 121,byte 120,byte 120,byte 120,byte 103,byte 103,byte 119,
320	byte 119,byte 102,byte 102,byte 118,byte 118,byte 101,byte 101,byte  67,
321	byte 104,byte 104,byte 120,byte 103,byte 103,byte 103,byte 103,byte 119,
322	byte 102,byte 102,byte 102,byte 118,byte 118,byte 101,byte  84,byte  67,
323	byte 104,byte 104,byte 103,byte 103,byte 103,byte 103,byte  86,byte 102,
324	byte 102,byte 102,byte  85,byte  85,byte 101,byte 101,byte  84,byte  67,
325	byte  87,byte  87,byte 116,byte 116,byte 116,byte  86,byte  86,byte 115,
326	byte 115,byte 115,byte  85,byte  85,byte 114,byte 114,byte  84,byte  67,
327	byte 117,byte 117,byte 116,byte 116,byte 116,byte 116,byte 115,byte 115,
328	byte 115,byte 115,byte  98,byte 114,byte 114,byte 114,byte  97,byte  79,
329	byte 100,byte 100,byte  99,byte  99,byte  99,byte  99,byte  99,byte 115,
330	byte  98,byte  98,byte  98,byte 114,byte 114,byte  97,byte  97,byte  79,
331	byte  83,byte  83,byte  99,byte  99,byte  82,byte  82,byte  82,byte  98,
332	byte  98,byte  81,byte  81,byte  81,byte  97,byte  97,byte  80,byte  79,
333	byte  66,byte  66,byte  66,byte  66,byte  65,byte  65,byte  65,byte  65,
334	byte  64,byte  64,byte  64,byte  64,byte  79,byte  79,byte  79,byte  79,
335	byte  95,byte  95,byte 111,byte 111,byte  94,byte  94,byte  94,byte  77,
336	byte 110,byte 110,byte  93,byte  93,byte  76,byte 109,byte  92,byte  75,
337	byte  95,byte  95,byte 111,byte 111,byte  94,byte  94,byte  94,byte  77,
338	byte 110,byte 110,byte  93,byte  93,byte  76,byte 109,byte  92,byte  75,
339	byte 108,byte 108,byte 124,byte 111,byte 107,byte  94,byte  94,byte 123,
340	byte 123,byte 106,byte  93,byte  93,byte 122,byte 105,byte  92,byte  75,
341	byte 108,byte 108,byte 108,byte 107,byte 107,byte 107,byte  90,byte 123,
342	byte 106,byte 106,byte 106,byte  89,byte 122,byte 105,byte  88,byte  75,
343	byte  91,byte  91,byte 107,byte 107,byte 107,byte  90,byte  90,byte 123,
344	byte 106,byte 106,byte  89,byte  89,byte 105,byte 105,byte  88,byte  71,
345	byte  91,byte  91,byte  91,byte 107,byte  90,byte  90,byte  90,byte  73,
346	byte 106,byte 106,byte  89,byte  89,byte  72,byte  88,byte  88,byte  71,
347	byte  91,byte  91,byte  91,byte  90,byte  90,byte  90,byte  73,byte  73,
348	byte 106,byte  89,byte  89,byte  72,byte  72,byte  88,byte  88,byte  71,
349	byte  74,byte  74,byte 120,byte 120,byte 120,byte  73,byte  73,byte 119,
350	byte 119,byte 102,byte  89,byte  72,byte  72,byte 101,byte 101,byte  71,
351	byte 104,byte 104,byte 120,byte 103,byte 103,byte 103,byte 103,byte 119,
352	byte 102,byte 102,byte 102,byte 118,byte 118,byte 101,byte  84,byte  67,
353	byte 104,byte 104,byte 103,byte 103,byte 103,byte 103,byte  86,byte 102,
354	byte 102,byte 102,byte  85,byte  85,byte 101,byte 101,byte  84,byte  67,
355	byte  87,byte  87,byte  87,byte 103,byte  86,byte  86,byte  86,byte  86,
356	byte 102,byte  85,byte  85,byte  85,byte  85,byte  84,byte  84,byte  67,
357	byte  87,byte  87,byte  87,byte  86,byte  86,byte  86,byte  69,byte  69,
358	byte 115,byte  85,byte  85,byte  85,byte  68,byte  68,byte  67,byte  67,
359	byte  70,byte  70,byte 116,byte 116,byte  99,byte  69,byte  69,byte  69,
360	byte 115,byte  98,byte  85,byte  68,byte  68,byte  97,byte  97,byte  79,
361	byte 100,byte 100,byte  99,byte  99,byte  99,byte  82,byte  82,byte  98,
362	byte  98,byte  98,byte  81,byte  68,byte  97,byte  97,byte  97,byte  79,
363	byte  83,byte  83,byte  83,byte  82,byte  82,byte  82,byte  82,byte  98,
364	byte  81,byte  81,byte  81,byte  64,byte  97,byte  97,byte  80,byte  79,
365	byte  66,byte  66,byte  66,byte  66,byte  65,byte  65,byte  65,byte  65,
366	byte  64,byte  64,byte  64,byte  64,byte  79,byte  79,byte  79,byte  79,
367	byte  78,byte  78,byte  49,byte  49,byte  94,byte  77,byte  77,byte  48,
368	byte  48,byte  93,byte  93,byte  76,byte  76,byte  63,byte  92,byte  75,
369	byte  78,byte  78,byte  49,byte  49,byte  94,byte  77,byte  77,byte  48,
370	byte  48,byte  93,byte  93,byte  76,byte  76,byte  63,byte  92,byte  75,
371	byte  62,byte  62,byte  61,byte  61,byte  61,byte  61,byte  77,byte  60,
372	byte  60,byte  60,byte  93,byte  76,byte  59,byte  59,byte  59,byte  75,
373	byte  62,byte  62,byte  61,byte  61,byte  61,byte  61,byte  90,byte  60,
374	byte  60,byte  60,byte  89,byte  59,byte  59,byte  59,byte  88,byte  75,
375	byte  91,byte  91,byte  61,byte  61,byte  61,byte  90,byte  73,byte  60,
376	byte  60,byte  60,byte  89,byte  72,byte  59,byte  59,byte  88,byte  71,
377	byte  74,byte  74,byte  61,byte  61,byte  90,byte  73,byte  73,byte  73,
378	byte  60,byte  89,byte  89,byte  72,byte  72,byte  72,byte  71,byte  71,
379	byte  74,byte  74,byte  74,byte  90,byte  73,byte  73,byte  73,byte  73,
380	byte  56,byte  89,byte  72,byte  72,byte  72,byte  72,byte  71,byte  71,
381	byte  58,byte  58,byte  57,byte  57,byte  57,byte  73,byte  73,byte  56,
382	byte  56,byte  56,byte  72,byte  72,byte  55,byte  55,byte  55,byte  71,
383	byte  58,byte  58,byte  57,byte  57,byte  57,byte  57,byte  56,byte  56,
384	byte  56,byte  56,byte  56,byte  55,byte  55,byte  55,byte  55,byte  67,
385	byte  87,byte  87,byte  57,byte  57,byte  57,byte  86,byte  86,byte  56,
386	byte  56,byte  56,byte  85,byte  85,byte  55,byte  55,byte  84,byte  67,
387	byte  87,byte  87,byte  87,byte  86,byte  86,byte  86,byte  69,byte  69,
388	byte  56,byte  85,byte  85,byte  85,byte  68,byte  68,byte  67,byte  67,
389	byte  70,byte  70,byte  70,byte  53,byte  69,byte  69,byte  69,byte  69,
390	byte  52,byte  85,byte  85,byte  68,byte  68,byte  68,byte  67,byte  67,
391	byte  70,byte  70,byte  53,byte  53,byte  53,byte  69,byte  69,byte  52,
392	byte  52,byte  52,byte  68,byte  68,byte  68,byte  51,byte  51,byte  79,
393	byte  54,byte  54,byte  53,byte  53,byte  53,byte  69,byte  69,byte  52,
394	byte  52,byte  52,byte  68,byte  68,byte  51,byte  51,byte  80,byte  79,
395	byte  83,byte  83,byte  53,byte  82,byte  82,byte  65,byte  65,byte  52,
396	byte  52,byte  81,byte  64,byte  64,byte  51,byte  80,byte  80,byte  79,
397	byte  66,byte  66,byte  66,byte  66,byte  65,byte  65,byte  65,byte  65,
398	byte  64,byte  64,byte  64,byte  64,byte  79,byte  79,byte  79,byte  79,
399	byte  50,byte  50,byte  49,byte  49,byte  49,byte  77,byte  77,byte  48,
400	byte  48,byte  48,byte  76,byte  76,byte  63,byte  63,byte  46,byte  12,
401	byte  50,byte  50,byte  49,byte  49,byte  49,byte  77,byte  77,byte  48,
402	byte  48,byte  48,byte  76,byte  76,byte  63,byte  63,byte  46,byte  12,
403	byte  62,byte  62,byte  61,byte  61,byte  61,byte  61,byte  77,byte  60,
404	byte  60,byte  60,byte  60,byte  59,byte  59,byte  59,byte  59,byte  12,
405	byte  62,byte  62,byte  61,byte  61,byte  61,byte  61,byte  60,byte  60,
406	byte  60,byte  60,byte  60,byte  59,byte  59,byte  59,byte  42,byte  12,
407	byte  62,byte  62,byte  61,byte  61,byte  61,byte  61,byte  73,byte  60,
408	byte  60,byte  60,byte  43,byte  59,byte  59,byte  59,byte  42,byte   8,
409	byte  74,byte  74,byte  61,byte  61,byte  61,byte  73,byte  73,byte  60,
410	byte  60,byte  60,byte  72,byte  72,byte  72,byte  59,byte  42,byte   8,
411	byte  74,byte  74,byte  74,byte  57,byte  73,byte  73,byte  73,byte  73,
412	byte  56,byte  56,byte  72,byte  72,byte  72,byte  72,byte  42,byte   8,
413	byte  58,byte  58,byte  57,byte  57,byte  57,byte  57,byte  73,byte  56,
414	byte  56,byte  56,byte  72,byte  55,byte  55,byte  55,byte  55,byte   8,
415	byte  58,byte  58,byte  57,byte  57,byte  57,byte  57,byte  56,byte  56,
416	byte  56,byte  56,byte  56,byte  55,byte  55,byte  55,byte  38,byte   4,
417	byte  58,byte  58,byte  57,byte  57,byte  57,byte  57,byte  56,byte  56,
418	byte  56,byte  56,byte  39,byte  55,byte  55,byte  55,byte  38,byte   4,
419	byte  70,byte  70,byte  57,byte  57,byte  40,byte  69,byte  69,byte  69,
420	byte  56,byte  39,byte  85,byte  68,byte  68,byte  38,byte  38,byte   4,
421	byte  70,byte  70,byte  53,byte  53,byte  53,byte  69,byte  69,byte  52,
422	byte  52,byte  52,byte  68,byte  68,byte  68,byte  51,byte  51,byte   4,
423	byte  54,byte  54,byte  53,byte  53,byte  53,byte  69,byte  69,byte  52,
424	byte  52,byte  52,byte  68,byte  68,byte  51,byte  51,byte  51,byte   0,
425	byte  54,byte  54,byte  53,byte  53,byte  53,byte  53,byte  69,byte  52,
426	byte  52,byte  52,byte  35,byte  51,byte  51,byte  51,byte  34,byte   0,
427	byte  37,byte  37,byte  53,byte  36,byte  36,byte  36,byte  36,byte  52,
428	byte  35,byte  35,byte  35,byte  51,byte  51,byte  34,byte  34,byte   0,
429	byte   3,byte   3,byte   3,byte   3,byte   2,byte   2,byte   2,byte   2,
430	byte   1,byte   1,byte   1,byte   1,byte   0,byte   0,byte   0,byte   0,
431	byte  33,byte  33,byte  49,byte  49,byte  32,byte  32,byte  77,byte  48,
432	byte  48,byte  47,byte  47,byte  63,byte  63,byte  46,byte  46,byte  12,
433	byte  33,byte  33,byte  49,byte  49,byte  32,byte  32,byte  77,byte  48,
434	byte  48,byte  47,byte  47,byte  63,byte  63,byte  46,byte  46,byte  12,
435	byte  62,byte  62,byte  61,byte  61,byte  61,byte  61,byte  60,byte  60,
436	byte  60,byte  43,byte  43,byte  59,byte  59,byte  59,byte  42,byte  12,
437	byte  62,byte  62,byte  61,byte  61,byte  61,byte  44,byte  44,byte  60,
438	byte  60,byte  43,byte  43,byte  59,byte  59,byte  42,byte  42,byte  12,
439	byte  45,byte  45,byte  61,byte  61,byte  44,byte  44,byte  44,byte  60,
440	byte  60,byte  43,byte  43,byte  59,byte  59,byte  42,byte  42,byte   8,
441	byte  45,byte  45,byte  61,byte  44,byte  44,byte  44,byte  73,byte  60,
442	byte  43,byte  43,byte  26,byte  72,byte  59,byte  42,byte  42,byte   8,
443	byte  74,byte  74,byte  57,byte  44,byte  44,byte  73,byte  73,byte  56,
444	byte  43,byte  43,byte  26,byte  72,byte  72,byte  42,byte  42,byte   8,
445	byte  58,byte  58,byte  57,byte  57,byte  57,byte  57,byte  56,byte  56,
446	byte  56,byte  56,byte  39,byte  55,byte  55,byte  55,byte  38,byte   8,
447	byte  58,byte  58,byte  57,byte  57,byte  57,byte  40,byte  40,byte  56,
448	byte  56,byte  39,byte  39,byte  55,byte  55,byte  38,byte  38,byte   4,
449	byte  41,byte  41,byte  40,byte  40,byte  40,byte  40,byte  40,byte  56,
450	byte  39,byte  39,byte  39,byte  55,byte  55,byte  38,byte  38,byte   4,
451	byte  41,byte  41,byte  40,byte  40,byte  40,byte  23,byte  23,byte  39,
452	byte  39,byte  39,byte  22,byte  68,byte  38,byte  38,byte  38,byte   4,
453	byte  54,byte  54,byte  53,byte  53,byte  53,byte  69,byte  69,byte  52,
454	byte  52,byte  52,byte  68,byte  68,byte  51,byte  51,byte  21,byte   4,
455	byte  54,byte  54,byte  53,byte  53,byte  53,byte  53,byte  69,byte  52,
456	byte  52,byte  52,byte  35,byte  51,byte  51,byte  51,byte  34,byte   0,
457	byte  37,byte  37,byte  53,byte  36,byte  36,byte  36,byte  36,byte  52,
458	byte  35,byte  35,byte  35,byte  51,byte  51,byte  34,byte  34,byte   0,
459	byte  37,byte  37,byte  36,byte  36,byte  36,byte  36,byte  36,byte  35,
460	byte  35,byte  35,byte  35,byte  18,byte  34,byte  34,byte  34,byte   0,
461	byte   3,byte   3,byte   3,byte   3,byte   2,byte   2,byte   2,byte   2,
462	byte   1,byte   1,byte   1,byte   1,byte   0,byte   0,byte   0,byte   0,
463	byte  16,byte  16,byte  32,byte  32,byte  31,byte  31,byte  31,byte  47,
464	byte  47,byte  30,byte  30,byte  30,byte  46,byte  46,byte  29,byte  12,
465	byte  16,byte  16,byte  32,byte  32,byte  31,byte  31,byte  31,byte  47,
466	byte  47,byte  30,byte  30,byte  30,byte  46,byte  46,byte  29,byte  12,
467	byte  45,byte  45,byte  44,byte  44,byte  44,byte  44,byte  31,byte  60,
468	byte  43,byte  43,byte  30,byte  59,byte  59,byte  42,byte  42,byte  12,
469	byte  45,byte  45,byte  44,byte  44,byte  44,byte  44,byte  27,byte  43,
470	byte  43,byte  43,byte  26,byte  26,byte  42,byte  42,byte  42,byte  12,
471	byte  28,byte  28,byte  44,byte  44,byte  27,byte  27,byte  27,byte  43,
472	byte  43,byte  26,byte  26,byte  26,byte  42,byte  42,byte  25,byte   8,
473	byte  28,byte  28,byte  44,byte  44,byte  27,byte  27,byte  27,byte  43,
474	byte  43,byte  26,byte  26,byte   9,byte  42,byte  42,byte  25,byte   8,
475	byte  28,byte  28,byte  28,byte  27,byte  27,byte  27,byte  10,byte  43,
476	byte  26,byte  26,byte  26,byte   9,byte  42,byte  42,byte  25,byte   8,
477	byte  41,byte  41,byte  57,byte  40,byte  40,byte  40,byte  40,byte  56,
478	byte  39,byte  39,byte  39,byte  55,byte  55,byte  38,byte  38,byte   8,
479	byte  41,byte  41,byte  40,byte  40,byte  40,byte  40,byte  23,byte  39,
480	byte  39,byte  39,byte  22,byte  55,byte  38,byte  38,byte  38,byte   4,
481	byte  24,byte  24,byte  40,byte  40,byte  23,byte  23,byte  23,byte  39,
482	byte  39,byte  22,byte  22,byte  22,byte  38,byte  38,byte  21,byte   4,
483	byte  24,byte  24,byte  24,byte  23,byte  23,byte  23,byte  23,byte  39,
484	byte  22,byte  22,byte  22,byte   5,byte  38,byte  38,byte  21,byte   4,
485	byte  24,byte  24,byte  53,byte  23,byte  23,byte   6,byte   6,byte  52,
486	byte  52,byte  22,byte   5,byte   5,byte  51,byte  21,byte  21,byte   4,
487	byte  37,byte  37,byte  53,byte  36,byte  36,byte  36,byte  36,byte  52,
488	byte  35,byte  35,byte  35,byte  51,byte  51,byte  34,byte  34,byte   0,
489	byte  37,byte  37,byte  36,byte  36,byte  36,byte  36,byte  36,byte  35,
490	byte  35,byte  35,byte  35,byte  18,byte  34,byte  34,byte  34,byte   0,
491	byte  20,byte  20,byte  36,byte  36,byte  19,byte  19,byte  19,byte  35,
492	byte  35,byte  18,byte  18,byte  18,byte  34,byte  34,byte  17,byte   0,
493	byte   3,byte   3,byte   3,byte   3,byte   2,byte   2,byte   2,byte   2,
494	byte   1,byte   1,byte   1,byte   1,byte   0,byte   0,byte   0,byte   0,
495	byte  15,byte  15,byte  15,byte  15,byte  14,byte  14,byte  14,byte  14,
496	byte  13,byte  13,byte  13,byte  13,byte  12,byte  12,byte  12,byte  12,
497	byte  15,byte  15,byte  15,byte  15,byte  14,byte  14,byte  14,byte  14,
498	byte  13,byte  13,byte  13,byte  13,byte  12,byte  12,byte  12,byte  12,
499	byte  15,byte  15,byte  15,byte  15,byte  14,byte  14,byte  14,byte  14,
500	byte  13,byte  13,byte  13,byte  13,byte  12,byte  12,byte  12,byte  12,
501	byte  15,byte  15,byte  15,byte  15,byte  14,byte  14,byte  14,byte  14,
502	byte  13,byte  13,byte  13,byte  13,byte  12,byte  12,byte  12,byte  12,
503	byte  11,byte  11,byte  11,byte  11,byte  10,byte  10,byte  10,byte  10,
504	byte   9,byte   9,byte   9,byte   9,byte   8,byte   8,byte   8,byte   8,
505	byte  11,byte  11,byte  11,byte  11,byte  10,byte  10,byte  10,byte  10,
506	byte   9,byte   9,byte   9,byte   9,byte   8,byte   8,byte   8,byte   8,
507	byte  11,byte  11,byte  11,byte  11,byte  10,byte  10,byte  10,byte  10,
508	byte   9,byte   9,byte   9,byte   9,byte   8,byte   8,byte   8,byte   8,
509	byte  11,byte  11,byte  11,byte  11,byte  10,byte  10,byte  10,byte  10,
510	byte   9,byte   9,byte   9,byte   9,byte   8,byte   8,byte   8,byte   8,
511	byte   7,byte   7,byte   7,byte   7,byte   6,byte   6,byte   6,byte   6,
512	byte   5,byte   5,byte   5,byte   5,byte   4,byte   4,byte   4,byte   4,
513	byte   7,byte   7,byte   7,byte   7,byte   6,byte   6,byte   6,byte   6,
514	byte   5,byte   5,byte   5,byte   5,byte   4,byte   4,byte   4,byte   4,
515	byte   7,byte   7,byte   7,byte   7,byte   6,byte   6,byte   6,byte   6,
516	byte   5,byte   5,byte   5,byte   5,byte   4,byte   4,byte   4,byte   4,
517	byte   7,byte   7,byte   7,byte   7,byte   6,byte   6,byte   6,byte   6,
518	byte   5,byte   5,byte   5,byte   5,byte   4,byte   4,byte   4,byte   4,
519	byte   3,byte   3,byte   3,byte   3,byte   2,byte   2,byte   2,byte   2,
520	byte   1,byte   1,byte   1,byte   1,byte   0,byte   0,byte   0,byte   0,
521	byte   3,byte   3,byte   3,byte   3,byte   2,byte   2,byte   2,byte   2,
522	byte   1,byte   1,byte   1,byte   1,byte   0,byte   0,byte   0,byte   0,
523	byte   3,byte   3,byte   3,byte   3,byte   2,byte   2,byte   2,byte   2,
524	byte   1,byte   1,byte   1,byte   1,byte   0,byte   0,byte   0,byte   0,
525	byte   3,byte   3,byte   3,byte   3,byte   2,byte   2,byte   2,byte   2,
526	byte   1,byte   1,byte   1,byte   1,byte   0,byte   0,byte   0,byte   0,
527};
528
529clamp: array of int;
530rgbvmap: array of int;
531
532init(d: ref Display)
533{
534	# initialise in a way that make races slightly wasteful but benign
535	if(sys == nil)
536		sys = load Sys Sys->PATH;
537	if(draw == nil)
538		draw = load Draw Draw->PATH;
539	if(clamp == nil){
540		m := array[64+256+64] of int;
541		for(j:=0; j<64; j++)
542			m[j] = 0;
543		for(j=0; j<256; j++)
544			m[64+j] = (j>>4);
545		for(j=0; j<64; j++)
546			m[64+256+j] = (255>>4);
547		clamp = m;
548	}
549	if(rgbvmap == nil){
550		m := array[3*256] of int;
551		for(j:=0; j<256; j++)
552			(m[3*j+0], m[3*j+1], m[3*j+2]) = d.cmap2rgb(j);
553		rgbvmap = m;
554	}
555}
556
557remap(i: ref RImagefile->Rawimage, d: ref Display, errdiff: int): (ref Image, string)
558{
559	if(sys == nil || draw == nil || clamp == nil || rgbvmap == nil)
560		init(d);	# temporarily do this here until all clients change to call init
561	j: int;
562	im := d.newimage(i.r, Draw->CMAP8, 0, Draw->Black);
563	dx := i.r.max.x-i.r.min.x;
564	dy := i.r.max.y-i.r.min.y;
565	cmap := i.cmap;
566
567	pic := i.chans[0];
568
569	case i.chandesc{
570	RImagefile->CRGB1 =>
571		if(cmap == nil)
572			return (nil, sys->sprint("image has no color map"));
573		if(i.nchans != 1)
574			return (nil, sys->sprint("can't handle nchans %d", i.nchans));
575		for(j=1; j<=8; j++)
576			if(len cmap == 3*(1<<j))
577				break;
578		if(j > 8)
579			return (nil, sys->sprint("can't understand colormap size 3*%d", len cmap/3));
580		if(len cmap != 3*256){
581			# to avoid a range check in inner loop below, make a full-size cmap
582			cmap1 := array[3*256] of byte;
583			cmap1[0:] = cmap[0:];
584			cmap = cmap1;
585			errdiff = 0;	# why not?
586		}
587		if(errdiff == 0){
588			map := array[256] of byte;
589			k := 0;
590			for(j=0; j<256; j++){
591				r := int cmap[k]>>4;
592				g := int cmap[k+1]>>4;
593				b := int cmap[k+2]>>4;
594				k += 3;
595				map[j] = byte 255 - closest[b+16*(g+16*r)];
596			}
597			for(j=0; j<len pic; j++)
598				pic[j] = map[int pic[j]];
599		}else{
600			# modified floyd steinberg, coefficients (1 0) 3/16, (0, 1) 3/16, (1, 1) 7/16
601			ered := array[dx+1] of int;
602			egrn := array[dx+1] of int;
603			eblu := array[dx+1] of int;
604			for(j=0; j<=dx; j++)
605				ered[j] = 0;
606			egrn[0:] = ered[0:];
607			eblu[0:] = ered[0:];
608			p := 0;
609			for(y:=0; y<dy; y++){
610				er := 0;
611				eg := 0;
612				eb := 0;
613				for(x:=0; x<dx; x++){
614					in := 3*int pic[p];
615					r := int cmap[in+0]+ered[x];
616					g := int cmap[in+1]+egrn[x];
617					b := int cmap[in+2]+eblu[x];
618					r1 := clamp[r+64];
619					g1 := clamp[g+64];
620					b1 := clamp[b+64];
621					col := 255 - int closest[b1+16*(g1+16*r1)];
622					pic[p++] = byte col;
623
624					col *= 3;
625					r -= rgbvmap[col+0];
626					t := (3*r)>>4;
627					ered[x] = t+er;
628					ered[x+1] += t;
629					er = r-3*t;
630
631					g -= rgbvmap[col+1];
632					t = (3*g)>>4;
633					egrn[x] = t+eg;
634					egrn[x+1] += t;
635					eg = g-3*t;
636
637					b -= rgbvmap[col+2];
638					t = (3*b)>>4;
639					eblu[x] = t+eb;
640					eblu[x+1] += t;
641					eb = b-3*t;
642				}
643			}
644		}
645	RImagefile->CRGB =>
646		if(i.nchans != 3)
647			return (nil, sys->sprint("RGB image has %d channels", i.nchans));
648		rpic := i.chans[0];
649		gpic := i.chans[1];
650		bpic := i.chans[2];
651		if(errdiff == 0){
652			for(j=0; j<len rpic; j++){
653				r := int rpic[j]>>4;
654				g := int gpic[j]>>4;
655				b := int bpic[j]>>4;
656				pic[j] = byte 255 - byte closest[b+16*(g+16*r)];
657			}
658		}else{
659			# modified floyd steinberg, coefficients (1 0) 3/16, (0, 1) 3/16, (1, 1) 7/16
660			ered := array[dx+1] of int;
661			egrn := array[dx+1] of int;
662			eblu := array[dx+1] of int;
663			for(j=0; j<=dx; j++)
664				ered[j] = 0;
665			egrn[0:] = ered[0:];
666			eblu[0:] = ered[0:];
667			p := 0;
668			for(y:=0; y<dy; y++){
669				er := 0;
670				eg := 0;
671				eb := 0;
672				for(x:=0; x<dx; x++){
673					r := int rpic[p]+ered[x];
674					g := int gpic[p]+egrn[x];
675					b := int bpic[p]+eblu[x];
676					r1 := clamp[r+64];
677					g1 := clamp[g+64];
678					b1 := clamp[b+64];
679					col := 255 - int closest[b1+16*(g1+16*r1)];
680					pic[p++] = byte col;
681
682					col *= 3;
683					r -= rgbvmap[col+0];
684					t := (3*r)>>4;
685					ered[x] = t+er;
686					ered[x+1] += t;
687					er = r-3*t;
688
689					g -= rgbvmap[col+1];
690					t = (3*g)>>4;
691					egrn[x] = t+eg;
692					egrn[x+1] += t;
693					eg = g-3*t;
694
695					b -= rgbvmap[col+2];
696					t = (3*b)>>4;
697					eblu[x] = t+eb;
698					eblu[x+1] += t;
699					eb = b-3*t;
700				}
701			}
702		}
703	RImagefile->CY =>
704		if(i.nchans != 1)
705			return (nil, sys->sprint("Y image has %d chans", i.nchans));
706		rpic := i.chans[0];
707		if(errdiff == 0){
708			for(j=0; j<len pic; j++){
709				r := int rpic[j]>>4;
710				pic[j] = byte 255 - byte closest[r+16*(r+16*r)];
711			}
712		}else{
713			# modified floyd steinberg, coefficients (1 0) 3/16, (0, 1) 3/16, (1, 1) 7/16
714			ered := array[dx+1] of int;
715			for(j=0; j<=dx; j++)
716				ered[j] = 0;
717			p := 0;
718			for(y:=0; y<dy; y++){
719				er := 0;
720				for(x:=0; x<dx; x++){
721					r := int rpic[p]+ered[x];
722					r1 := clamp[r+64];
723					col := 255-int closest[r1+16*(r1+16*r1)];
724					pic[p++] = byte col;
725
726					col *= 3;
727					r -= rgbvmap[col+0];
728					t := (3*r)>>4;
729					ered[x] = t+er;
730					ered[x+1] += t;
731					er = r-3*t;
732				}
733			}
734		}
735	}
736	im.writepixels(im.r, pic);
737	return (im, "");
738}
739