]> asedeno.scripts.mit.edu Git - PuTTY_svn.git/blob - minibidi.h
b0dcd634d0d82c758c109fc6f9a250565de79982
[PuTTY_svn.git] / minibidi.h
1 /************************************************************************
2  * $Id$
3  *
4  * ------------
5  * Description:
6  * ------------
7  * This is an implemention of Unicode's Bidirectional Algorithm
8  * (known as UAX #9).
9  *
10  *   http://www.unicode.org/reports/tr9/
11  * 
12  * Author: Ahmad Khalifa
13  *
14  * -----------------
15  * Revision Details:    (Updated by Revision Control System)
16  * -----------------
17  *  $Date$
18  *  $Author$
19  *  $Revision$
20  *
21  * (www.arabeyes.org - under MIT license)
22  *
23  ************************************************************************/
24
25 /*
26  * TODO:
27  * =====
28  * - work almost finished
29  * - Shaping Table to be expanded to include the whole range.
30  * - Ligature handling
31  */
32
33 #include <stdlib.h>     /* definition of wchar_t*/
34
35 #define LMASK   0x3F    /* Embedding Level mask */
36 #define OMASK   0xC0    /* Override mask */
37 #define OISL    0x80    /* Override is L */
38 #define OISR    0x40    /* Override is R */
39
40 /* Shaping Helpers */
41 #define STYPE(xh) (((xh >= SHAPE_FIRST) && (xh <= SHAPE_LAST)) ? \
42 shapetypes[xh-SHAPE_FIRST].type : SU) /*))*/
43 #define SISOLATED(xh) (shapetypes[xh-SHAPE_FIRST].form_b)
44 #define SFINAL(xh) xh+1
45 #define SINITIAL(xh) xh+2
46 #define SMEDIAL(ch) ch+3
47
48 typedef struct bidi_char {
49     wchar_t origwc, wc;
50     unsigned short index;
51 } bidi_char;
52
53 /* function declarations */
54 void flipThisRun(bidi_char *from, unsigned char* level, int max, int count);
55 int findIndexOfRun(unsigned char* level , int start, int count, int tlevel);
56 unsigned char getType(wchar_t ch);
57 unsigned char setOverrideBits(unsigned char level, unsigned char override);
58 int getPreviousLevel(unsigned char* level, int from);
59 unsigned char leastGreaterOdd(unsigned char x);
60 unsigned char leastGreaterEven(unsigned char x);
61 unsigned char getRLE(wchar_t ch);
62 int do_shape(bidi_char *line, bidi_char *to, int count);
63 int do_bidi(bidi_char *line, int count);
64 void doMirror(wchar_t* ch);
65
66 /* character types */
67 enum
68 {
69    L,
70    LRE,
71    LRO,
72    R,
73    AL,
74    RLE,
75    RLO,
76    PDF,
77    EN,
78    ES,
79    ET,
80    AN,
81    CS,
82    NSM,
83    BN,
84    B,
85    S,
86    WS,
87    ON,
88 };
89
90 /* Shaping Types */
91 enum
92 {
93         SL, /* Left-Joining, doesnt exist in U+0600 - U+06FF */
94         SR, /* Right-Joining, ie has Isolated, Final */
95         SD, /* Dual-Joining, ie has Isolated, Final, Initial, Medial */
96         SU, /* Non-Joining */
97         SC  /* Join-Causing, like U+0640 (TATWEEL) */
98 };
99
100 typedef struct{
101         char type;
102         wchar_t form_b;
103 } shape_node;
104
105 /* Kept near the actual table, for verification. */
106 #define SHAPE_FIRST 0x621
107 #define SHAPE_LAST 0x64A
108
109 const shape_node shapetypes[] = {
110 /* index, Typ, Iso, Ligature Index*/
111 /* 621 */ {SU, 0xFE80},
112 /* 622 */ {SR, 0xFE81},
113 /* 623 */ {SR, 0xFE83},
114 /* 624 */ {SR, 0xFE85},
115 /* 625 */ {SR, 0xFE87},
116 /* 626 */ {SD, 0xFE89},
117 /* 627 */ {SR, 0xFE8D},
118 /* 628 */ {SD, 0xFE8F},
119 /* 629 */ {SR, 0xFE93},
120 /* 62A */ {SD, 0xFE95},
121 /* 62B */ {SD, 0xFE99},
122 /* 62C */ {SD, 0xFE9D},
123 /* 62D */ {SD, 0xFEA1},
124 /* 62E */ {SD, 0xFEA5},
125 /* 62F */ {SR, 0xFEA9},
126 /* 630 */ {SR, 0xFEAB},
127 /* 631 */ {SR, 0xFEAD},
128 /* 632 */ {SR, 0xFEAF},
129 /* 633 */ {SD, 0xFEB1},
130 /* 634 */ {SD, 0xFEB5},
131 /* 635 */ {SD, 0xFEB9},
132 /* 636 */ {SD, 0xFEBD},
133 /* 637 */ {SD, 0xFEC1},
134 /* 638 */ {SD, 0xFEC5},
135 /* 639 */ {SD, 0xFEC9},
136 /* 63A */ {SD, 0xFECD},
137 /* 63B */ {SU, 0x0},
138 /* 63C */ {SU, 0x0},
139 /* 63D */ {SU, 0x0},
140 /* 63E */ {SU, 0x0},
141 /* 63F */ {SU, 0x0},
142 /* 640 */ {SC, 0x0},
143 /* 641 */ {SD, 0xFED1},
144 /* 642 */ {SD, 0xFED5},
145 /* 643 */ {SD, 0xFED9},
146 /* 644 */ {SD, 0xFEDD},
147 /* 645 */ {SD, 0xFEE1},
148 /* 646 */ {SD, 0xFEE5},
149 /* 647 */ {SD, 0xFEE9},
150 /* 648 */ {SR, 0xFEED},
151 /* 649 */ {SR, 0xFEEF}, /* SD */
152 /* 64A */ {SD, 0xFEF1},
153 };
154
155 /*
156  * This describes the data byte and its frequency  
157  */
158 typedef struct
159 {
160    unsigned char d;
161    unsigned char f;
162 }RLENode;
163
164
165 /* This is an array of RLENodes, which is the
166  * Compressed unicode types table
167  */
168 const RLENode RLE_table[] =
169 {
170     { BN,   9}, {  S,   1}, {  B,   1}, {  S,   1}, { WS,   1},
171     {  B,   1}, { BN,  14}, {  B,   3}, {  S,   1}, { WS,   1},
172     { ON,   2}, { ET,   3}, { ON,   5}, { ET,   1}, { CS,   1},
173     { ET,   1}, { CS,   1}, { ES,   1}, { EN,  10}, { CS,   1},
174     { ON,   6}, {  L,  26}, { ON,   6}, {  L,  26}, { ON,   4},
175     { BN,   6}, {  B,   1}, { BN,  26}, { CS,   1}, { ON,   1},
176     { ET,   4}, { ON,   4}, {  L,   1}, { ON,   5}, { ET,   2},
177     { EN,   2}, { ON,   1}, {  L,   1}, { ON,   3}, { EN,   1},
178     {  L,   1}, { ON,   5}, {  L,  23}, { ON,   1}, {  L,  31},
179     { ON,   1}, {  L, 255}, {  L,  42}, { ON,   1}, {  L,  18},
180     { ON,  28}, {  L,  94}, { ON,   2}, {  L,   9}, { ON,   2},
181     {  L,   7}, { ON,  14}, {  L,   2}, { ON,  14}, {  L,   5},
182     { ON,   9}, {  L,   1}, { ON,  17}, {NSM,  80}, { ON,  16},
183     {NSM,  16}, { ON,  10}, {  L,   1}, { ON,  11}, {  L,   1},
184     { ON,   1}, {  L,   3}, { ON,   1}, {  L,   1}, { ON,   1},
185     {  L,  20}, { ON,   1}, {  L,  44}, { ON,   1}, {  L,  38},
186     { ON,  10}, {  L, 131}, {NSM,   4}, { ON,   1}, {NSM,   2},
187     {  L,  69}, { ON,   1}, {  L,  38}, { ON,   2}, {  L,   2},
188     { ON,   6}, {  L,  16}, { ON,  33}, {  L,  38}, { ON,   2},
189     {  L,   7}, { ON,   1}, {  L,  39}, { ON,   1}, {  L,   1},
190     { ON,   7}, {NSM,  17}, { ON,   1}, {NSM,  23}, { ON,   1},
191     {NSM,   3}, {  R,   1}, {NSM,   1}, {  R,   1}, {NSM,   2},
192     {  R,   1}, {NSM,   1}, { ON,  11}, {  R,  27}, { ON,   5},
193     {  R,   5}, { ON,  23}, { CS,   1}, { ON,  14}, { AL,   1},
194     { ON,   3}, { AL,   1}, { ON,   1}, { AL,  26}, { ON,   5},
195     { AL,  11}, {NSM,  11}, { ON,  10}, { AN,  10}, { ET,   1},
196     { AN,   2}, { AL,   3}, {NSM,   1}, { AL, 101}, {NSM,   7},
197     { AL,   1}, {NSM,   7}, { AL,   2}, {NSM,   2}, { ON,   1},
198     {NSM,   4}, { ON,   2}, { EN,  10}, { AL,   5}, { ON,   1},
199     { AL,  14}, { ON,   1}, { BN,   1}, { AL,   1}, {NSM,   1},
200     { AL,  27}, { ON,   3}, {NSM,  27}, { ON,  53}, { AL,  38},
201     {NSM,  11}, { AL,   1}, { ON, 255}, { ON,  80}, {NSM,   2},
202     {  L,   1}, { ON,   1}, {  L,  53}, { ON,   2}, {NSM,   1},
203     {  L,   4}, {NSM,   8}, {  L,   4}, {NSM,   1}, { ON,   2},
204     {  L,   1}, {NSM,   4}, { ON,   3}, {  L,  10}, {NSM,   2},
205     {  L,  13}, { ON,  16}, {NSM,   1}, {  L,   2}, { ON,   1},
206     {  L,   8}, { ON,   2}, {  L,   2}, { ON,   2}, {  L,  22},
207     { ON,   1}, {  L,   7}, { ON,   1}, {  L,   1}, { ON,   3},
208     {  L,   4}, { ON,   2}, {NSM,   1}, { ON,   1}, {  L,   3},
209     {NSM,   4}, { ON,   2}, {  L,   2}, { ON,   2}, {  L,   2},
210     {NSM,   1}, { ON,   9}, {  L,   1}, { ON,   4}, {  L,   2},
211     { ON,   1}, {  L,   3}, {NSM,   2}, { ON,   2}, {  L,  12},
212     { ET,   2}, {  L,   7}, { ON,   7}, {NSM,   1}, { ON,   2},
213     {  L,   6}, { ON,   4}, {  L,   2}, { ON,   2}, {  L,  22},
214     { ON,   1}, {  L,   7}, { ON,   1}, {  L,   2}, { ON,   1},
215     {  L,   2}, { ON,   1}, {  L,   2}, { ON,   2}, {NSM,   1},
216     { ON,   1}, {  L,   3}, {NSM,   2}, { ON,   4}, {NSM,   2},
217     { ON,   2}, {NSM,   3}, { ON,  11}, {  L,   4}, { ON,   1},
218     {  L,   1}, { ON,   7}, {  L,  10}, {NSM,   2}, {  L,   3},
219     { ON,  12}, {NSM,   2}, {  L,   1}, { ON,   1}, {  L,   7},
220     { ON,   1}, {  L,   1}, { ON,   1}, {  L,   3}, { ON,   1},
221     {  L,  22}, { ON,   1}, {  L,   7}, { ON,   1}, {  L,   2},
222     { ON,   1}, {  L,   5}, { ON,   2}, {NSM,   1}, {  L,   4},
223     {NSM,   5}, { ON,   1}, {NSM,   2}, {  L,   1}, { ON,   1},
224     {  L,   2}, {NSM,   1}, { ON,   2}, {  L,   1}, { ON,  15},
225     {  L,   1}, { ON,   5}, {  L,  10}, { ON,  17}, {NSM,   1},
226     {  L,   2}, { ON,   1}, {  L,   8}, { ON,   2}, {  L,   2},
227     { ON,   2}, {  L,  22}, { ON,   1}, {  L,   7}, { ON,   1},
228     {  L,   2}, { ON,   2}, {  L,   4}, { ON,   2}, {NSM,   1},
229     {  L,   2}, {NSM,   1}, {  L,   1}, {NSM,   3}, { ON,   3},
230     {  L,   2}, { ON,   2}, {  L,   2}, {NSM,   1}, { ON,   8},
231     {NSM,   1}, {  L,   1}, { ON,   4}, {  L,   2}, { ON,   1},
232     {  L,   3}, { ON,   4}, {  L,  11}, { ON,  17}, {NSM,   1},
233     {  L,   1}, { ON,   1}, {  L,   6}, { ON,   3}, {  L,   3},
234     { ON,   1}, {  L,   4}, { ON,   3}, {  L,   2}, { ON,   1},
235     {  L,   1}, { ON,   1}, {  L,   2}, { ON,   3}, {  L,   2},
236     { ON,   3}, {  L,   3}, { ON,   3}, {  L,   8}, { ON,   1},
237     {  L,   3}, { ON,   4}, {  L,   2}, {NSM,   1}, {  L,   2},
238     { ON,   3}, {  L,   3}, { ON,   1}, {  L,   3}, {NSM,   1},
239     { ON,   9}, {  L,   1}, { ON,  15}, {  L,  12}, { ON,  14},
240     {  L,   3}, { ON,   1}, {  L,   8}, { ON,   1}, {  L,   3},
241     { ON,   1}, {  L,  23}, { ON,   1}, {  L,  10}, { ON,   1},
242     {  L,   5}, { ON,   4}, {NSM,   3}, {  L,   4}, { ON,   1},
243     {NSM,   3}, { ON,   1}, {NSM,   4}, { ON,   7}, {NSM,   2},
244     { ON,   9}, {  L,   2}, { ON,   4}, {  L,  10}, { ON,  18},
245     {  L,   2}, { ON,   1}, {  L,   8}, { ON,   1}, {  L,   3},
246     { ON,   1}, {  L,  23}, { ON,   1}, {  L,  10}, { ON,   1},
247     {  L,   5}, { ON,   4}, {  L,   1}, {NSM,   1}, {  L,   5},
248     { ON,   1}, {NSM,   1}, {  L,   2}, { ON,   1}, {  L,   2},
249     {NSM,   2}, { ON,   7}, {  L,   2}, { ON,   7}, {  L,   1},
250     { ON,   1}, {  L,   2}, { ON,   4}, {  L,  10}, { ON,  18},
251     {  L,   2}, { ON,   1}, {  L,   8}, { ON,   1}, {  L,   3},
252     { ON,   1}, {  L,  23}, { ON,   1}, {  L,  16}, { ON,   4},
253     {  L,   3}, {NSM,   3}, { ON,   2}, {  L,   3}, { ON,   1},
254     {  L,   3}, {NSM,   1}, { ON,   9}, {  L,   1}, { ON,   8},
255     {  L,   2}, { ON,   4}, {  L,  10}, { ON,  18}, {  L,   2},
256     { ON,   1}, {  L,  18}, { ON,   3}, {  L,  24}, { ON,   1},
257     {  L,   9}, { ON,   1}, {  L,   1}, { ON,   2}, {  L,   7},
258     { ON,   3}, {NSM,   1}, { ON,   4}, {  L,   3}, {NSM,   3},
259     { ON,   1}, {NSM,   1}, { ON,   1}, {  L,   8}, { ON,  18},
260     {  L,   3}, { ON,  12}, {  L,  48}, {NSM,   1}, {  L,   2},
261     {NSM,   7}, { ON,   4}, { ET,   1}, {  L,   7}, {NSM,   8},
262     {  L,  13}, { ON,  37}, {  L,   2}, { ON,   1}, {  L,   1},
263     { ON,   2}, {  L,   2}, { ON,   1}, {  L,   1}, { ON,   2},
264     {  L,   1}, { ON,   6}, {  L,   4}, { ON,   1}, {  L,   7},
265     { ON,   1}, {  L,   3}, { ON,   1}, {  L,   1}, { ON,   1},
266     {  L,   1}, { ON,   2}, {  L,   2}, { ON,   1}, {  L,   4},
267     {NSM,   1}, {  L,   2}, {NSM,   6}, { ON,   1}, {NSM,   2},
268     {  L,   1}, { ON,   2}, {  L,   5}, { ON,   1}, {  L,   1},
269     { ON,   1}, {NSM,   6}, { ON,   2}, {  L,  10}, { ON,   2},
270     {  L,   2}, { ON,  34}, {  L,  24}, {NSM,   2}, {  L,  27},
271     {NSM,   1}, {  L,   1}, {NSM,   1}, {  L,   1}, {NSM,   1},
272     { ON,   4}, {  L,  10}, { ON,   1}, {  L,  34}, { ON,   6},
273     {NSM,  14}, {  L,   1}, {NSM,   5}, {  L,   1}, {NSM,   2},
274     {  L,   4}, { ON,   4}, {NSM,   8}, { ON,   1}, {NSM,  36},
275     { ON,   1}, {  L,   8}, {NSM,   1}, {  L,   6}, { ON,   2},
276     {  L,   1}, { ON,  48}, {  L,  34}, { ON,   1}, {  L,   5},
277     { ON,   1}, {  L,   2}, { ON,   1}, {  L,   1}, {NSM,   4},
278     {  L,   1}, {NSM,   1}, { ON,   3}, {NSM,   2}, {  L,   1},
279     {NSM,   1}, { ON,   6}, {  L,  24}, {NSM,   2}, { ON,  70},
280     {  L,  38}, { ON,  10}, {  L,  41}, { ON,   2}, {  L,   1},
281     { ON,   4}, {  L,  90}, { ON,   5}, {  L,  68}, { ON,   5},
282     {  L,  82}, { ON,   6}, {  L,   7}, { ON,   1}, {  L,  63},
283     { ON,   1}, {  L,   1}, { ON,   1}, {  L,   4}, { ON,   2},
284     {  L,   7}, { ON,   1}, {  L,   1}, { ON,   1}, {  L,   4},
285     { ON,   2}, {  L,  39}, { ON,   1}, {  L,   1}, { ON,   1},
286     {  L,   4}, { ON,   2}, {  L,  31}, { ON,   1}, {  L,   1},
287     { ON,   1}, {  L,   4}, { ON,   2}, {  L,   7}, { ON,   1},
288     {  L,   1}, { ON,   1}, {  L,   4}, { ON,   2}, {  L,   7},
289     { ON,   1}, {  L,   7}, { ON,   1}, {  L,  23}, { ON,   1},
290     {  L,  31}, { ON,   1}, {  L,   1}, { ON,   1}, {  L,   4},
291     { ON,   2}, {  L,   7}, { ON,   1}, {  L,  39}, { ON,   1},
292     {  L,  19}, { ON,   6}, {  L,  28}, { ON,  35}, {  L,  85},
293     { ON,  12}, {  L, 255}, {  L, 255}, {  L, 120}, { ON,   9},
294     { WS,   1}, {  L,  26}, { ON,   5}, {  L,  81}, { ON,  15},
295     {  L,  13}, { ON,   1}, {  L,   4}, {NSM,   3}, { ON,  11},
296     {  L,  18}, {NSM,   3}, {  L,   2}, { ON,   9}, {  L,  18},
297     {NSM,   2}, { ON,  12}, {  L,  13}, { ON,   1}, {  L,   3},
298     { ON,   1}, {NSM,   2}, { ON,  12}, {  L,  55}, {NSM,   7},
299     {  L,   8}, {NSM,   1}, {  L,   2}, {NSM,  11}, {  L,   7},
300     { ET,   1}, {  L,   1}, { ON,   3}, {  L,  10}, { ON,  33},
301     {NSM,   3}, { BN,   1}, { ON,   1}, {  L,  10}, { ON,   6},
302     {  L,  88}, { ON,   8}, {  L,  41}, {NSM,   1}, { ON, 255},
303     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON,  91},
304     {  L, 156}, { ON,   4}, {  L,  90}, { ON,   6}, {  L,  22},
305     { ON,   2}, {  L,   6}, { ON,   2}, {  L,  38}, { ON,   2},
306     {  L,   6}, { ON,   2}, {  L,   8}, { ON,   1}, {  L,   1},
307     { ON,   1}, {  L,   1}, { ON,   1}, {  L,   1}, { ON,   1},
308     {  L,  31}, { ON,   2}, {  L,  53}, { ON,   1}, {  L,   7},
309     { ON,   1}, {  L,   1}, { ON,   3}, {  L,   3}, { ON,   1},
310     {  L,   7}, { ON,   3}, {  L,   4}, { ON,   2}, {  L,   6},
311     { ON,   4}, {  L,  13}, { ON,   5}, {  L,   3}, { ON,   1},
312     {  L,   7}, { ON,   3}, { WS,  11}, { BN,   3}, {  L,   1},
313     {  R,   1}, { ON,  24}, { WS,   1}, {  B,   1}, {LRE,   1},
314     {RLE,   1}, {PDF,   1}, {LRO,   1}, {RLO,   1}, { WS,   1},
315     { ET,   5}, { ON,  42}, { WS,   1}, { BN,   4}, { ON,   6},
316     { BN,   6}, { EN,   1}, {  L,   1}, { ON,   2}, { EN,   6},
317     { ET,   2}, { ON,   3}, {  L,   1}, { EN,  10}, { ET,   2},
318     { ON,  20}, { ET,  18}, { ON,  30}, {NSM,  27}, { ON,  23},
319     {  L,   1}, { ON,   4}, {  L,   1}, { ON,   2}, {  L,  10},
320     { ON,   1}, {  L,   1}, { ON,   3}, {  L,   5}, { ON,   6},
321     {  L,   1}, { ON,   1}, {  L,   1}, { ON,   1}, {  L,   1},
322     { ON,   1}, {  L,   4}, { ET,   1}, {  L,   3}, { ON,   1},
323     {  L,   7}, { ON,   3}, {  L,   3}, { ON,   5}, {  L,   5},
324     { ON,  22}, {  L,  36}, { ON, 142}, { ET,   2}, { ON, 255},
325     { ON,  35}, {  L,  69}, { ON,  26}, {  L,   1}, { ON, 202},
326     { EN,  60}, {  L,  78}, { EN,   1}, { ON, 255}, { ON, 255},
327     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
328     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON,  32},
329     { WS,   1}, { ON,   4}, {  L,   3}, { ON,  25}, {  L,   9},
330     {NSM,   6}, { ON,   1}, {  L,   5}, { ON,   2}, {  L,   5},
331     { ON,   4}, {  L,  86}, { ON,   2}, {NSM,   2}, { ON,   2},
332     {  L,   3}, { ON,   1}, {  L,  90}, { ON,   1}, {  L,   4},
333     { ON,   5}, {  L,  40}, { ON,   4}, {  L,  94}, { ON,   1},
334     {  L,  40}, { ON,  56}, {  L,  45}, { ON,   3}, {  L,  36},
335     { ON,  28}, {  L,  28}, { ON,   3}, {  L,  50}, { ON,  15},
336     {  L,  12}, { ON,   4}, {  L,  47}, { ON,   1}, {  L, 119},
337     { ON,   4}, {  L,  99}, { ON,   2}, {  L,  31}, { ON,   1},
338     {  L,   1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
339     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
340     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
341     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
342     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
343     { ON, 255}, { ON, 205}, {  L,   1}, { ON,  74}, {  L,   1},
344     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
345     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
346     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
347     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
348     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
349     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
350     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
351     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
352     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
353     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
354     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
355     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
356     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
357     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
358     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
359     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
360     { ON, 255}, { ON, 245}, {  L,   1}, { ON,  90}, {  L, 255},
361     {  L, 255}, {  L, 255}, {  L, 255}, {  L, 145}, { ON, 255},
362     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
363     { ON, 255}, { ON, 122}, {  L,   1}, { ON, 255}, { ON, 255},
364     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
365     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
366     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
367     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
368     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
369     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
370     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
371     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
372     { ON, 255}, { ON, 205}, {  L,   1}, { ON,  92}, {  L,   1},
373     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 129}, {  L,   2},
374     { ON, 126}, {  L,   2}, { ON, 255}, { ON, 255}, { ON, 255},
375     { ON, 255}, { ON,   2}, {  L,   2}, { ON, 255}, { ON, 255},
376     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
377     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
378     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
379     { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255},
380     { ON, 255}, { ON, 255}, { ON, 255}, { ON,  23}, {  L, 255},
381     {  L,  48}, { ON,   2}, {  L,  59}, { ON, 149}, {  L,   7},
382     { ON,  12}, {  L,   5}, { ON,   5}, {  R,   1}, {NSM,   1},
383     {  R,  10}, { ET,   1}, {  R,  13}, { ON,   1}, {  R,   5},
384     { ON,   1}, {  R,   1}, { ON,   1}, {  R,   2}, { ON,   1},
385     {  R,   2}, { ON,   1}, {  R,  10}, { AL,  98}, { ON,  33},
386     { AL, 255}, { AL, 108}, { ON,  18}, { AL,  64}, { ON,   2},
387     { AL,  54}, { ON,  40}, { AL,  13}, { ON,   3}, {NSM,  16},
388     { ON,  16}, {NSM,   4}, { ON,  44}, { CS,   1}, { ON,   1},
389     { CS,   1}, { ON,   2}, { CS,   1}, { ON,   9}, { ET,   1},
390     { ON,   2}, { ET,   2}, { ON,   5}, { ET,   2}, { ON,   5},
391     { AL,   5}, { ON,   1}, { AL, 135}, { ON,   2}, { BN,   1},
392     { ON,   3}, { ET,   3}, { ON,   5}, { ET,   1}, { CS,   1},
393     { ET,   1}, { CS,   1}, { ES,   1}, { EN,  10}, { CS,   1},
394     { ON,   6}, {  L,  26}, { ON,   6}, {  L,  26}, { ON,  11},
395     {  L,  89}, { ON,   3}, {  L,   6}, { ON,   2}, {  L,   6},
396     { ON,   2}, {  L,   6}, { ON,   2}, {  L,   3}, { ON,   3},
397     { ET,   2}, { ON,   3}, { ET,   2}, { ON,   9}, {  L,  14},
398 };