Browse code

Split ra144.c in common code (to be shared with the future encoder) and decoder.

Patch by Francesco Lavra (firstnamelastname@interfree.it)

Originally committed as revision 23573 to svn://svn.ffmpeg.org/ffmpeg/trunk

Francesco Lavra authored on 2010/06/11 17:01:51
Showing 4 changed files
... ...
@@ -281,7 +281,7 @@ OBJS-$(CONFIG_QPEG_DECODER)            += qpeg.o
281 281
 OBJS-$(CONFIG_QTRLE_DECODER)           += qtrle.o
282 282
 OBJS-$(CONFIG_QTRLE_ENCODER)           += qtrleenc.o
283 283
 OBJS-$(CONFIG_R210_DECODER)            += r210dec.o
284
-OBJS-$(CONFIG_RA_144_DECODER)          += ra144.o celp_filters.o
284
+OBJS-$(CONFIG_RA_144_DECODER)          += ra144dec.o ra144.o celp_filters.o
285 285
 OBJS-$(CONFIG_RA_288_DECODER)          += ra288.o celp_math.o celp_filters.o
286 286
 OBJS-$(CONFIG_RAWVIDEO_DECODER)        += rawdec.o
287 287
 OBJS-$(CONFIG_RAWVIDEO_ENCODER)        += rawenc.o
... ...
@@ -1,9 +1,6 @@
1 1
 /*
2 2
  * Real Audio 1.0 (14.4K)
3
- *
4
- * Copyright (c) 2008 Vitor Sessak
5
- * Copyright (c) 2003 Nick Kurshev
6
- *     Based on public domain decoder at http://www.honeypot.net/audio
3
+ * Copyright (c) 2003 the ffmpeg project
7 4
  *
8 5
  * This file is part of FFmpeg.
9 6
  *
... ...
@@ -22,119 +19,1491 @@
22 22
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 23
  */
24 24
 
25
-#include "libavutil/intmath.h"
25
+#include <stdint.h>
26 26
 #include "avcodec.h"
27
-#include "get_bits.h"
28 27
 #include "ra144.h"
29
-#include "celp_filters.h"
30
-
31
-#define NBLOCKS         4       ///< number of subblocks within a block
32
-#define BLOCKSIZE       40      ///< subblock size in 16-bit words
33
-#define BUFFERSIZE      146     ///< the size of the adaptive codebook
34
-
35
-
36
-typedef struct {
37
-    AVCodecContext *avctx;
38
-
39
-    unsigned int     old_energy;        ///< previous frame energy
40
-
41
-    unsigned int     lpc_tables[2][10];
42
-
43
-    /** LPC coefficients: lpc_coef[0] is the coefficients of the current frame
44
-     *  and lpc_coef[1] of the previous one. */
45
-    unsigned int    *lpc_coef[2];
46 28
 
47
-    unsigned int     lpc_refl_rms[2];
48
-
49
-    /** The current subblock padded by the last 10 values of the previous one. */
50
-    int16_t curr_sblock[50];
51
-
52
-    /** Adaptive codebook, its size is two units bigger to avoid a
53
-     *  buffer overflow. */
54
-    uint16_t adapt_cb[146+2];
55
-} RA144Context;
29
+const int16_t gain_val_tab[256][3] = {
30
+    { 541, 956,  768}, { 877, 581,  568}, { 675,1574,  635}, {1248,1464,  668},
31
+    {1246, 839, 1394}, {2560,1386,  991}, { 925, 687,  608}, {2208, 797, 1144},
32
+    { 535, 832,  799}, { 762, 605, 1154}, { 832,1122, 1003}, {1180, 687, 1176},
33
+    {1292, 901,  732}, {1656, 689,  896}, {1750,1248,  848}, {2284, 942, 1022},
34
+    { 824,1472,  643}, { 517, 765,  512}, { 562,1816, 1522}, { 694,1826, 2700},
35
+    { 704, 524,  672}, {1442, 757, 2232}, { 884, 551, 1266}, {2232,1007, 1692},
36
+    { 932, 746,  777}, {1132, 822,  926}, {1226, 771,  611}, {2948,1342, 1008},
37
+    {1302, 594, 1158}, {1602, 636, 1128}, {3408, 910, 1438}, {1996, 614,  575},
38
+    { 665, 935,  628}, { 631,1192,  829}, { 644, 926, 1052}, { 879, 988, 1226},
39
+    { 941,2768, 2772}, { 565,1344, 2304}, { 547, 628,  740}, { 639, 532, 1074},
40
+    { 955,1208,  598}, {1124,1160,  900}, {1206, 899, 1242}, { 746, 533,  624},
41
+    {1458,1028,  735}, {1706,1102,  692}, {1898,1018, 1004}, {2176, 988,  735},
42
+    {1578, 782, 1642}, { 897, 516,  754}, {2068, 702, 1656}, {2344, 818, 1526},
43
+    { 907, 652,  592}, {1056, 652,  642}, {2124,1416,  780}, {2664,1250,  727},
44
+    {1894, 727, 1108}, {2196, 657,  981}, {4840, 920, 1704}, {4992,1238,  983},
45
+    {2420, 909, 1094}, {2760, 935, 1032}, {2800, 612,  853}, {3068, 832,  574},
46
+    { 523,1796,  923}, { 722,1916, 1382}, {1226,1542,  928}, { 758, 757,  584},
47
+    { 512,1134,  577}, { 615,1276,  698}, { 574,2568, 2356}, { 993,2728, 3512},
48
+    { 539, 890,  913}, { 694, 928, 1088}, { 805, 600, 1360}, {2160, 951, 3128},
49
+    { 816, 950,  590}, { 955, 847,  811}, {1094, 883,  556}, {1304, 888,  604},
50
+    { 863,1170,  855}, {1023, 997, 1032}, { 932,1228, 1280}, { 627, 564,  573},
51
+    { 876, 900, 1448}, {1030, 857, 1792}, {1294, 953, 1758}, {1612, 854, 1714},
52
+    {1090,1166,  631}, {1314,1202,  751}, {1480, 905,  795}, {1682,1016,  568},
53
+    {1494,1178,  983}, { 878, 613,  526}, {1728,1446,  779}, {2136,1348,  774},
54
+    { 950, 649,  939}, {1180, 703,  899}, {1236, 527, 1158}, {1450, 647,  972},
55
+    {1282, 647,  707}, {1460, 663,  644}, {1614, 572,  578}, {3516,1222,  821},
56
+    {2668, 729, 1682}, {3128, 585, 1502}, {3208, 733,  976}, {6800, 871, 1416},
57
+    {3480, 743, 1408}, {3764, 899, 1170}, {3772, 632,  875}, {4092, 732,  638},
58
+    {3112, 753, 2620}, {3372, 945, 1890}, {3768, 969, 2288}, {2016, 559,  854},
59
+    {1736, 729,  787}, {1940, 686,  547}, {2140, 635,  674}, {4480,1272,  828},
60
+    {3976, 592, 1666}, {4384, 621, 1388}, {4400, 801,  955}, {4656, 522,  646},
61
+    {4848, 625, 1636}, {4984, 591,  874}, {5352, 535, 1001}, {11216,938, 1184},
62
+    { 925,3280, 1476}, { 735,1580, 1088}, {1150,1576,  674}, { 655, 783,  528},
63
+    { 527,2052, 1354}, { 782,1704, 1880}, { 578, 910, 1026}, { 692, 882, 1468},
64
+    { 586, 683,  715}, { 739, 609,  717}, { 778, 773,  697}, { 922, 785,  813},
65
+    { 766, 651,  984}, { 978, 596, 1030}, {1070, 757, 1080}, {1324, 687, 1178},
66
+    {1108,2144,  979}, { 723, 982,  690}, { 936, 956,  527}, {1180,1002,  547},
67
+    { 517,1306,  825}, { 832,1184,  974}, {1024, 957,  903}, {1262,1090,  906},
68
+    {1028, 720,  649}, {1192, 679,  694}, {2468,1480,  979}, {2844,1370,  877},
69
+    {1310, 835,  848}, {1508, 839,  698}, {1742,1030,  769}, {1910, 852,  573},
70
+    {1280, 859, 1174}, {1584, 863, 1108}, {1686, 708, 1364}, {1942, 768, 1104},
71
+    { 891, 536,  690}, {1016, 560,  663}, {2172, 870, 1348}, {2404, 999, 1170},
72
+    {1890, 966,  889}, {2116, 912,  777}, {2296,1020,  714}, {4872,1844,  932},
73
+    {2392, 778,  929}, {2604, 772,  744}, {2764, 957,  722}, {5832,1532,  984},
74
+    {2188, 519, 1264}, {2332, 532,  922}, {5064, 995, 2412}, {2708, 571,  874},
75
+    {2408, 545,  666}, {5016,1084,  875}, {5376, 983, 1196}, {5536, 979,  730},
76
+    {5344, 634, 1744}, {5688, 706, 1348}, {5912, 977, 1190}, {6072, 905,  763},
77
+    {6048, 582, 1526}, {11968,1013,1816}, {12864,937, 1900}, {12560,1086, 998},
78
+    {1998, 684, 1884}, {2504, 633, 1992}, {1252, 567,  835}, {1478, 571,  973},
79
+    {2620, 769, 1414}, {2808, 952, 1142}, {2908, 712, 1028}, {2976, 686,  741},
80
+    {1462, 552,  714}, {3296, 991, 1452}, {1590, 615,  544}, {3480,1150,  824},
81
+    {3212, 832,  923}, {3276, 839,  531}, {3548, 786,  852}, {3732, 764,  570},
82
+    {5728, 906, 2616}, {6272, 804, 2252}, {3096, 535,  876}, {3228, 598,  649},
83
+    {6536, 759, 1436}, {6648, 993,  846}, {6864, 567, 1210},{14016,1012, 1302},
84
+    {3408, 548, 1098}, {7160,1008, 1742}, {7136,1000, 1182}, {7480,1032,  836},
85
+    {7448, 612, 1552}, {7744, 614,  816}, {8384, 777, 1438}, {8784, 694,  786},
86
+    { 882,1508, 1068}, { 597, 837,  766}, {1270, 954, 1408}, { 803, 550,  798},
87
+    {1398,1308,  798}, {1848,1534,  738}, { 970, 675,  608}, {1264, 706,  684},
88
+    {1716, 767, 1126}, {2108, 765, 1404}, {2236, 924, 1003}, {2472,1048,  611},
89
+    { 999, 942,  963}, {1094, 857,  935}, {2936, 926, 1138}, {1934, 746,  551},
90
+    {3336, 633, 1762}, {3764, 701, 1454}, {1890, 564,  636}, {4096,1126,  793},
91
+    {3936, 556, 1140}, {3936, 540,  740}, {4216, 764,  874}, {8480,1328, 1014},
92
+    {2184, 515, 1042}, {4432, 934, 1344}, {4784, 945, 1112}, {5016,1062,  733},
93
+    {9216,1020, 2028}, {9968, 924, 1188}, {5424, 909, 1206}, {6512, 744, 1086}
94
+};
56 95
 
57
-static av_cold int ra144_decode_init(AVCodecContext * avctx)
58
-{
59
-    RA144Context *ractx = avctx->priv_data;
96
+const uint8_t gain_exp_tab[256] = {
97
+   15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14,
98
+   14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13,
99
+   13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13,
100
+   13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13,
101
+   13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12,
102
+   12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12,
103
+   12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13,
104
+   13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14,
105
+   13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
106
+   12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11,
107
+   12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13,
108
+   12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
109
+   12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12,
110
+   13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13,
111
+   11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10,  9, 11, 10,
112
+   12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12
113
+};
60 114
 
61
-    ractx->avctx = avctx;
115
+const int8_t cb1_vects[128][40]={
116
+    {
117
+     38,  -4,  15,  -4,  14, -13,  12, -11,  -2,  -6,
118
+     -6, -11, -45, -16, -11, -13,  -7,   6, -12,   4,
119
+    -20,   3, -16,  12,  -1,  12,  46,  24,   0,  33,
120
+     -3,   9, -12, -12,  -8,  -7,  17,  -6,   0,  -2,
121
+    }, {
122
+     60, -16,   3, -22,  10, -32,   0, -28, -17, -18,
123
+     -3, -25, -37, -23, -10,   3,   2,   3,   0,   3,
124
+    -14,   0, -14,  -1,   0,   2,  32,   9,  -1,  25,
125
+      7,  13,  -5,  13,   8,   1,   2,   8, -10,   6,
126
+    }, {
127
+     27, -12,  28,  -2,   6,  -7,  15,   9, -11,   1,
128
+    -13, -11, -40,   4, -29, -14, -19,  -5, -23,  -8,
129
+    -30, -13, -17,   0, -14,  12,  34,  20,  -2,  25,
130
+      2, -16,  -4, -12,  15,  16,  29,   7,  24,  10,
131
+    }, {
132
+     49, -24,  16, -20,   2, -26,   2,  -7, -25, -10,
133
+    -11, -25, -32,  -3, -27,   2,  -8,  -8, -11,  -9,
134
+    -24, -17, -16, -14, -13,   2,  20,   5,  -4,  17,
135
+     14, -12,   3,  13,  33,  25,  14,  23,  15,  19,
136
+    }, {
137
+     46,  -6,  21,   8,  -2, -16,  -5,  -8, -11,   4,
138
+      8,  15, -24,   4,  -2, -26,  -3, -16, -16, -14,
139
+     -9,  -2,  -1,   4,  19,   7,  36,  17,   9,  13,
140
+      0,  31,  -5, -12,   7,  -8,  11, -15, -13,  -4,
141
+    }, {
142
+     68, -18,   9,  -9,  -6, -35, -18, -25, -26,  -7,
143
+     10,   1, -16,  -3,  -1,  -9,   6, -19,  -4, -15,
144
+     -4,  -6,   0,  -8,  20,  -2,  23,   2,   7,   5,
145
+     12,  35,   1,  13,  24,   0,  -3,   0, -22,   4,
146
+    }, {
147
+     35, -14,  34,  10, -10, -10,  -1,  12, -20,  12,
148
+      0,  15, -18,  24, -20, -27, -14, -28, -27, -27,
149
+    -20, -19,  -2,  -8,   5,   7,  25,  13,   5,   5,
150
+      6,   5,   2, -12,  31,  15,  23,  -1,  12,   8,
151
+    }, {
152
+     57, -26,  22,  -7, -14, -28, -14,  -3, -35,   0,
153
+      3,   1, -11,  16, -18, -10,  -4, -31, -15, -28,
154
+    -14, -23,  -1, -21,   7,  -2,  11,  -1,   3,  -1,
155
+     18,   9,  10,  13,  49,  24,   8,  14,   2,  16,
156
+    }, {
157
+     25,  15,  22,  11,  18,   4,  15, -22,   8,  -2,
158
+    -17,  -9, -48, -20, -30, -17, -16,  11,  -1,  16,
159
+      2,  10,  -5,  26,  -2,  -4,  22,   0,   2,  10,
160
+     -6,  13, -14,  10, -23,   0,  10,  -2,   1,   0,
161
+    }, {
162
+     47,   3,  11,  -6,  15, -13,   2, -38,  -6, -13,
163
+    -15, -22, -40, -28, -28,   0,  -5,   8,  10,  15,
164
+      7,   7,  -4,  13,  -1, -14,   9, -14,   0,   2,
165
+      4,  18,  -7,  36,  -6,   8,  -3,  13,  -7,   8,
166
+    }, {
167
+     14,   7,  36,  13,  10,  10,  18,   0,   0,   5,
168
+    -25,  -8, -43,   0, -48, -18, -27,   0, -12,   3,
169
+     -7,  -6,  -7,  13, -15,  -5,  11,  -3,   0,   2,
170
+      0, -12,  -6,  10,   0,  23,  22,  11,  26,  12,
171
+    }, {
172
+     36,  -5,  24,  -4,   7,  -7,   6, -17, -14,  -5,
173
+    -22, -22, -35,  -8, -46,  -1, -17,  -3,   0,   2,
174
+     -2, -10,  -5,   0, -14, -15,  -2, -18,  -2,  -4,
175
+     11,  -7,   1,  36,  18,  32,   7,  27,  17,  20,
176
+    }, {
177
+     33,  13,  29,  24,   1,   1,  -2, -18,   0,   9,
178
+     -3,  17, -27,   0, -21, -30, -12, -11,  -5,  -2,
179
+     12,   4,   9,  19,  18,  -9,  13,  -6,  11,  -8,
180
+     -2,  35,  -8,  10,  -7,  -1,   4, -11, -10,  -2,
181
+    }, {
182
+     55,   1,  17,   6,  -1, -16, -15, -35, -15,  -2,
183
+      0,   4, -19,  -8, -20, -13,  -1, -14,   7,  -3,
184
+     18,   0,  10,   5,  19, -19,   0, -21,   8, -16,
185
+      9,  39,   0,  36,  10,   7,  -9,   4, -20,   5,
186
+    }, {
187
+     22,   5,  42,  26,  -6,   8,   1,   2,  -9,  17,
188
+    -10,  18, -21,  19, -39, -31, -23, -23, -16, -15,
189
+      2, -12,   7,   6,   5,  -9,   1, -10,   7, -16,
190
+      4,   9,   0,  10,  17,  22,  16,   2,  14,   9,
191
+    }, {
192
+     44,  -6,  30,   8,  -9, -10, -11, -14, -23,   5,
193
+     -8,   4, -14,  12, -37, -14, -12, -26,  -4, -16,
194
+      8, -16,   9,  -7,   6, -19, -12, -25,   5, -24,
195
+     15,  13,   8,  36,  34,  31,   1,  18,   4,  18,
196
+    }, {
197
+     -3,  -5,  -9,  -7,  15,  -1,   5,  13,   2,  12,
198
+      5,   2, -21, -23,  -2, -16,   0,   5,  -6,  13,
199
+    -23,   3, -32,  10, -15,   8,  44,  28,   9,  37,
200
+     -2,  13,  -9, -15, -12, -27,  -7, -12,   0, -11,
201
+    }, {
202
+     18, -17, -21, -25,  11, -19,  -6,  -3, -11,   0,
203
+      7, -11, -13, -31,  -1,   0,   9,   1,   5,  12,
204
+    -18,   0, -31,  -2, -13,  -1,  30,  14,   7,  29,
205
+      9,  18,  -1,  10,   4, -18, -22,   3, -10,  -2,
206
+    }, {
207
+    -13, -13,   3,  -5,   7,   4,   9,  34,  -5,  20,
208
+     -2,   3, -16,  -3, -20, -17, -11,  -7, -17,   0,
209
+    -34, -13, -33,  -2, -28,   8,  32,  24,   5,  29,
210
+      3, -12,   0, -15,  11,  -3,   3,   2,  24,   1,
211
+    }, {
212
+      8, -25,  -8, -23,   3, -13,  -3,  17, -20,   8,
213
+      0, -10,  -8, -11, -18,   0,  -1, -10,  -5,   0,
214
+    -28, -17, -32, -15, -26,  -1,  19,   9,   3,  21,
215
+     15,  -7,   6,   9,  29,   5, -10,  17,  15,   9,
216
+    }, {
217
+      4,  -6,  -3,   5,  -1,  -4, -11,  16,  -6,  23,
218
+     19,  29,   0,  -3,   6, -30,   3, -17, -10,  -5,
219
+    -13,  -2, -17,   3,   5,   3,  35,  21,  17,  17,
220
+      2,  35,  -2, -15,   3, -28, -13, -21, -13, -13,
221
+    }, {
222
+     26, -19, -15, -12,  -5, -22, -24,   0, -21,  12,
223
+     21,  15,   8, -11,   7, -12,  14, -20,   2,  -6,
224
+     -7,  -6, -16,  -9,   6,  -5,  21,   7,  15,  10,
225
+     13,  39,   5,  10,  20, -19, -28,  -5, -22,  -5,
226
+    }, {
227
+     -5, -15,   9,   7,  -9,   2,  -8,  37, -14,  31,
228
+     11,  29,   5,  16, -11, -30,  -7, -29, -21, -18,
229
+    -23, -19, -18,  -9,  -7,   3,  23,  17,  14,   9,
230
+      8,   9,   6, -15,  27,  -4,  -2,  -6,  12,  -1,
231
+    }, {
232
+     16, -27,  -2, -10, -13, -16, -20,  20, -29,  20,
233
+     14,  16,  13,   8,  -9, -13,   2, -33,  -9, -19,
234
+    -17, -23, -17, -22,  -6,  -6,   9,   2,  12,   2,
235
+     20,  13,  13,  10,  45,   4, -16,   8,   2,   7,
236
+    }, {
237
+    -16,  14,  -2,   8,  20,  17,   9,   2,  14,  16,
238
+     -6,   5, -24, -28, -21, -20,  -8,   9,   4,  25,
239
+     -1,  11, -22,  24, -15,  -8,  21,   5,  11,  14,
240
+     -5,  18, -11,   7, -27, -20, -14,  -7,   1,  -9,
241
+    }, {
242
+      6,   2, -14,  -9,  16,  -1,  -3, -14,   0,   5,
243
+     -3,  -8, -16, -36, -19,  -3,   1,   6,  17,  24,
244
+      4,   7, -21,  11, -14, -18,   7,  -9,   9,   7,
245
+      6,  22,  -3,  33, -10, -11, -28,   7,  -7,   0,
246
+    }, {
247
+    -26,   6,  11,  10,  12,  23,  12,  23,   5,  24,
248
+    -13,   5, -19,  -8, -38, -21, -20,  -2,  -6,  12,
249
+    -11,  -5, -23,  11, -29,  -9,   9,   0,   7,   6,
250
+      1,  -7,  -2,   7,  -3,   3,  -2,   6,  27,   3,
251
+    }, {
252
+     -4,  -6,   0,  -7,   8,   4,   0,   6,  -9,  13,
253
+    -11,  -7, -11, -15, -37,  -4,  -9,  -5,   5,  11,
254
+     -5,  -9, -22,  -1, -27, -18,  -4, -14,   5,   0,
255
+     12,  -3,   4,  32,  14,  12, -17,  22,  17,  11,
256
+    }, {
257
+     -8,  12,   3,  21,   3,  14,  -8,   5,   4,  28,
258
+      7,  32,  -2,  -8, -12, -34,  -4, -12,   1,   6,
259
+      9,   4,  -7,  17,   4, -13,  11,  -1,  19,  -4,
260
+      0,  39,  -4,   7, -11, -21, -20, -16, -10, -11,
261
+    }, {
262
+     13,   0,  -8,   3,   0,  -4, -21, -11,  -9,  16,
263
+     10,  18,   5, -16, -10, -16,   5, -15,  13,   5,
264
+     15,   1,  -6,   4,   6, -23,  -2, -16,  17, -12,
265
+     10,  44,   3,  33,   6, -12, -34,  -1, -20,  -3,
266
+    }, {
267
+    -18,   4,  17,  23,  -4,  20,  -4,  26,  -3,  36,
268
+      0,  32,   2,  12, -29, -34, -16, -24, -10,  -6,
269
+      0, -12,  -8,   4,  -8, -13,   0,  -6,  16, -12,
270
+      5,  13,   3,   7,  13,   3,  -8,  -2,  14,   0,
271
+    }, {
272
+      3,  -7,   5,   5,  -8,   2, -17,   9, -18,  24,
273
+      2,  19,  10,   4, -28, -17,  -5, -28,   2,  -7,
274
+      4, -15,  -7,  -8,  -6, -23, -13, -21,  14, -20,
275
+     17,  18,  11,  33,  30,  11, -23,  13,   5,   9,
276
+    }, {
277
+     60,  10,   7,  -1,   9,  -8,   6, -13,   2, -15,
278
+     -1, -10, -13, -11,  15,   0,   6,   9,  -1,   0,
279
+    -13,   1, -11,  -3, -13,  21,  13,  26,  -7,  31,
280
+    -10,  -7, -16, -33, -31, -10,  22,  -8,   1,  -2,
281
+    }, {
282
+     82,  -1,  -4, -19,   6, -27,  -6, -29, -12, -26,
283
+      1, -24,  -5, -18,  17,  17,  17,   6,  10,   0,
284
+     -7,  -2,  -9, -16, -12,  11,   0,  11,  -9,  23,
285
+      0,  -3,  -8,  -8, -13,  -1,   8,   7,  -7,   6,
286
+    }, {
287
+     49,   2,  21,   0,   1,  -2,   9,   8,  -6,  -6,
288
+     -8, -10,  -8,   9,  -2,   0,  -4,  -2, -13, -12,
289
+    -23, -15, -12, -16, -26,  21,   2,  21, -11,  23,
290
+     -4, -33,  -7, -33,  -6,  13,  34,   5,  27,  10,
291
+    }, {
292
+     71, -10,   9, -17,  -1, -20,  -3,  -8, -21, -18,
293
+     -6, -24,   0,   1,   0,  16,   6,  -5,   0, -13,
294
+    -17, -19, -11, -29, -25,  11, -11,   6, -13,  15,
295
+      7, -29,   0,  -8,  11,  22,  20,  21,  17,  18,
296
+    }, {
297
+     67,   8,  14,  11,  -7, -11, -11,  -9,  -7,  -3,
298
+     13,  16,   8,   9,  24, -12,  10, -13,  -5, -17,
299
+     -2,  -4,   3, -10,   6,  17,   4,  19,   0,  11,
300
+     -6,  13,  -9, -33, -14, -10,  16, -17, -10,  -4,
301
+    }, {
302
+     90,  -3,   2,  -6, -10, -29, -24, -26, -21, -15,
303
+     15,   2,  16,   1,  25,   4,  21, -16,   6, -18,
304
+      3,  -8,   5, -24,   8,   7,  -9,   4,  -1,   3,
305
+      5,  18,  -1,  -7,   2,  -1,   2,  -1, -19,   3,
306
+    }, {
307
+     57,   0,  27,  13, -14,  -5,  -7,  11, -15,   4,
308
+      5,  16,  13,  29,   6, -13,   0, -25, -16, -31,
309
+    -12, -22,   2, -23,  -6,  16,  -7,  14,  -2,   3,
310
+      0, -12,   0, -33,   9,  13,  28,  -3,  14,   7,
311
+    }, {
312
+     79, -11,  15,  -4, -18, -23, -20,  -5, -30,  -7,
313
+      7,   2,  21,  21,   8,   3,  10, -28,  -4, -31,
314
+     -6, -25,   3, -37,  -4,   7, -20,   0,  -4,  -4,
315
+     11,  -7,   6,  -8,  27,  22,  14,  12,   5,  16,
316
+    }, {
317
+     47,  30,  15,  14,  14,   9,   9, -23,  13, -10,
318
+    -12,  -7, -16, -15,  -3,  -3,  -1,  14,   9,  12,
319
+      9,   8,   0,  10, -14,   4,  -9,   2,  -5,   8,
320
+    -13,  -3, -18, -10, -45,  -3,  16,  -4,   4,   0,
321
+    }, {
322
+     69,  17,   3,  -3,  10,  -8,  -3, -40,  -1, -21,
323
+    -10, -21,  -8, -23,  -1,  13,   8,  11,  21,  11,
324
+     15,   4,   0,  -2, -13,  -5, -23, -12,  -7,   0,
325
+     -1,   0, -10,  14, -28,   5,   1,  11,  -5,   7,
326
+    }, {
327
+     36,  21,  28,  16,   6,  16,  12,  -2,   4,  -2,
328
+    -20,  -7, -11,   4, -20,  -4, -12,   2,  -1,   0,
329
+      0,  -8,  -2,  -2, -27,   4, -21,  -2,  -9,   0,
330
+     -6, -29,  -9, -10, -21,  21,  28,  10,  29,  11,
331
+    }, {
332
+     58,   9,  16,  -1,   2,  -2,   0, -19, -10, -13,
333
+    -17, -21,  -3,  -3, -19,  12,  -2,   0,  10,  -1,
334
+      5, -12,   0, -15, -26,  -5, -34, -16, -11,  -7,
335
+      4, -25,  -2,  14,  -3,  29,  13,  25,  20,  20,
336
+    }, {
337
+     55,  28,  21,  27,  -2,   7,  -8, -20,   4,   1,
338
+      1,  18,   5,   4,   5, -16,   2,  -8,   5,  -5,
339
+     19,   2,  14,   3,   6,   0, -18,  -4,   2, -11,
340
+     -8,  18, -11, -10, -29,  -3,  10, -13,  -8,  -3,
341
+    }, {
342
+     77,  16,   9,   9,  -6, -11, -21, -37, -10, -10,
343
+      4,   5,  13,  -3,   7,   0,  13, -11,  17,  -6,
344
+     25,  -1,  15,  -9,   7,  -9, -32, -19,   0, -18,
345
+      2,  22,  -3,  15, -12,   5,  -4,   2, -17,   5,
346
+    }, {
347
+     44,  20,  34,  29, -10,  13,  -4,   0,  -4,   9,
348
+     -5,  19,  10,  24, -11, -17,  -8, -20,  -5, -19,
349
+      9, -14,  12,  -9,  -6,   0, -30,  -9,   0, -19,
350
+     -2,  -7,  -2, -10,  -5,  20,  21,   1,  17,   9,
351
+    }, {
352
+     66,   8,  23,  11, -14,  -5, -17, -16, -19,  -2,
353
+     -3,   5,  18,  17, -10,   0,   1, -23,   6, -20,
354
+     15, -18,  14, -22,  -5, -10, -44, -23,  -2, -26,
355
+      9,  -3,   4,  14,  12,  29,   7,  16,   7,  18,
356
+    }, {
357
+     18,   9, -17,  -4,  11,   3,   0,  11,   7,   4,
358
+     10,   3,  10, -18,  24,  -3,  14,   7,   4,  10,
359
+    -16,   1, -27,  -4, -27,  17,  12,  30,   0,  35,
360
+     -9,  -3, -12, -36, -35, -30,  -2, -13,   2, -11,
361
+    }, {
362
+     40,  -2, -29, -22,   7, -14, -12,  -5,  -7,  -7,
363
+     12,  -9,  18, -26,  26,  14,  24,   4,  16,   9,
364
+    -10,  -2, -26, -18, -26,   7,  -1,  15,  -1,  27,
365
+      2,   0,  -4, -11, -17, -21, -16,   1,  -7,  -3,
366
+    }, {
367
+      8,   1,  -3,  -2,   3,  10,   3,  32,  -1,  12,
368
+      2,   4,  15,   1,   7,  -3,   2,  -4,  -6,  -3,
369
+    -26, -15, -29, -17, -40,  17,   0,  26,  -2,  27,
370
+     -2, -29,  -4, -36, -10,  -6,   9,   0,  27,   0,
371
+    }, {
372
+     30, -11, -15, -20,   0,  -8,  -9,  15, -15,   0,
373
+      5,  -9,  23,  -6,   8,  13,  13,  -7,   5,  -3,
374
+    -20, -19, -27, -31, -39,   7, -13,  11,  -4,  19,
375
+      8, -25,   3, -11,   7,   2,  -4,  16,  18,   9,
376
+    }, {
377
+     26,   7, -11,   8,  -5,   1, -17,  14,  -1,  15,
378
+     24,  30,  32,   1,  33, -16,  18, -14,   0,  -8,
379
+     -6,  -4, -12, -12,  -6,  13,   2,  23,   8,  15,
380
+     -4,  17,  -5, -36, -18, -30,  -8, -22, -10, -14,
381
+    }, {
382
+     48,  -4, -23,  -9,  -9, -17, -30,  -2, -16,   3,
383
+     26,  16,  40,  -6,  35,   1,  28, -17,  12,  -9,
384
+      0,  -8, -11, -25,  -5,   3, -10,   8,   6,   7,
385
+      6,  22,   1, -11,  -1, -21, -22,  -7, -19,  -5,
386
+    }, {
387
+     15,   0,   2,  10, -13,   7, -14,  35, -10,  23,
388
+     16,  31,  37,  21,  16, -17,   6, -26, -10, -21,
389
+    -16, -21, -13, -25, -19,  13,  -8,  19,   5,   7,
390
+      1,  -8,   2, -36,   5,  -6,   3,  -8,  15,  -1,
391
+    }, {
392
+     37, -12,  -9,  -7, -17, -11, -26,  18, -25,  12,
393
+     19,  17,  45,  14,  17,   0,  17, -30,   1, -22,
394
+    -10, -25, -12, -38, -18,   3, -22,   4,   3,   0,
395
+     13,  -3,  10, -11,  23,   2, -10,   7,   5,   7,
396
+    }, {
397
+      5,  29,  -9,  11,  15,  22,   3,   0,  18,   8,
398
+     -1,   6,   7, -23,   6,  -6,   5,  12,  15,  21,
399
+      5,   8, -17,   9, -28,   0, -11,   6,   2,  12,
400
+    -11,   0, -14, -13, -49, -22,  -8,  -9,   4,  -9,
401
+    }, {
402
+     27,  16, -21,  -6,  12,   3,  -9, -16,   3,  -2,
403
+      1,  -7,  15, -31,   7,  10,  16,   9,  27,  21,
404
+     11,   5, -16,  -3, -26,  -9, -24,  -7,   0,   4,
405
+      0,   4,  -6,  11, -32, -14, -23,   6,  -5,  -1,
406
+    }, {
407
+     -4,  20,   3,  13,   8,  28,   6,  21,  10,  16,
408
+     -8,   7,  12,  -3, -11,  -7,  -5,   0,   4,   8,
409
+     -4,  -8, -18,  -3, -41,   0, -22,   2,   0,   4,
410
+     -5, -25,  -6, -14, -25,   1,   2,   4,  29,   2,
411
+    }, {
412
+     17,   8,  -8,  -4,   4,  10,  -6,   5,  -4,   5,
413
+     -6,  -6,  20, -10,  -9,   9,   4,  -2,  16,   7,
414
+      1, -12, -17, -16, -39,  -9, -36, -12,  -2,  -3,
415
+      6, -21,   1,  11,  -7,  10, -11,  20,  20,  11,
416
+    }, {
417
+     13,  27,  -3,  24,  -1,  19, -14,   3,   9,  20,
418
+     12,  33,  29,  -3,  15, -20,   9,  -9,  11,   3,
419
+     16,   2,  -2,   2,  -7,  -3, -20,   0,  10,  -7,
420
+     -7,  22,  -7, -13, -33, -23, -14, -18,  -7, -12,
421
+    }, {
422
+     35,  15, -15,   6,  -4,   1, -27, -12,  -5,   8,
423
+     15,  19,  37, -11,  16,  -2,  20, -12,  23,   2,
424
+     22,  -1,  -1, -11,  -5, -13, -34, -14,   8, -14,
425
+      4,  26,   0,  11, -16, -14, -29,  -2, -17,  -3,
426
+    }, {
427
+      3,  19,   9,  26,  -8,  26, -10,  24,   0,  28,
428
+      5,  33,  34,  17,  -2, -20,  -1, -22,   0, -10,
429
+      6, -14,  -3, -10, -20,  -4, -32,  -4,   7, -15,
430
+      0,  -3,   0, -13,  -9,   0,  -3,  -4,  17,   0,
431
+    }, {
432
+     25,   7,  -2,   8, -12,   7, -23,   8, -13,  16,
433
+      7,  20,  42,   9,   0,  -3,   9, -25,  12, -10,
434
+     12, -18,  -2, -24, -19, -13, -46, -19,   5, -22,
435
+     10,   0,   8,  11,   8,   9, -17,  11,   7,   8,
436
+    }, {
437
+    -25,  -7,   2,  -8,  12,  -7,  23,  -8,  13, -16,
438
+     -7, -20, -42,  -9,   0,   3,  -9,  25, -12,  10,
439
+    -12,  18,   2,  24,  19,  13,  46,  19,  -5,  22,
440
+    -10,   0,  -8, -11,  -8,  -9,  17, -11,  -7,  -8,
441
+    }, {
442
+     -3, -19,  -9, -26,   8, -26,  10, -24,   0, -28,
443
+     -5, -33, -34, -17,   2,  20,   1,  22,   0,  10,
444
+     -6,  14,   3,  10,  20,   4,  32,   4,  -7,  15,
445
+      0,   3,   0,  13,   9,   0,   3,   4, -17,   0,
446
+    }, {
447
+    -35, -15,  15,  -6,   4,  -1,  27,  12,   5,  -8,
448
+    -15, -19, -37,  11, -16,   2, -20,  12, -23,  -2,
449
+    -22,   1,   1,  11,   5,  13,  34,  14,  -8,  14,
450
+     -4, -26,   0, -11,  16,  14,  29,   2,  17,   3,
451
+    }, {
452
+    -13, -27,   3, -24,   1, -19,  14,  -3,  -9, -20,
453
+    -12, -33, -29,   3, -15,  20,  -9,   9, -11,  -3,
454
+    -16,  -2,   2,  -2,   7,   3,  20,   0, -10,   7,
455
+      7, -22,   7,  13,  33,  23,  14,  18,   7,  12,
456
+    }, {
457
+    -17,  -8,   8,   4,  -4, -10,   6,  -5,   4,  -5,
458
+      6,   6, -20,  10,   9,  -9,  -4,   2, -16,  -7,
459
+     -1,  12,  17,  16,  39,   9,  36,  12,   2,   3,
460
+     -6,  21,  -1, -11,   7, -10,  11, -20, -20, -11,
461
+    }, {
462
+      4, -20,  -3, -13,  -8, -28,  -6, -21, -10, -16,
463
+      8,  -7, -12,   3,  11,   7,   5,   0,  -4,  -8,
464
+      4,   8,  18,   3,  41,   0,  22,  -2,   0,  -4,
465
+      5,  25,   6,  14,  25,  -1,  -2,  -4, -29,  -2,
466
+    }, {
467
+    -27, -16,  21,   6, -12,  -3,   9,  16,  -3,   2,
468
+     -1,   7, -15,  31,  -7, -10, -16,  -9, -27, -21,
469
+    -11,  -5,  16,   3,  26,   9,  24,   7,   0,  -4,
470
+      0,  -4,   6, -11,  32,  14,  23,  -6,   5,   1,
471
+    }, {
472
+     -5, -29,   9, -11, -15, -22,  -3,   0, -18,  -8,
473
+      1,  -6,  -7,  23,  -6,   6,  -5, -12, -15, -21,
474
+     -5,  -8,  17,  -9,  28,   0,  11,  -6,  -2, -12,
475
+     11,   0,  14,  13,  49,  22,   8,   9,  -4,   9,
476
+    }, {
477
+    -37,  12,   9,   7,  17,  11,  26, -18,  25, -12,
478
+    -19, -17, -45, -14, -17,   0, -17,  30,  -1,  22,
479
+     10,  25,  12,  38,  18,  -3,  22,  -4,  -3,   0,
480
+    -13,   3, -10,  11, -23,  -2,  10,  -7,  -5,  -7,
481
+    }, {
482
+    -15,   0,  -2, -10,  13,  -7,  14, -35,  10, -23,
483
+    -16, -31, -37, -21, -16,  17,  -6,  26,  10,  21,
484
+     16,  21,  13,  25,  19, -13,   8, -19,  -5,  -7,
485
+     -1,   8,  -2,  36,  -5,   6,  -3,   8, -15,   1,
486
+    }, {
487
+    -48,   4,  23,   9,   9,  17,  30,   2,  16,  -3,
488
+    -26, -16, -40,   6, -35,  -1, -28,  17, -12,   9,
489
+      0,   8,  11,  25,   5,  -3,  10,  -8,  -6,  -7,
490
+     -6, -22,  -1,  11,   1,  21,  22,   7,  19,   5,
491
+    }, {
492
+    -26,  -7,  11,  -8,   5,  -1,  17, -14,   1, -15,
493
+    -24, -30, -32,  -1, -33,  16, -18,  14,   0,   8,
494
+      6,   4,  12,  12,   6, -13,  -2, -23,  -8, -15,
495
+      4, -17,   5,  36,  18,  30,   8,  22,  10,  14,
496
+    }, {
497
+    -30,  11,  15,  20,   0,   8,   9, -15,  15,   0,
498
+     -5,   9, -23,   6,  -8, -13, -13,   7,  -5,   3,
499
+     20,  19,  27,  31,  39,  -7,  13, -11,   4, -19,
500
+     -8,  25,  -3,  11,  -7,  -2,   4, -16, -18,  -9,
501
+    }, {
502
+     -8,  -1,   3,   2,  -3, -10,  -3, -32,   1, -12,
503
+     -2,  -4, -15,  -1,  -7,   3,  -2,   4,   6,   3,
504
+     26,  15,  29,  17,  40, -17,   0, -26,   2, -27,
505
+      2,  29,   4,  36,  10,   6,  -9,   0, -27,   0,
506
+    }, {
507
+    -40,   2,  29,  22,  -7,  14,  12,   5,   7,   7,
508
+    -12,   9, -18,  26, -26, -14, -24,  -4, -16,  -9,
509
+     10,   2,  26,  18,  26,  -7,   1, -15,   1, -27,
510
+     -2,   0,   4,  11,  17,  21,  16,  -1,   7,   3,
511
+    }, {
512
+    -18,  -9,  17,   4, -11,  -3,   0, -11,  -7,  -4,
513
+    -10,  -3, -10,  18, -24,   3, -14,  -7,  -4, -10,
514
+     16,  -1,  27,   4,  27, -17, -12, -30,   0, -35,
515
+      9,   3,  12,  36,  35,  30,   2,  13,  -2,  11,
516
+    }, {
517
+    -66,  -8, -23, -11,  14,   5,  17,  16,  19,   2,
518
+      3,  -5, -18, -17,  10,   0,  -1,  23,  -6,  20,
519
+    -15,  18, -14,  22,   5,  10,  44,  23,   2,  26,
520
+     -9,   3,  -4, -14, -12, -29,  -7, -16,  -7, -18,
521
+    }, {
522
+    -44, -20, -34, -29,  10, -13,   4,   0,   4,  -9,
523
+      5, -19, -10, -24,  11,  17,   8,  20,   5,  19,
524
+     -9,  14, -12,   9,   6,   0,  30,   9,   0,  19,
525
+      2,   7,   2,  10,   5, -20, -21,  -1, -17,  -9,
526
+    }, {
527
+    -77, -16,  -9,  -9,   6,  11,  21,  37,  10,  10,
528
+     -4,  -5, -13,   3,  -7,   0, -13,  11, -17,   6,
529
+    -25,   1, -15,   9,  -7,   9,  32,  19,   0,  18,
530
+     -2, -22,   3, -15,  12,  -5,   4,  -2,  17,  -5,
531
+    }, {
532
+    -55, -28, -21, -27,   2,  -7,   8,  20,  -4,  -1,
533
+     -1, -18,  -5,  -4,  -5,  16,  -2,   8,  -5,   5,
534
+    -19,  -2, -14,  -3,  -6,   0,  18,   4,  -2,  11,
535
+      8, -18,  11,  10,  29,   3, -10,  13,   8,   3,
536
+    }, {
537
+    -58,  -9, -16,   1,  -2,   2,   0,  19,  10,  13,
538
+     17,  21,   3,   3,  19, -12,   2,   0, -10,   1,
539
+     -5,  12,   0,  15,  26,   5,  34,  16,  11,   7,
540
+     -4,  25,   2, -14,   3, -29, -13, -25, -20, -20,
541
+    }, {
542
+    -36, -21, -28, -16,  -6, -16, -12,   2,  -4,   2,
543
+     20,   7,  11,  -4,  20,   4,  12,  -2,   1,   0,
544
+      0,   8,   2,   2,  27,  -4,  21,   2,   9,   0,
545
+      6,  29,   9,  10,  21, -21, -28, -10, -29, -11,
546
+    }, {
547
+    -69, -17,  -3,   3, -10,   8,   3,  40,   1,  21,
548
+     10,  21,   8,  23,   1, -13,  -8, -11, -21, -11,
549
+    -15,  -4,   0,   2,  13,   5,  23,  12,   7,   0,
550
+      1,   0,  10, -14,  28,  -5,  -1, -11,   5,  -7,
551
+    }, {
552
+    -47, -30, -15, -14, -14,  -9,  -9,  23, -13,  10,
553
+     12,   7,  16,  15,   3,   3,   1, -14,  -9, -12,
554
+     -9,  -8,   0, -10,  14,  -4,   9,  -2,   5,  -8,
555
+     13,   3,  18,  10,  45,   3, -16,   4,  -4,   0,
556
+    }, {
557
+    -79,  11, -15,   4,  18,  23,  20,   5,  30,   7,
558
+     -7,  -2, -21, -21,  -8,  -3, -10,  28,   4,  31,
559
+      6,  25,  -3,  37,   4,  -7,  20,   0,   4,   4,
560
+    -11,   7,  -6,   8, -27, -22, -14, -12,  -5, -16,
561
+    }, {
562
+    -57,   0, -27, -13,  14,   5,   7, -11,  15,  -4,
563
+     -5, -16, -13, -29,  -6,  13,   0,  25,  16,  31,
564
+     12,  22,  -2,  23,   6, -16,   7, -14,   2,  -3,
565
+      0,  12,   0,  33,  -9, -13, -28,   3, -14,  -7,
566
+    }, {
567
+    -90,   3,  -2,   6,  10,  29,  24,  26,  21,  15,
568
+    -15,  -2, -16,  -1, -25,  -4, -21,  16,  -6,  18,
569
+     -3,   8,  -5,  24,  -8,  -7,   9,  -4,   1,  -3,
570
+     -5, -18,   1,   7,  -2,   1,  -2,   1,  19,  -3,
571
+    }, {
572
+    -67,  -8, -14, -11,   7,  11,  11,   9,   7,   3,
573
+    -13, -16,  -8,  -9, -24,  12, -10,  13,   5,  17,
574
+      2,   4,  -3,  10,  -6, -17,  -4, -19,   0, -11,
575
+      6, -13,   9,  33,  14,  10, -16,  17,  10,   4,
576
+    }, {
577
+    -71,  10,  -9,  17,   1,  20,   3,   8,  21,  18,
578
+      6,  24,   0,  -1,   0, -16,  -6,   5,   0,  13,
579
+     17,  19,  11,  29,  25, -11,  11,  -6,  13, -15,
580
+     -7,  29,   0,   8, -11, -22, -20, -21, -17, -18,
581
+    }, {
582
+    -49,  -2, -21,   0,  -1,   2,  -9,  -8,   6,   6,
583
+      8,  10,   8,  -9,   2,   0,   4,   2,  13,  12,
584
+     23,  15,  12,  16,  26, -21,  -2, -21,  11, -23,
585
+      4,  33,   7,  33,   6, -13, -34,  -5, -27, -10,
586
+    }, {
587
+    -82,   1,   4,  19,  -6,  27,   6,  29,  12,  26,
588
+     -1,  24,   5,  18, -17, -17, -17,  -6, -10,   0,
589
+      7,   2,   9,  16,  12, -11,   0, -11,   9, -23,
590
+      0,   3,   8,   8,  13,   1,  -8,  -7,   7,  -6,
591
+    }, {
592
+    -60, -10,  -7,   1,  -9,   8,  -6,  13,  -2,  15,
593
+      1,  10,  13,  11, -15,   0,  -6,  -9,   1,   0,
594
+     13,  -1,  11,   3,  13, -21, -13, -26,   7, -31,
595
+     10,   7,  16,  33,  31,  10, -22,   8,  -1,   2,
596
+    }, {
597
+     -3,   7,  -5,  -5,   8,  -2,  17,  -9,  18, -24,
598
+     -2, -19, -10,  -4,  28,  17,   5,  28,  -2,   7,
599
+     -4,  15,   7,   8,   6,  23,  13,  21, -14,  20,
600
+    -17, -18, -11, -33, -30, -11,  23, -13,  -5,  -9,
601
+    }, {
602
+     18,  -4, -17, -23,   4, -20,   4, -26,   3, -36,
603
+      0, -32,  -2, -12,  29,  34,  16,  24,  10,   6,
604
+      0,  12,   8,  -4,   8,  13,   0,   6, -16,  12,
605
+     -5, -13,  -3,  -7, -13,  -3,   8,   2, -14,   0,
606
+    }, {
607
+    -13,   0,   8,  -3,   0,   4,  21,  11,   9, -16,
608
+    -10, -18,  -5,  16,  10,  16,  -5,  15, -13,  -5,
609
+    -15,  -1,   6,  -4,  -6,  23,   2,  16, -17,  12,
610
+    -10, -44,  -3, -33,  -6,  12,  34,   1,  20,   3,
611
+    }, {
612
+      8, -12,  -3, -21,  -3, -14,   8,  -5,  -4, -28,
613
+     -7, -32,   2,   8,  12,  34,   4,  12,  -1,  -6,
614
+     -9,  -4,   7, -17,  -4,  13, -11,   1, -19,   4,
615
+      0, -39,   4,  -7,  11,  21,  20,  16,  10,  11,
616
+    }, {
617
+      4,   6,   0,   7,  -8,  -4,   0,  -6,   9, -13,
618
+     11,   7,  11,  15,  37,   4,   9,   5,  -5, -11,
619
+      5,   9,  22,   1,  27,  18,   4,  14,  -5,   0,
620
+    -12,   3,  -4, -32, -14, -12,  17, -22, -17, -11,
621
+    }, {
622
+     26,  -6, -11, -10, -12, -23, -12, -23,  -5, -24,
623
+     13,  -5,  19,   8,  38,  21,  20,   2,   6, -12,
624
+     11,   5,  23, -11,  29,   9,  -9,   0,  -7,  -6,
625
+     -1,   7,   2,  -7,   3,  -3,   2,  -6, -27,  -3,
626
+    }, {
627
+     -6,  -2,  14,   9, -16,   1,   3,  14,   0,  -5,
628
+      3,   8,  16,  36,  19,   3,  -1,  -6, -17, -24,
629
+     -4,  -7,  21, -11,  14,  18,  -7,   9,  -9,  -7,
630
+     -6, -22,   3, -33,  10,  11,  28,  -7,   7,   0,
631
+    }, {
632
+     16, -14,   2,  -8, -20, -17,  -9,  -2, -14, -16,
633
+      6,  -5,  24,  28,  21,  20,   8,  -9,  -4, -25,
634
+      1, -11,  22, -24,  15,   8, -21,  -5, -11, -14,
635
+      5, -18,  11,  -7,  27,  20,  14,   7,  -1,   9,
636
+    }, {
637
+    -16,  27,   2,  10,  13,  16,  20, -20,  29, -20,
638
+    -14, -16, -13,  -8,   9,  13,  -2,  33,   9,  19,
639
+     17,  23,  17,  22,   6,   6,  -9,  -2, -12,  -2,
640
+    -20, -13, -13, -10, -45,  -4,  16,  -8,  -2,  -7,
641
+    }, {
642
+      5,  15,  -9,  -7,   9,  -2,   8, -37,  14, -31,
643
+    -11, -29,  -5, -16,  11,  30,   7,  29,  21,  18,
644
+     23,  19,  18,   9,   7,  -3, -23, -17, -14,  -9,
645
+     -8,  -9,  -6,  15, -27,   4,   2,   6, -12,   1,
646
+    }, {
647
+    -26,  19,  15,  12,   5,  22,  24,   0,  21, -12,
648
+    -21, -15,  -8,  11,  -7,  12, -14,  20,  -2,   6,
649
+      7,   6,  16,   9,  -6,   5, -21,  -7, -15, -10,
650
+    -13, -39,  -5, -10, -20,  19,  28,   5,  22,   5,
651
+    }, {
652
+     -4,   6,   3,  -5,   1,   4,  11, -16,   6, -23,
653
+    -19, -29,   0,   3,  -6,  30,  -3,  17,  10,   5,
654
+     13,   2,  17,  -3,  -5,  -3, -35, -21, -17, -17,
655
+     -2, -35,   2,  15,  -3,  28,  13,  21,  13,  13,
656
+    }, {
657
+     -8,  25,   8,  23,  -3,  13,   3, -17,  20,  -8,
658
+      0,  10,   8,  11,  18,   0,   1,  10,   5,   0,
659
+     28,  17,  32,  15,  26,   1, -19,  -9,  -3, -21,
660
+    -15,   7,  -6,  -9, -29,  -5,  10, -17, -15,  -9,
661
+    }, {
662
+     13,  13,  -3,   5,  -7,  -4,  -9, -34,   5, -20,
663
+      2,  -3,  16,   3,  20,  17,  11,   7,  17,   0,
664
+     34,  13,  33,   2,  28,  -8, -32, -24,  -5, -29,
665
+     -3,  12,   0,  15, -11,   3,  -3,  -2, -24,  -1,
666
+    }, {
667
+    -18,  17,  21,  25, -11,  19,   6,   3,  11,   0,
668
+     -7,  11,  13,  31,   1,   0,  -9,  -1,  -5, -12,
669
+     18,   0,  31,   2,  13,   1, -30, -14,  -7, -29,
670
+     -9, -18,   1, -10,  -4,  18,  22,  -3,  10,   2,
671
+    }, {
672
+      3,   5,   9,   7, -15,   1,  -5, -13,  -2, -12,
673
+     -5,  -2,  21,  23,   2,  16,   0,  -5,   6, -13,
674
+     23,  -3,  32, -10,  15,  -8, -44, -28,  -9, -37,
675
+      2, -13,   9,  15,  12,  27,   7,  12,   0,  11,
676
+    }, {
677
+    -44,   6, -30,  -8,   9,  10,  11,  14,  23,  -5,
678
+      8,  -4,  14, -12,  37,  14,  12,  26,   4,  16,
679
+     -8,  16,  -9,   7,  -6,  19,  12,  25,  -5,  24,
680
+    -15, -13,  -8, -36, -34, -31,  -1, -18,  -4, -18,
681
+    }, {
682
+    -22,  -5, -42, -26,   6,  -8,  -1,  -2,   9, -17,
683
+     10, -18,  21, -19,  39,  31,  23,  23,  16,  15,
684
+     -2,  12,  -7,  -6,  -5,   9,  -1,  10,  -7,  16,
685
+     -4,  -9,   0, -10, -17, -22, -16,  -2, -14,  -9,
686
+    }, {
687
+    -55,  -1, -17,  -6,   1,  16,  15,  35,  15,   2,
688
+      0,  -4,  19,   8,  20,  13,   1,  14,  -7,   3,
689
+    -18,   0, -10,  -5, -19,  19,   0,  21,  -8,  16,
690
+     -9, -39,   0, -36, -10,  -7,   9,  -4,  20,  -5,
691
+    }, {
692
+    -33, -13, -29, -24,  -1,  -1,   2,  18,   0,  -9,
693
+      3, -17,  27,   0,  21,  30,  12,  11,   5,   2,
694
+    -12,  -4,  -9, -19, -18,   9, -13,   6, -11,   8,
695
+      2, -35,   8, -10,   7,   1,  -4,  11,  10,   2,
696
+    }, {
697
+    -36,   5, -24,   4,  -7,   7,  -6,  17,  14,   5,
698
+     22,  22,  35,   8,  46,   1,  17,   3,   0,  -2,
699
+      2,  10,   5,   0,  14,  15,   2,  18,   2,   4,
700
+    -11,   7,  -1, -36, -18, -32,  -7, -27, -17, -20,
701
+    }, {
702
+    -14,  -7, -36, -13, -10, -10, -18,   0,   0,  -5,
703
+     25,   8,  43,   0,  48,  18,  27,   0,  12,  -3,
704
+      7,   6,   7, -13,  15,   5, -11,   3,   0,  -2,
705
+      0,  12,   6, -10,   0, -23, -22, -11, -26, -12,
706
+    }, {
707
+    -47,  -3, -11,   6, -15,  13,  -2,  38,   6,  13,
708
+     15,  22,  40,  28,  28,   0,   5,  -8, -10, -15,
709
+     -7,  -7,   4, -13,   1,  14,  -9,  14,   0,  -2,
710
+     -4, -18,   7, -36,   6,  -8,   3, -13,   7,  -8,
711
+    }, {
712
+    -25, -15, -22, -11, -18,  -4, -15,  22,  -8,   2,
713
+     17,   9,  48,  20,  30,  17,  16, -11,   1, -16,
714
+     -2, -10,   5, -26,   2,   4, -22,   0,  -2, -10,
715
+      6, -13,  14, -10,  23,   0, -10,   2,  -1,   0,
716
+    }, {
717
+    -57,  26, -22,   7,  14,  28,  14,   3,  35,   0,
718
+     -3,  -1,  11, -16,  18,  10,   4,  31,  15,  28,
719
+     14,  23,   1,  21,  -7,   2, -11,   1,  -3,   1,
720
+    -18,  -9, -10, -13, -49, -24,  -8, -14,  -2, -16,
721
+    }, {
722
+    -35,  14, -34, -10,  10,  10,   1, -12,  20, -12,
723
+      0, -15,  18, -24,  20,  27,  14,  28,  27,  27,
724
+     20,  19,   2,   8,  -5,  -7, -25, -13,  -5,  -5,
725
+     -6,  -5,  -2,  12, -31, -15, -23,   1, -12,  -8,
726
+    }, {
727
+    -68,  18,  -9,   9,   6,  35,  18,  25,  26,   7,
728
+    -10,  -1,  16,   3,   1,   9,  -6,  19,   4,  15,
729
+      4,   6,   0,   8, -20,   2, -23,  -2,  -7,  -5,
730
+    -12, -35,  -1, -13, -24,   0,   3,   0,  22,  -4,
731
+    }, {
732
+    -46,   6, -21,  -8,   2,  16,   5,   8,  11,  -4,
733
+     -8, -15,  24,  -4,   2,  26,   3,  16,  16,  14,
734
+      9,   2,   1,  -4, -19,  -7, -36, -17,  -9, -13,
735
+      0, -31,   5,  12,  -7,   8, -11,  15,  13,   4,
736
+    }, {
737
+    -49,  24, -16,  20,  -2,  26,  -2,   7,  25,  10,
738
+     11,  25,  32,   3,  27,  -2,   8,   8,  11,   9,
739
+     24,  17,  16,  14,  13,  -2, -20,  -5,   4, -17,
740
+    -14,  12,  -3, -13, -33, -25, -14, -23, -15, -19,
741
+    }, {
742
+    -27,  12, -28,   2,  -6,   7, -15,  -9,  11,  -1,
743
+     13,  11,  40,  -4,  29,  14,  19,   5,  23,   8,
744
+     30,  13,  17,   0,  14, -12, -34, -20,   2, -25,
745
+     -2,  16,   4,  12, -15, -16, -29,  -7, -24, -10,
746
+    }, {
747
+    -60,  16,  -3,  22, -10,  32,   0,  28,  17,  18,
748
+      3,  25,  37,  23,  10,  -3,  -2,  -3,   0,  -3,
749
+     14,   0,  14,   1,   0,  -2, -32,  -9,   1, -25,
750
+     -7, -13,   5, -13,  -8,  -1,  -2,  -8,  10,  -6,
751
+    }, {
752
+    -38,   4, -15,   4, -14,  13, -12,  11,   2,   6,
753
+      6,  11,  45,  16,  11,  13,   7,  -6,  12,  -4,
754
+     20,  -3,  16, -12,   1, -12, -46, -24,   0, -33,
755
+      3,  -9,  12,  12,   8,   7, -17,   6,   0,   2
756
+    }
757
+};
62 758
 
63
-    ractx->lpc_coef[0] = ractx->lpc_tables[0];
64
-    ractx->lpc_coef[1] = ractx->lpc_tables[1];
759
+const int8_t cb2_vects[128][40]={
760
+    {
761
+     73, -32, -60, -15, -26,  59,   2, -33,  30, -10,
762
+     -3, -17,   8,  30,  -1, -26,  -4, -22,  10,  16,
763
+    -36,  -5, -11,  56,  37,   6, -10,  -5, -13,  -3,
764
+      6,  -5,  11,   4, -19,  -5, -16,  41,  24,  13,
765
+    }, {
766
+      4, -11, -37,  23,  -5,  46,  -2, -29,  -5, -39,
767
+    -21,  -9,   0,  49,  12,  -9, -16, -26,  22,  15,
768
+    -45, -20,  -5,  40,  22,  17, -26,  31, -14,   2,
769
+    -14,  10,  30,  20, -27,  -9, -39,  39,  18,   5,
770
+    }, {
771
+     34, -25, -48, -28, -11,  34,  -2, -41,   9,  -7,
772
+    -17,  21,  20,  24, -17, -33,   0, -24,  10,  42,
773
+      3,  -5,  10,  42,  11,   8,  -3,   3,  16,   9,
774
+     22,  -2,   0, -33, -10,  18,   7,  58,  10,  28,
775
+    }, {
776
+    -34,  -4, -25,  10,   9,  21,  -7, -36, -26, -36,
777
+    -35,  28,  12,  42,  -3, -16, -12, -28,  21,  42,
778
+     -5, -21,  16,  26,  -4,  19, -19,  39,  15,  15,
779
+      1,  13,  19, -17, -17,  14, -15,  55,   4,  19,
780
+    }, {
781
+     28, -20, -51, -14,  -6,   7,   0, -26,  27,  -4,
782
+     18, -40,  -6,  16,  -1, -15,   0, -55,  -5, -16,
783
+    -19,  14,  -3,  49,  14,   1, -22, -30, -12,   0,
784
+     24,  15,   9, -17, -45, -29,   4,  28,  51,  35,
785
+    }, {
786
+    -40,   0, -28,  24,  14,  -5,  -4, -21,  -7, -33,
787
+      0, -32, -15,  35,  12,   1, -11, -58,   5, -16,
788
+    -28,   0,   1,  33,   0,  11, -39,   5, -14,   6,
789
+      3,  31,  28,  -1, -53, -33, -19,  25,  46,  26,
790
+    }, {
791
+    -11, -14, -39, -27,   9, -17,  -4, -33,   6,   0,
792
+      4,  -1,   5,  10, -17, -22,   5, -57,  -5,   9,
793
+     20,  13,  18,  35, -11,   3, -16, -22,  17,  13,
794
+     40,  19,  -1, -55, -35,  -5,  27,  44,  37,  49,
795
+    }, {
796
+    -80,   6, -16,  11,  30, -30,  -9, -28, -28, -29,
797
+    -13,   6,  -2,  28,  -3,  -5,  -7, -60,   5,   9,
798
+     11,  -1,  24,  19, -27,  13, -32,  13,  15,  19,
799
+     19,  35,  17, -39, -43,  -9,   4,  42,  32,  41,
800
+    }, {
801
+     78, -21, -43,   4, -38,  17,  17,  -5,  55,  24,
802
+    -15, -36,  14,   4,  24, -24,  12,   5,  17,  31,
803
+    -54,  -5,  -2,  27,  43, -12,   2,   9,  -9, -15,
804
+     22,  -3,  28,  21, -20,   3,  20,  28,   9,  -5,
805
+    }, {
806
+      9,  -1, -20,  43, -17,   3,  12,   0,  20,  -4,
807
+    -33, -29,   6,  22,  38,  -7,   0,   1,  29,  30,
808
+    -63, -21,   3,  11,  27,  -1, -14,  45, -10,  -9,
809
+      1,  12,  47,  37, -28,   0,  -2,  26,   4, -13,
810
+    }, {
811
+     39, -14, -30,  -8, -22,  -8,  12, -12,  34,  27,
812
+    -29,   2,  26,  -2,   8, -31,  16,   3,  17,  57,
813
+    -14,  -6,  19,  13,  16, -10,   8,  17,  20,  -2,
814
+     38,   0,  17, -16, -11,  27,  44,  45,  -4,   8,
815
+    }, {
816
+    -29,   5,  -7,  30,  -1, -21,   7,  -7,   0,   0,
817
+    -47,   9,  18,  15,  22, -14,   4,   0,  28,  57,
818
+    -23, -21,  25,  -2,   1,   0,  -7,  53,  19,   3,
819
+     17,  15,  36,   0, -19,  24,  21,  43,  -9,   0,
820
+    }, {
821
+     33, -10, -34,   5, -17, -35,  15,   1,  53,  30,
822
+      6, -59,   0, -10,  24, -13,  17, -27,   1,  -1,
823
+    -37,  13,   4,  20,  20, -18, -10, -16,  -8, -11,
824
+     39,  18,  26,   0, -46, -20,  41,  15,  37,  15,
825
+    }, {
826
+    -35,  10, -11,  44,   3, -48,  10,   6,  17,   2,
827
+    -11, -51,  -8,   8,  38,   3,   4, -31,  12,  -2,
828
+    -46,  -1,  10,   4,   5,  -7, -26,  19, -10,  -5,
829
+     18,  34,  45,  15, -54, -24,  18,  13,  31,   7,
830
+    }, {
831
+     -5,  -3, -21,  -7,  -2, -60,  10,  -5,  32,  34,
832
+     -7, -20,  11, -16,   8, -20,  21, -29,   1,  24,
833
+      2,  13,  27,   6,  -5, -15,  -3,  -8,  21,   1,
834
+     55,  21,  15, -38, -37,   3,  65,  32,  23,  30,
835
+    }, {
836
+    -74,  17,   0,  31,  18, -73,   5,   0,  -3,   5,
837
+    -25, -12,   3,   1,  22,  -3,   9, -33,  12,  24,
838
+     -6,  -2,  33,  -9, -21,  -5, -20,  27,  19,   7,
839
+     34,  37,  34, -22, -44,   0,  41,  29,  17,  21,
840
+    }, {
841
+     76, -35, -31, -28, -49,  43, -40,   0,  29, -14,
842
+      8,   5,  10,  18, -26, -46,   0,   7,   6,   3,
843
+    -25,  -7,  -2,  40,  28,  14,  18,  -3, -27, -28,
844
+     -8, -45, -13,  34, -13, -27, -15,  31,  12,   3,
845
+    }, {
846
+      7, -15,  -9,   9, -28,  29, -45,   5,  -6, -43,
847
+     -9,  12,   2,  36, -12, -30, -11,   3,  17,   3,
848
+    -34, -22,   3,  24,  12,  24,   2,  32, -28, -22,
849
+    -29, -29,   5,  50, -21, -31, -38,  29,   7,  -5,
850
+    }, {
851
+     36, -29, -19, -41, -34,  18, -45,  -6,   8, -10,
852
+     -5,  43,  23,  11, -42, -53,   5,   5,   6,  30,
853
+     14,  -8,  20,  26,   1,  16,  25,   4,   3, -15,
854
+      7, -41, -23,  -3,  -4,  -3,   8,  48,  -1,  17,
855
+    }, {
856
+    -32,  -8,   3,  -2, -13,   4, -50,  -1, -27, -39,
857
+    -23,  51,  15,  30, -27, -37,  -7,   1,  17,  29,
858
+      5, -23,  25,  10, -14,  26,   8,  41,   1,  -9,
859
+    -13, -26,  -5,  12, -12,  -7, -14,  45,  -6,   9,
860
+    }, {
861
+     31, -24, -23, -27, -29,  -9, -43,   8,  26,  -7,
862
+     30, -17,  -4,   3, -26, -35,   5, -24, -10, -28,
863
+     -9,  12,   5,  33,   5,   8,   5, -29, -26, -24,
864
+      9, -23, -14,  12, -39, -52,   5,  18,  39,  24,
865
+    }, {
866
+    -37,  -3,   0,  10,  -7, -22, -48,  12,  -8, -36,
867
+     12,  -9, -12,  22, -12, -19,  -6, -28,   0, -29,
868
+    -18,  -3,  11,  17, -10,  18, -10,   7, -27, -18,
869
+    -11,  -7,   3,  28, -47, -55, -18,  15,  34,  16,
870
+    }, {
871
+     -8, -17, -10, -40, -13, -34, -47,   0,   5,  -4,
872
+     16,  21,   8,  -2, -42, -43,  10, -26, -10,  -2,
873
+     31,  11,  27,  19, -21,  10,  12, -20,   3, -11,
874
+     25, -20, -25, -25, -29, -28,  28,  34,  25,  38,
875
+    }, {
876
+    -77,   2,  11,  -1,   7, -47, -52,   5, -29, -33,
877
+     -1,  28,   0,  15, -28, -26,  -2, -30,   0,  -2,
878
+     22,  -4,  33,   3, -36,  21,  -3,  15,   2,  -5,
879
+      4,  -4,  -6,  -9, -37, -31,   5,  32,  20,  30,
880
+    }, {
881
+     81, -25, -14,  -8, -61,   0, -25,  28,  54,  20,
882
+     -3, -14,  17,  -8,   0, -44,  16,  35,  13,  18,
883
+    -43,  -7,   6,  11,  33,  -4,  30,  11, -22, -40,
884
+      6, -43,   3,  50, -14, -18,  22,  18,  -1, -16,
885
+    }, {
886
+     12,  -4,   8,  29, -39, -12, -30,  33,  19,  -8,
887
+    -21,  -6,   8,   9,  13, -28,   4,  31,  24,  18,
888
+    -52, -23,  12,  -4,  18,   5,  14,  47, -24, -34,
889
+    -14, -27,  22,  66, -22, -22,  -1,  16,  -6, -24,
890
+    }, {
891
+     41, -18,  -2, -21, -45, -24, -30,  21,  33,  24,
892
+    -17,  24,  29, -15, -16, -51,  21,  33,  13,  45,
893
+     -3,  -8,  28,  -2,   7,  -2,  37,  19,   7, -27,
894
+     22, -39,  -7,  12,  -5,   5,  45,  35, -15,  -1,
895
+    }, {
896
+    -27,   1,  20,  17, -24, -38, -35,  26,  -1,  -4,
897
+    -35,  32,  21,   3,  -2, -35,   8,  29,  24,  44,
898
+    -12, -24,  34, -18,  -8,   7,  21,  55,   5, -21,
899
+      2, -23,  11,  28, -13,   1,  22,  33, -21, -10,
900
+    }, {
901
+     36, -13,  -5,  -7, -40, -51, -28,  36,  52,  27,
902
+     18, -36,   2, -22,   0, -33,  21,   2,  -3, -13,
903
+    -26,  11,  14,   4,  10, -10,  18, -14, -22, -36,
904
+     24, -21,   1,  28, -40, -42,  42,   5,  25,   5,
905
+    }, {
906
+    -32,   6,  17,  31, -19, -65, -33,  41,  16,  -1,
907
+      0, -29,  -6,  -4,  13, -17,   9,  -1,   8, -14,
908
+    -35,  -3,  19, -11,  -4,   0,   1,  21, -23, -30,
909
+      3,  -5,  20,  44, -48, -46,  19,   3,  20,  -3,
910
+    }, {
911
+     -3,  -7,   6, -20, -25, -77, -32,  29,  31,  30,
912
+      4,   2,  14, -29, -16, -40,  26,   0,  -3,  12,
913
+     13,  10,  36,  -9, -15,  -8,  24,  -6,   7, -22,
914
+     40, -17,  -8,  -9, -31, -18,  66,  22,  11,  19,
915
+    }, {
916
+    -72,  13,  29,  18,  -4, -90, -37,  34,  -4,   1,
917
+    -13,   9,   6, -11,  -2, -24,  13,  -3,   7,  11,
918
+      4,  -4,  42, -25, -31,   1,   8,  29,   6, -17,
919
+     19,  -2,  10,   6, -38, -22,  42,  19,   6,  11,
920
+    }, {
921
+    116, -20, -68, -30, -28,  83,  28, -18,  32, -22,
922
+    -13, -21,   5,  28,   5,  -7, -24,  -8, -22,  17,
923
+    -23,  30, -25,  45,  15,  -9, -11, -18,  22, -10,
924
+      4,  -2,  19, -12,  23,   3, -43,   2,  12,  -4,
925
+    }, {
926
+     47,   0, -45,   7,  -7,  69,  23, -13,  -2, -51,
927
+    -32, -14,  -3,  47,  19,   8, -37, -11, -10,  16,
928
+    -32,  15, -19,  29,   0,   1, -28,  18,  20,  -4,
929
+    -16,  13,  38,   3,  15,   0, -66,   0,   7, -13,
930
+    }, {
931
+     77, -13, -56, -43, -13,  57,  23, -26,  11, -19,
932
+    -27,  16,  17,  22, -10, -15, -19, -10, -22,  43,
933
+     16,  30,  -2,  31, -11,  -6,  -5,  -9,  52,   2,
934
+     20,   0,   8, -50,  33,  27, -19,  19,  -1,   9,
935
+    }, {
936
+      8,   6, -33,  -4,   7,  44,  18, -21, -23, -48,
937
+    -46,  24,   9,  40,   3,   1, -32, -13, -11,  43,
938
+      7,  14,   3,  15, -26,   3, -21,  26,  50,   8,
939
+      0,  16,  27, -34,  25,  23, -43,  17,  -6,   1,
940
+    }, {
941
+     71,  -9, -59, -29,  -8,  30,  26, -11,  30, -16,
942
+      8, -44,  -9,  14,   5,   2, -19, -40, -38, -15,
943
+     -7,  50, -17,  38,  -7, -14, -24, -43,  22,  -6,
944
+     22,  19,  17, -34,  -2, -20, -23, -10,  39,  16,
945
+    }, {
946
+      2,  11, -36,   9,  13,  17,  21,  -6,  -5, -45,
947
+    -10, -36, -18,  33,  19,  19, -31, -44, -27, -15,
948
+    -16,  34, -11,  22, -22,  -4, -40,  -7,  21,   0,
949
+      1,  35,  36, -18, -10, -24, -46, -12,  34,   8,
950
+    }, {
951
+     32,  -2, -47, -42,   7,   5,  21, -18,   9, -12,
952
+     -5,  -5,   2,   8, -10,  -4, -14, -42, -38,  10,
953
+     33,  49,   5,  24, -33, -12, -17, -35,  52,   6,
954
+     38,  22,   7, -72,   7,   3,   0,   6,  25,  30,
955
+    }, {
956
+    -36,  18, -24,  -3,  28,  -7,  16, -13, -26, -41,
957
+    -24,   1,  -5,  26,   3,  12, -27, -46, -27,  10,
958
+     24,  34,  10,   8, -49,  -2, -34,   0,  51,  12,
959
+     17,  38,  25, -56,   0,   0, -22,   3,  20,  22,
960
+    }, {
961
+    121,  -9, -50, -10, -40,  40,  43,   9,  58,  12,
962
+    -25, -41,  11,   2,  31,  -5,  -8,  19, -15,  32,
963
+    -41,  30, -16,  16,  20, -28,   0,  -3,  26, -22,
964
+     19,   0,  36,   4,  22,  12,  -6,  -9,  -1, -24,
965
+    }, {
966
+     52,  10, -27,  27, -18,  26,  38,  14,  23, -16,
967
+    -44, -33,   3,  20,  45,  10, -20,  15,  -3,  31,
968
+    -50,  14, -10,   0,   5, -17, -15,  32,  24, -16,
969
+     -1,  15,  55,  20,  14,   8, -29, -12,  -7, -32,
970
+    }, {
971
+     82,  -3, -38, -23, -24,  15,  38,   2,  37,  15,
972
+    -39,  -2,  23,  -4,  15, -12,  -3,  17, -15,  58,
973
+     -1,  29,   6,   2,  -5, -26,   7,   4,  56,  -9,
974
+     35,   3,  25, -33,  32,  36,  17,   7, -15,  -9,
975
+    }, {
976
+     13,  17, -15,  15,  -3,   1,  33,   7,   1, -12,
977
+    -58,   5,  15,  13,  29,   3, -16,  13,  -4,  57,
978
+    -10,  13,  11, -13, -21, -15,  -9,  40,  55,  -3,
979
+     14,  19,  44, -17,  24,  32,  -5,   4, -21, -18,
980
+    }, {
981
+     76,   1, -41,  -9, -19, -12,  41,  17,  55,  18,
982
+     -3, -63,  -3, -12,  30,   5,  -3, -12, -31,   0,
983
+    -24,  49,  -8,   9,  -1, -33, -12, -29,  27, -18,
984
+     37,  21,  34, -17,  -3, -11,  14, -23,  25,  -2,
985
+    }, {
986
+      7,  22, -18,  29,   1, -25,  36,  21,  20,  -9,
987
+    -22, -56, -11,   6,  45,  21, -15, -16, -20,  -1,
988
+    -33,  34,  -2,  -6, -17, -23, -28,   6,  25, -12,
989
+     16,  37,  53,  -1, -11, -15,  -8, -25,  20, -11,
990
+    }, {
991
+     37,   8, -29, -22,  -4, -37,  36,   9,  34,  22,
992
+    -17, -24,   8, -18,  15,  -2,   1, -14, -31,  25,
993
+     15,  48,  13,  -4, -28, -31,  -5, -21,  57,  -4,
994
+     53,  24,  23, -55,   6,  12,  37,  -6,  11,  11,
995
+    }, {
996
+    -31,  28,  -6,  16,  16, -50,  31,  14,   0,  -6,
997
+    -36, -17,   0,   0,  29,  14, -11, -18, -20,  25,
998
+      6,  33,  19, -20, -43, -21, -21,  14,  55,   0,
999
+     32,  40,  42, -39,  -1,   8,  14,  -8,   6,   3,
1000
+    }, {
1001
+    119, -24, -39, -44, -51,  66, -14,  15,  31, -26,
1002
+     -1,   0,   7,  16, -19, -28, -19,  22, -26,   4,
1003
+    -13,  28, -16,  29,   5,  -1,  16, -16,   8, -35,
1004
+    -10, -42,  -4,  17,  29, -19, -42,  -7,   0, -15,
1005
+    }, {
1006
+     50,  -3, -16,  -5, -30,  53, -19,  20,  -3, -55,
1007
+    -19,   8,   0,  34,  -5, -11, -32,  18, -15,   4,
1008
+    -22,  13, -10,  13,  -9,   8,   0,  19,   7, -29,
1009
+    -31, -26,  13,  33,  21, -22, -65,  -9,  -4, -23,
1010
+    }, {
1011
+     79, -17, -27, -56, -36,  41, -19,   8,  10, -22,
1012
+    -15,  39,  20,   9, -35, -35, -15,  20, -26,  31,
1013
+     26,  27,   6,  15, -20,   0,  23,  -8,  38, -22,
1014
+      5, -38, -15, -20,  39,   4, -18,   9, -13,  -1,
1015
+    }, {
1016
+     10,   3,  -4, -18, -15,  27, -24,  13, -24, -51,
1017
+    -34,  47,  12,  28, -21, -19, -27,  16, -15,  30,
1018
+     17,  12,  12,   0, -36,  10,   7,  27,  37, -16,
1019
+    -15, -22,   3,  -4,  31,   1, -42,   7, -18,  -9,
1020
+    }, {
1021
+     74, -12, -30, -42, -30,  14, -16,  23,  29, -19,
1022
+     20, -21,  -7,   1, -19, -17, -14, -10, -43, -27,
1023
+      3,  48,  -8,  22, -16,  -7,   4, -42,   9, -31,
1024
+      6, -20,  -6,  -4,   3, -43, -22, -20,  28,   5,
1025
+    }, {
1026
+      5,   7,  -7,  -4,  -9,   0, -21,  28,  -6, -48,
1027
+      2, -14, -15,  20,  -5,   0, -27, -14, -32, -28,
1028
+     -5,  32,  -2,   6, -32,   3, -12,  -5,   8, -25,
1029
+    -14,  -4,  12,  11,  -4, -47, -45, -22,  22,  -2,
1030
+    }, {
1031
+     34,  -6, -18, -55, -15, -11, -21,  16,   8, -16,
1032
+      6,  16,   5,  -4, -35, -24, -10, -12, -43,  -1,
1033
+     43,  47,  14,   8, -43,  -5,  10, -34,  39, -18,
1034
+     22, -16, -17, -42,  13, -19,   1,  -3,  14,  20,
1035
+    }, {
1036
+    -34,  14,   4, -17,   5, -24, -26,  20, -27, -45,
1037
+    -12,  24,  -2,  13, -21,  -8, -22, -16, -32,  -2,
1038
+     34,  31,  20,  -7, -58,   5,  -5,   2,  38, -12,
1039
+      2,  -1,   1, -26,   5, -23, -21,  -6,   8,  11,
1040
+    }, {
1041
+    124, -13, -21, -23, -62,  23,   0,  43,  57,   8,
1042
+    -13, -18,  14, -10,   6, -26,  -3,  49, -19,  19,
1043
+    -31,  27,  -7,   0,  11, -20,  29,  -1,  12, -47,
1044
+      4, -39,  11,  34,  28,  -9,  -5, -19, -13, -34,
1045
+    }, {
1046
+     55,   6,   1,  14, -41,  10,  -4,  48,  22, -20,
1047
+    -31, -10,   5,   7,  20,  -9, -16,  45,  -8,  19,
1048
+    -40,  12,  -1, -15,  -4, -10,  12,  34,  11, -41,
1049
+    -16, -24,  30,  49,  20, -13, -28, -22, -18, -43,
1050
+    }, {
1051
+     84,  -6,  -9, -36, -47,  -1,  -4,  36,  36,  12,
1052
+    -27,  20,  26, -17,  -9, -33,   1,  47, -19,  46,
1053
+      9,  27,  15, -13, -15, -18,  35,   6,  42, -33,
1054
+     20, -36,   1,  -4,  38,  14,  18,  -2, -27, -20,
1055
+    }, {
1056
+     15,  13,  13,   1, -26, -14,  -9,  41,   1, -16,
1057
+    -46,  27,  18,   1,   4, -16, -11,  43,  -8,  45,
1058
+      0,  11,  21, -29, -30,  -8,  19,  42,  41, -28,
1059
+      0, -20,  20,  11,  30,  10,  -4,  -5, -32, -28,
1060
+    }, {
1061
+     79,  -2, -12, -22, -42, -28,  -1,  51,  54,  15,
1062
+      8, -41,   0, -24,   6, -15,   1,  17, -36, -12,
1063
+    -14,  47,   0,  -6, -11, -26,  16, -27,  13, -43,
1064
+     22, -18,  10,  12,   2, -34,  15, -33,  13, -13,
1065
+    }, {
1066
+     10,  18,  10,  15, -21, -41,  -6,  56,  19, -13,
1067
+     -9, -33,  -9,  -6,  20,   1, -11,  13, -24, -13,
1068
+    -23,  32,   6, -22, -26, -15,   0,   8,  12, -37,
1069
+      1,  -2,  28,  27,  -5, -37,  -7, -35,   8, -21,
1070
+    }, {
1071
+     39,   4,   0, -35, -27, -53,  -6,  44,  33,  18,
1072
+     -5,  -2,  11, -31,  -9, -22,   6,  15, -36,  13,
1073
+     25,  46,  23, -20, -37, -24,  23, -19,  43, -29,
1074
+     38, -14,   0, -26,  12, -10,  38, -16,   0,   0,
1075
+    }, {
1076
+    -29,  25,  22,   2,  -6, -67, -11,  49,  -1, -10,
1077
+    -24,   5,   3, -13,   4,  -5,  -6,  11, -25,  12,
1078
+     16,  31,  28, -36, -53, -13,   6,  16,  42, -24,
1079
+     17,   1,  18, -10,   4, -13,  15, -18,  -5,  -7,
1080
+    }, {
1081
+     29, -25, -22,  -2,   6,  67,  11, -49,   1,  10,
1082
+     24,  -5,  -3,  13,  -4,   5,   6, -11,  25, -12,
1083
+    -16, -31, -28,  36,  53,  13,  -6, -16, -42,  24,
1084
+    -17,  -1, -18,  10,  -4,  13, -15,  18,   5,   7,
1085
+    }, {
1086
+    -39,  -4,   0,  35,  27,  53,   6, -44, -33, -18,
1087
+      5,   2, -11,  31,   9,  22,  -6, -15,  36, -13,
1088
+    -25, -46, -23,  20,  37,  24, -23,  19, -43,  29,
1089
+    -38,  14,   0,  26, -12,  10, -38,  16,   0,   0,
1090
+    }, {
1091
+    -10, -18, -10, -15,  21,  41,   6, -56, -19,  13,
1092
+      9,  33,   9,   6, -20,  -1,  11, -13,  24,  13,
1093
+     23, -32,  -6,  22,  26,  15,   0,  -8, -12,  37,
1094
+     -1,   2, -28, -27,   5,  37,   7,  35,  -8,  21,
1095
+    }, {
1096
+    -79,   2,  12,  22,  42,  28,   1, -51, -54, -15,
1097
+     -8,  41,   0,  24,  -6,  15,  -1, -17,  36,  12,
1098
+     14, -47,   0,   6,  11,  26, -16,  27, -13,  43,
1099
+    -22,  18, -10, -12,  -2,  34, -15,  33, -13,  13,
1100
+    }, {
1101
+    -15, -13, -13,  -1,  26,  14,   9, -41,  -1,  16,
1102
+     46, -27, -18,  -1,  -4,  16,  11, -43,   8, -45,
1103
+      0, -11, -21,  29,  30,   8, -19, -42, -41,  28,
1104
+      0,  20, -20, -11, -30, -10,   4,   5,  32,  28,
1105
+    }, {
1106
+    -84,   6,   9,  36,  47,   1,   4, -36, -36, -12,
1107
+     27, -20, -26,  17,   9,  33,  -1, -47,  19, -46,
1108
+     -9, -27, -15,  13,  15,  18, -35,  -6, -42,  33,
1109
+    -20,  36,  -1,   4, -38, -14, -18,   2,  27,  20,
1110
+    }, {
1111
+    -55,  -6,  -1, -14,  41, -10,   4, -48, -22,  20,
1112
+     31,  10,  -5,  -7, -20,   9,  16, -45,   8, -19,
1113
+     40, -12,   1,  15,   4,  10, -12, -34, -11,  41,
1114
+     16,  24, -30, -49, -20,  13,  28,  22,  18,  43,
1115
+    }, {
1116
+   -124,  13,  21,  23,  62, -23,   0, -43, -57,  -8,
1117
+     13,  18, -14,  10,  -6,  26,   3, -49,  19, -19,
1118
+     31, -27,   7,   0, -11,  20, -29,   1, -12,  47,
1119
+     -4,  39, -11, -34, -28,   9,   5,  19,  13,  34,
1120
+    }, {
1121
+     34, -14,  -4,  17,  -5,  24,  26, -20,  27,  45,
1122
+     12, -24,   2, -13,  21,   8,  22,  16,  32,   2,
1123
+    -34, -31, -20,   7,  58,  -5,   5,  -2, -38,  12,
1124
+     -2,   1,  -1,  26,  -5,  23,  21,   6,  -8, -11,
1125
+    }, {
1126
+    -34,   6,  18,  55,  15,  11,  21, -16,  -8,  16,
1127
+     -6, -16,  -5,   4,  35,  24,  10,  12,  43,   1,
1128
+    -43, -47, -14,  -8,  43,   5, -10,  34, -39,  18,
1129
+    -22,  16,  17,  42, -13,  19,  -1,   3, -14, -20,
1130
+    }, {
1131
+     -5,  -7,   7,   4,   9,   0,  21, -28,   6,  48,
1132
+     -2,  14,  15, -20,   5,   0,  27,  14,  32,  28,
1133
+      5, -32,   2,  -6,  32,  -3,  12,   5,  -8,  25,
1134
+     14,   4, -12, -11,   4,  47,  45,  22, -22,   2,
1135
+    }, {
1136
+    -74,  12,  30,  42,  30, -14,  16, -23, -29,  19,
1137
+    -20,  21,   7,  -1,  19,  17,  14,  10,  43,  27,
1138
+     -3, -48,   8, -22,  16,   7,  -4,  42,  -9,  31,
1139
+     -6,  20,   6,   4,  -3,  43,  22,  20, -28,  -5,
1140
+    }, {
1141
+    -10,  -3,   4,  18,  15, -27,  24, -13,  24,  51,
1142
+     34, -47, -12, -28,  21,  19,  27, -16,  15, -30,
1143
+    -17, -12, -12,   0,  36, -10,  -7, -27, -37,  16,
1144
+     15,  22,  -3,   4, -31,  -1,  42,  -7,  18,   9,
1145
+    }, {
1146
+    -79,  17,  27,  56,  36, -41,  19,  -8, -10,  22,
1147
+     15, -39, -20,  -9,  35,  35,  15, -20,  26, -31,
1148
+    -26, -27,  -6, -15,  20,   0, -23,   8, -38,  22,
1149
+     -5,  38,  15,  20, -39,  -4,  18,  -9,  13,   1,
1150
+    }, {
1151
+    -50,   3,  16,   5,  30, -53,  19, -20,   3,  55,
1152
+     19,  -8,   0, -34,   5,  11,  32, -18,  15,  -4,
1153
+     22, -13,  10, -13,   9,  -8,   0, -19,  -7,  29,
1154
+     31,  26, -13, -33, -21,  22,  65,   9,   4,  23,
1155
+    }, {
1156
+   -119,  24,  39,  44,  51, -66,  14, -15, -31,  26,
1157
+      1,   0,  -7, -16,  19,  28,  19, -22,  26,  -4,
1158
+     13, -28,  16, -29,  -5,   1, -16,  16,  -8,  35,
1159
+     10,  42,   4, -17, -29,  19,  42,   7,   0,  15,
1160
+    }, {
1161
+     31, -28,   6, -16, -16,  50, -31, -14,   0,   6,
1162
+     36,  17,   0,   0, -29, -14,  11,  18,  20, -25,
1163
+     -6, -33, -19,  20,  43,  21,  21, -14, -55,   0,
1164
+    -32, -40, -42,  39,   1,  -8, -14,   8,  -6,  -3,
1165
+    }, {
1166
+    -37,  -8,  29,  22,   4,  37, -36,  -9, -34, -22,
1167
+     17,  24,  -8,  18, -15,   2,  -1,  14,  31, -25,
1168
+    -15, -48, -13,   4,  28,  31,   5,  21, -57,   4,
1169
+    -53, -24, -23,  55,  -6, -12, -37,   6, -11, -11,
1170
+    }, {
1171
+     -7, -22,  18, -29,  -1,  25, -36, -21, -20,   9,
1172
+     22,  56,  11,  -6, -45, -21,  15,  16,  20,   1,
1173
+     33, -34,   2,   6,  17,  23,  28,  -6, -25,  12,
1174
+    -16, -37, -53,   1,  11,  15,   8,  25, -20,  11,
1175
+    }, {
1176
+    -76,  -1,  41,   9,  19,  12, -41, -17, -55, -18,
1177
+      3,  63,   3,  12, -30,  -5,   3,  12,  31,   0,
1178
+     24, -49,   8,  -9,   1,  33,  12,  29, -27,  18,
1179
+    -37, -21, -34,  17,   3,  11, -14,  23, -25,   2,
1180
+    }, {
1181
+    -13, -17,  15, -15,   3,  -1, -33,  -7,  -1,  12,
1182
+     58,  -5, -15, -13, -29,  -3,  16, -13,   4, -57,
1183
+     10, -13, -11,  13,  21,  15,   9, -40, -55,   3,
1184
+    -14, -19, -44,  17, -24, -32,   5,  -4,  21,  18,
1185
+    }, {
1186
+    -82,   3,  38,  23,  24, -15, -38,  -2, -37, -15,
1187
+     39,   2, -23,   4, -15,  12,   3, -17,  15, -58,
1188
+      1, -29,  -6,  -2,   5,  26,  -7,  -4, -56,   9,
1189
+    -35,  -3, -25,  33, -32, -36, -17,  -7,  15,   9,
1190
+    }, {
1191
+    -52, -10,  27, -27,  18, -26, -38, -14, -23,  16,
1192
+     44,  33,  -3, -20, -45, -10,  20, -15,   3, -31,
1193
+     50, -14,  10,   0,  -5,  17,  15, -32, -24,  16,
1194
+      1, -15, -55, -20, -14,  -8,  29,  12,   7,  32,
1195
+    }, {
1196
+   -121,   9,  50,  10,  40, -40, -43,  -9, -58, -12,
1197
+     25,  41, -11,  -2, -31,   5,   8, -19,  15, -32,
1198
+     41, -30,  16, -16, -20,  28,   0,   3, -26,  22,
1199
+    -19,   0, -36,  -4, -22, -12,   6,   9,   1,  24,
1200
+    }, {
1201
+     36, -18,  24,   3, -28,   7, -16,  13,  26,  41,
1202
+     24,  -1,   5, -26,  -3, -12,  27,  46,  27, -10,
1203
+    -24, -34, -10,  -8,  49,   2,  34,   0, -51, -12,
1204
+    -17, -38, -25,  56,   0,   0,  22,  -3, -20, -22,
1205
+    }, {
1206
+    -32,   2,  47,  42,  -7,  -5, -21,  18,  -9,  12,
1207
+      5,   5,  -2,  -8,  10,   4,  14,  42,  38, -10,
1208
+    -33, -49,  -5, -24,  33,  12,  17,  35, -52,  -6,
1209
+    -38, -22,  -7,  72,  -7,  -3,   0,  -6, -25, -30,
1210
+    }, {
1211
+     -2, -11,  36,  -9, -13, -17, -21,   6,   5,  45,
1212
+     10,  36,  18, -33, -19, -19,  31,  44,  27,  15,
1213
+     16, -34,  11, -22,  22,   4,  40,   7, -21,   0,
1214
+     -1, -35, -36,  18,  10,  24,  46,  12, -34,  -8,
1215
+    }, {
1216
+    -71,   9,  59,  29,   8, -30, -26,  11, -30,  16,
1217
+     -8,  44,   9, -14,  -5,  -2,  19,  40,  38,  15,
1218
+      7, -50,  17, -38,   7,  14,  24,  43, -22,   6,
1219
+    -22, -19, -17,  34,   2,  20,  23,  10, -39, -16,
1220
+    }, {
1221
+     -8,  -6,  33,   4,  -7, -44, -18,  21,  23,  48,
1222
+     46, -24,  -9, -40,  -3,  -1,  32,  13,  11, -43,
1223
+     -7, -14,  -3, -15,  26,  -3,  21, -26, -50,  -8,
1224
+      0, -16, -27,  34, -25, -23,  43, -17,   6,  -1,
1225
+    }, {
1226
+    -77,  13,  56,  43,  13, -57, -23,  26, -11,  19,
1227
+     27, -16, -17, -22,  10,  15,  19,  10,  22, -43,
1228
+    -16, -30,   2, -31,  11,   6,   5,   9, -52,  -2,
1229
+    -20,   0,  -8,  50, -33, -27,  19, -19,   1,  -9,
1230
+    }, {
1231
+    -47,   0,  45,  -7,   7, -69, -23,  13,   2,  51,
1232
+     32,  14,   3, -47, -19,  -8,  37,  11,  10, -16,
1233
+     32, -15,  19, -29,   0,  -1,  28, -18, -20,   4,
1234
+     16, -13, -38,  -3, -15,   0,  66,   0,  -7,  13,
1235
+    }, {
1236
+   -116,  20,  68,  30,  28, -83, -28,  18, -32,  22,
1237
+     13,  21,  -5, -28,  -5,   7,  24,   8,  22, -17,
1238
+     23, -30,  25, -45, -15,   9,  11,  18, -22,  10,
1239
+     -4,   2, -19,  12, -23,  -3,  43,  -2, -12,   4,
1240
+    }, {
1241
+     72, -13, -29, -18,   4,  90,  37, -34,   4,  -1,
1242
+     13,  -9,  -6,  11,   2,  24, -13,   3,  -7, -11,
1243
+     -4,   4, -42,  25,  31,  -1,  -8, -29,  -6,  17,
1244
+    -19,   2, -10,  -6,  38,  22, -42, -19,  -6, -11,
1245
+    }, {
1246
+      3,   7,  -6,  20,  25,  77,  32, -29, -31, -30,
1247
+     -4,  -2, -14,  29,  16,  40, -26,   0,   3, -12,
1248
+    -13, -10, -36,   9,  15,   8, -24,   6,  -7,  22,
1249
+    -40,  17,   8,   9,  31,  18, -66, -22, -11, -19,
1250
+    }, {
1251
+     32,  -6, -17, -31,  19,  65,  33, -41, -16,   1,
1252
+      0,  29,   6,   4, -13,  17,  -9,   1,  -8,  14,
1253
+     35,   3, -19,  11,   4,   0,  -1, -21,  23,  30,
1254
+     -3,   5, -20, -44,  48,  46, -19,  -3, -20,   3,
1255
+    }, {
1256
+    -36,  13,   5,   7,  40,  51,  28, -36, -52, -27,
1257
+    -18,  36,  -2,  22,   0,  33, -21,  -2,   3,  13,
1258
+     26, -11, -14,  -4, -10,  10, -18,  14,  22,  36,
1259
+    -24,  21,  -1, -28,  40,  42, -42,  -5, -25,  -5,
1260
+    }, {
1261
+     27,  -1, -20, -17,  24,  38,  35, -26,   1,   4,
1262
+     35, -32, -21,  -3,   2,  35,  -8, -29, -24, -44,
1263
+     12,  24, -34,  18,   8,  -7, -21, -55,  -5,  21,
1264
+     -2,  23, -11, -28,  13,  -1, -22, -33,  21,  10,
1265
+    }, {
1266
+    -41,  18,   2,  21,  45,  24,  30, -21, -33, -24,
1267
+     17, -24, -29,  15,  16,  51, -21, -33, -13, -45,
1268
+      3,   8, -28,   2,  -7,   2, -37, -19,  -7,  27,
1269
+    -22,  39,   7, -12,   5,  -5, -45, -35,  15,   1,
1270
+    }, {
1271
+    -12,   4,  -8, -29,  39,  12,  30, -33, -19,   8,
1272
+     21,   6,  -8,  -9, -13,  28,  -4, -31, -24, -18,
1273
+     52,  23, -12,   4, -18,  -5, -14, -47,  24,  34,
1274
+     14,  27, -22, -66,  22,  22,   1, -16,   6,  24,
1275
+    }, {
1276
+    -81,  25,  14,   8,  61,   0,  25, -28, -54, -20,
1277
+      3,  14, -17,   8,   0,  44, -16, -35, -13, -18,
1278
+     43,   7,  -6, -11, -33,   4, -30, -11,  22,  40,
1279
+     -6,  43,  -3, -50,  14,  18, -22, -18,   1,  16,
1280
+    }, {
1281
+     77,  -2, -11,   1,  -7,  47,  52,  -5,  29,  33,
1282
+      1, -28,   0, -15,  28,  26,   2,  30,   0,   2,
1283
+    -22,   4, -33,  -3,  36, -21,   3, -15,  -2,   5,
1284
+     -4,   4,   6,   9,  37,  31,  -5, -32, -20, -30,
1285
+    }, {
1286
+      8,  17,  10,  40,  13,  34,  47,   0,  -5,   4,
1287
+    -16, -21,  -8,   2,  42,  43, -10,  26,  10,   2,
1288
+    -31, -11, -27, -19,  21, -10, -12,  20,  -3,  11,
1289
+    -25,  20,  25,  25,  29,  28, -28, -34, -25, -38,
1290
+    }, {
1291
+     37,   3,   0, -10,   7,  22,  48, -12,   8,  36,
1292
+    -12,   9,  12, -22,  12,  19,   6,  28,   0,  29,
1293
+     18,   3, -11, -17,  10, -18,  10,  -7,  27,  18,
1294
+     11,   7,  -3, -28,  47,  55,  18, -15, -34, -16,
1295
+    }, {
1296
+    -31,  24,  23,  27,  29,   9,  43,  -8, -26,   7,
1297
+    -30,  17,   4,  -3,  26,  35,  -5,  24,  10,  28,
1298
+      9, -12,  -5, -33,  -5,  -8,  -5,  29,  26,  24,
1299
+     -9,  23,  14, -12,  39,  52,  -5, -18, -39, -24,
1300
+    }, {
1301
+     32,   8,  -3,   2,  13,  -4,  50,   1,  27,  39,
1302
+     23, -51, -15, -30,  27,  37,   7,  -1, -17, -29,
1303
+     -5,  23, -25, -10,  14, -26,  -8, -41,  -1,   9,
1304
+     13,  26,   5, -12,  12,   7,  14, -45,   6,  -9,
1305
+    }, {
1306
+    -36,  29,  19,  41,  34, -18,  45,   6,  -8,  10,
1307
+      5, -43, -23, -11,  42,  53,  -5,  -5,  -6, -30,
1308
+    -14,   8, -20, -26,  -1, -16, -25,  -4,  -3,  15,
1309
+     -7,  41,  23,   3,   4,   3,  -8, -48,   1, -17,
1310
+    }, {
1311
+     -7,  15,   9,  -9,  28, -29,  45,  -5,   6,  43,
1312
+      9, -12,  -2, -36,  12,  30,  11,  -3, -17,  -3,
1313
+     34,  22,  -3, -24, -12, -24,  -2, -32,  28,  22,
1314
+     29,  29,  -5, -50,  21,  31,  38, -29,  -7,   5,
1315
+    }, {
1316
+    -76,  35,  31,  28,  49, -43,  40,   0, -29,  14,
1317
+     -8,  -5, -10, -18,  26,  46,   0,  -7,  -6,  -3,
1318
+     25,   7,   2, -40, -28, -14, -18,   3,  27,  28,
1319
+      8,  45,  13, -34,  13,  27,  15, -31, -12,  -3,
1320
+    }, {
1321
+     74, -17,   0, -31, -18,  73,  -5,   0,   3,  -5,
1322
+     25,  12,  -3,  -1, -22,   3,  -9,  33, -12, -24,
1323
+      6,   2, -33,   9,  21,   5,  20, -27, -19,  -7,
1324
+    -34, -37, -34,  22,  44,   0, -41, -29, -17, -21,
1325
+    }, {
1326
+      5,   3,  21,   7,   2,  60, -10,   5, -32, -34,
1327
+      7,  20, -11,  16,  -8,  20, -21,  29,  -1, -24,
1328
+     -2, -13, -27,  -6,   5,  15,   3,   8, -21,  -1,
1329
+    -55, -21, -15,  38,  37,  -3, -65, -32, -23, -30,
1330
+    }, {
1331
+     35, -10,  11, -44,  -3,  48, -10,  -6, -17,  -2,
1332
+     11,  51,   8,  -8, -38,  -3,  -4,  31, -12,   2,
1333
+     46,   1, -10,  -4,  -5,   7,  26, -19,  10,   5,
1334
+    -18, -34, -45, -15,  54,  24, -18, -13, -31,  -7,
1335
+    }, {
1336
+    -33,  10,  34,  -5,  17,  35, -15,  -1, -53, -30,
1337
+     -6,  59,   0,  10, -24,  13, -17,  27,  -1,   1,
1338
+     37, -13,  -4, -20, -20,  18,  10,  16,   8,  11,
1339
+    -39, -18, -26,   0,  46,  20, -41, -15, -37, -15,
1340
+    }, {
1341
+     29,  -5,   7, -30,   1,  21,  -7,   7,   0,   0,
1342
+     47,  -9, -18, -15, -22,  14,  -4,   0, -28, -57,
1343
+     23,  21, -25,   2,  -1,   0,   7, -53, -19,  -3,
1344
+    -17, -15, -36,   0,  19, -24, -21, -43,   9,   0,
1345
+    }, {
1346
+    -39,  14,  30,   8,  22,   8, -12,  12, -34, -27,
1347
+     29,  -2, -26,   2,  -8,  31, -16,  -3, -17, -57,
1348
+     14,   6, -19, -13, -16,  10,  -8, -17, -20,   2,
1349
+    -38,   0, -17,  16,  11, -27, -44, -45,   4,  -8,
1350
+    }, {
1351
+     -9,   1,  20, -43,  17,  -3, -12,   0, -20,   4,
1352
+     33,  29,  -6, -22, -38,   7,   0,  -1, -29, -30,
1353
+     63,  21,  -3, -11, -27,   1,  14, -45,  10,   9,
1354
+     -1, -12, -47, -37,  28,   0,   2, -26,  -4,  13,
1355
+    }, {
1356
+    -78,  21,  43,  -4,  38, -17, -17,   5, -55, -24,
1357
+     15,  36, -14,  -4, -24,  24, -12,  -5, -17, -31,
1358
+     54,   5,   2, -27, -43,  12,  -2,  -9,   9,  15,
1359
+    -22,   3, -28, -21,  20,  -3, -20, -28,  -9,   5,
1360
+    }, {
1361
+     80,  -6,  16, -11, -30,  30,   9,  28,  28,  29,
1362
+     13,  -6,   2, -28,   3,   5,   7,  60,  -5,  -9,
1363
+    -11,   1, -24, -19,  27, -13,  32, -13, -15, -19,
1364
+    -19, -35, -17,  39,  43,   9,  -4, -42, -32, -41,
1365
+    }, {
1366
+     11,  14,  39,  27,  -9,  17,   4,  33,  -6,   0,
1367
+     -4,   1,  -5, -10,  17,  22,  -5,  57,   5,  -9,
1368
+    -20, -13, -18, -35,  11,  -3,  16,  22, -17, -13,
1369
+    -40, -19,   1,  55,  35,   5, -27, -44, -37, -49,
1370
+    }, {
1371
+     40,   0,  28, -24, -14,   5,   4,  21,   7,  33,
1372
+      0,  32,  15, -35, -12,  -1,  11,  58,  -5,  16,
1373
+     28,   0,  -1, -33,   0, -11,  39,  -5,  14,  -6,
1374
+     -3, -31, -28,   1,  53,  33,  19, -25, -46, -26,
1375
+    }, {
1376
+    -28,  20,  51,  14,   6,  -7,   0,  26, -27,   4,
1377
+    -18,  40,   6, -16,   1,  15,   0,  55,   5,  16,
1378
+     19, -14,   3, -49, -14,  -1,  22,  30,  12,   0,
1379
+    -24, -15,  -9,  17,  45,  29,  -4, -28, -51, -35,
1380
+    }, {
1381
+     34,   4,  25, -10,  -9, -21,   7,  36,  26,  36,
1382
+     35, -28, -12, -42,   3,  16,  12,  28, -21, -42,
1383
+      5,  21, -16, -26,   4, -19,  19, -39, -15, -15,
1384
+     -1, -13, -19,  17,  17, -14,  15, -55,  -4, -19,
1385
+    }, {
1386
+    -34,  25,  48,  28,  11, -34,   2,  41,  -9,   7,
1387
+     17, -21, -20, -24,  17,  33,   0,  24, -10, -42,
1388
+     -3,   5, -10, -42, -11,  -8,   3,  -3, -16,  -9,
1389
+    -22,   2,   0,  33,  10, -18,  -7, -58, -10, -28,
1390
+    }, {
1391
+     -4,  11,  37, -23,   5, -46,   2,  29,   5,  39,
1392
+     21,   9,   0, -49, -12,   9,  16,  26, -22, -15,
1393
+     45,  20,   5, -40, -22, -17,  26, -31,  14,  -2,
1394
+     14, -10, -30, -20,  27,   9,  39, -39, -18,  -5,
1395
+    }, {
1396
+    -73,  32,  60,  15,  26, -59,  -2,  33, -30,  10,
1397
+      3,  17,  -8, -30,   1,  26,   4,  22, -10, -16,
1398
+     36,   5,  11, -56, -37,  -6,  10,   5,  13,   3,
1399
+     -6,   5, -11,  -4,  19,   5,  16, -41, -24, -13
1400
+    }
1401
+};
65 1402
 
66
-    avctx->sample_fmt = SAMPLE_FMT_S16;
67
-    return 0;
68
-}
1403
+const uint16_t cb1_base[128]={
1404
+    19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671,
1405
+    20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411,
1406
+    20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387,
1407
+    21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852,
1408
+    19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086,
1409
+    21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159,
1410
+    19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004,
1411
+    21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781,
1412
+    19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556,
1413
+    18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770,
1414
+    17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138,
1415
+    16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675,
1416
+    20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477,
1417
+    19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389,
1418
+    17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363,
1419
+    16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657,
1420
+};
69 1421
 
70
-/**
71
- * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
72
- * odd way to make the output identical to the binary decoder.
73
- */
74
-static int t_sqrt(unsigned int x)
75
-{
76
-    int s = 2;
77
-    while (x > 0xfff) {
78
-        s++;
79
-        x >>= 2;
80
-    }
1422
+const uint16_t cb2_base[128]={
1423
+    12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053,
1424
+    12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268,
1425
+    11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109,
1426
+    11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405,
1427
+    10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818,
1428
+    10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226,
1429
+    10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053,
1430
+    10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198,
1431
+    14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155,
1432
+    15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446,
1433
+    13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443,
1434
+    12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230,
1435
+    12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449,
1436
+    13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982,
1437
+    12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410,
1438
+    12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174,
1439
+};
81 1440
 
82
-    return ff_sqrt(x << 20) << s;
83
-}
1441
+const int16_t energy_tab[32]={
1442
+        0,    16,    20,    25,    32,    41,    51,    65,
1443
+       81,   103,   129,   163,   205,   259,   326,   410,
1444
+      516,   650,   819,  1031,  1298,  1634,  2057,  2590,
1445
+     3261,  4105,  5168,  6507,  8192, 10313, 12983, 16345
1446
+};
84 1447
 
85
-/**
86
- * Evaluate the LPC filter coefficients from the reflection coefficients.
87
- * Does the inverse of the eval_refl() function.
88
- */
89
-static void eval_coefs(int *coefs, const int *refl)
90
-{
91
-    int buffer[10];
92
-    int *b1 = buffer;
93
-    int *b2 = coefs;
94
-    int i, j;
1448
+static const int16_t lpc_refl_cb1[64]={
1449
+    -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879,
1450
+    -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631,
1451
+    -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268,
1452
+    -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676,
1453
+    -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660,
1454
+    -1508, -1348, -1185,  -994,  -798,  -600,  -374,  -110,
1455
+      152,   447,   720,   982,  1229,  1456,  1682,  1916,
1456
+     2130,  2353,  2595,  2853,  3118,  3363,  3588,  3814
1457
+};
95 1458
 
96
-    for (i=0; i < 10; i++) {
97
-        b1[i] = refl[i] << 4;
1459
+static const int16_t lpc_refl_cb2[32]={
1460
+    -3091, -2386, -1871, -1425, -1021,  -649,  -316,   -20,
1461
+      267,   544,   810,  1065,  1305,  1534,  1756,  1970,
1462
+     2171,  2359,  2536,  2700,  2854,  2996,  3133,  3263,
1463
+     3386,  3499,  3603,  3701,  3789,  3870,  3947,  4020
1464
+};
98 1465
 
99
-        for (j=0; j < i; j++)
100
-            b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j];
1466
+static const int16_t lpc_refl_cb3[32]={
1467
+    -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149,
1468
+    -1979, -1817, -1658, -1498, -1341, -1188, -1032,  -876,
1469
+     -721,  -561,  -394,  -228,   -54,   119,   296,   484,
1470
+      683,   895,  1123,  1373,  1651,  1965,  2360,  2854
1471
+};
101 1472
 
102
-        FFSWAP(int *, b1, b2);
103
-    }
1473
+static const int16_t lpc_refl_cb4[16]={
1474
+    -1845, -1057,  -522,   -77,   301,   647,   975,  1285,
1475
+     1582,  1873,  2163,  2452,  2735,  3017,  3299,  3569
1476
+};
104 1477
 
105
-    for (i=0; i < 10; i++)
106
-        coefs[i] >>= 4;
107
-}
1478
+static const int16_t lpc_refl_cb5[16]={
1479
+    -2691, -2187, -1788, -1435, -1118,  -837,  -571,  -316,
1480
+      -59,   201,   470,   759,  1077,  1457,  1908,  2495
1481
+};
108 1482
 
109
-/**
110
- * Copy the last offset values of *source to *target. If those values are not
111
- * enough to fill the target buffer, fill it with another copy of those values.
112
- */
113
-static void copy_and_dup(int16_t *target, const int16_t *source, int offset)
114
-{
115
-    source += BUFFERSIZE - offset;
1483
+static const int16_t lpc_refl_cb6[8]={
1484
+    -1372,  -474,   133,   632,  1100,  1571,  2075,  2672
1485
+};
116 1486
 
117
-    memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
118
-    if (offset < BLOCKSIZE)
119
-        memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
120
-}
1487
+static const int16_t lpc_refl_cb7[8]={
1488
+    -2389, -1787, -1231,  -717,  -239,   234,   770,  1474
1489
+};
121 1490
 
122
-/** inverse root mean square */
123
-static int irms(const int16_t *data)
124
-{
125
-    unsigned int i, sum = 0;
1491
+static const int16_t lpc_refl_cb8[8]={
1492
+    -1569,  -864,  -296,   200,   670,  1151,  1709,  2385
1493
+};
126 1494
 
127
-    for (i=0; i < BLOCKSIZE; i++)
128
-        sum += data[i] * data[i];
1495
+static const int16_t lpc_refl_cb9[8]={
1496
+    -2200, -1608, -1062,  -569,  -120,   338,   863,  1621
1497
+};
129 1498
 
130
-    if (sum == 0)
131
-        return 0; /* OOPS - division by zero */
1499
+static const int16_t lpc_refl_cb10[4]={
1500
+     -617,   190,   802,  1483
1501
+};
132 1502
 
133
-    return 0x20000000 / (t_sqrt(sum) >> 8);
134
-}
1503
+const int16_t * const lpc_refl_cb[10]={
1504
+    lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5,
1505
+    lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10
1506
+};
135 1507
 
136
-static void add_wav(int16_t *dest, int n, int skip_first, int *m,
137
-                    const int16_t *s1, const int8_t *s2, const int8_t *s3)
1508
+void add_wav(int16_t *dest, int n, int skip_first, int *m, const int16_t *s1,
1509
+             const int8_t *s2, const int8_t *s3)
138 1510
 {
139 1511
     int i;
140 1512
     int v[3];
... ...
@@ -152,86 +1521,26 @@ static void add_wav(int16_t *dest, int n, int skip_first, int *m,
152 152
     }
153 153
 }
154 154
 
155
-static unsigned int rescale_rms(unsigned int rms, unsigned int energy)
156
-{
157
-    return (rms * energy) >> 10;
158
-}
159
-
160
-static unsigned int rms(const int *data)
161
-{
162
-    int i;
163
-    unsigned int res = 0x10000;
164
-    int b = 10;
165
-
166
-    for (i=0; i < 10; i++) {
167
-        res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
168
-
169
-        if (res == 0)
170
-            return 0;
171
-
172
-        while (res <= 0x3fff) {
173
-            b++;
174
-            res <<= 2;
175
-        }
176
-    }
177
-
178
-    return t_sqrt(res) >> b;
179
-}
180
-
181
-static void do_output_subblock(RA144Context *ractx, const uint16_t  *lpc_coefs,
182
-                               int gval, GetBitContext *gb)
183
-{
184
-    uint16_t buffer_a[40];
185
-    uint16_t *block;
186
-    int cba_idx = get_bits(gb, 7); // index of the adaptive CB, 0 if none
187
-    int gain    = get_bits(gb, 8);
188
-    int cb1_idx = get_bits(gb, 7);
189
-    int cb2_idx = get_bits(gb, 7);
190
-    int m[3];
191
-
192
-    if (cba_idx) {
193
-        cba_idx += BLOCKSIZE/2 - 1;
194
-        copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx);
195
-        m[0] = (irms(buffer_a) * gval) >> 12;
196
-    } else {
197
-        m[0] = 0;
198
-    }
199
-
200
-    m[1] = (cb1_base[cb1_idx] * gval) >> 8;
201
-    m[2] = (cb2_base[cb2_idx] * gval) >> 8;
202
-
203
-    memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
204
-            (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
205
-
206
-    block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
207
-
208
-    add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL,
209
-            cb1_vects[cb1_idx], cb2_vects[cb2_idx]);
210
-
211
-    memcpy(ractx->curr_sblock, ractx->curr_sblock + 40,
212
-           10*sizeof(*ractx->curr_sblock));
213
-
214
-    if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs,
215
-                                    block, BLOCKSIZE, 10, 1, 0xfff))
216
-        memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock));
217
-}
218
-
219
-static void int_to_int16(int16_t *out, const int *inp)
155
+/**
156
+ * Copy the last offset values of *source to *target. If those values are not
157
+ * enough to fill the target buffer, fill it with another copy of those values.
158
+ */
159
+void copy_and_dup(int16_t *target, const int16_t *source, int offset)
220 160
 {
221
-    int i;
161
+    source += BUFFERSIZE - offset;
222 162
 
223
-    for (i=0; i < 10; i++)
224
-        *out++ = *inp++;
163
+    memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
164
+    if (offset < BLOCKSIZE)
165
+        memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
225 166
 }
226 167
 
227 168
 /**
228 169
  * Evaluate the reflection coefficients from the filter coefficients.
229
- * Does the inverse of the eval_coefs() function.
230 170
  *
231 171
  * @return 1 if one of the reflection coefficients is greater than
232 172
  *         4095, 0 if not.
233 173
  */
234
-static int eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
174
+int eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
235 175
 {
236 176
     int b, i, j;
237 177
     int buffer1[10];
... ...
@@ -268,8 +1577,75 @@ static int eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
268 268
     return 0;
269 269
 }
270 270
 
271
-static int interp(RA144Context *ractx, int16_t *out, int a,
272
-                  int copyold, int energy)
271
+/**
272
+ * Evaluate the LPC filter coefficients from the reflection coefficients.
273
+ * Does the inverse of the eval_refl() function.
274
+ */
275
+void eval_coefs(int *coefs, const int *refl)
276
+{
277
+    int buffer[10];
278
+    int *b1 = buffer;
279
+    int *b2 = coefs;
280
+    int i, j;
281
+
282
+    for (i=0; i < 10; i++) {
283
+        b1[i] = refl[i] << 4;
284
+
285
+        for (j=0; j < i; j++)
286
+            b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j];
287
+
288
+        FFSWAP(int *, b1, b2);
289
+    }
290
+
291
+    for (i=0; i < 10; i++)
292
+        coefs[i] >>= 4;
293
+}
294
+
295
+void int_to_int16(int16_t *out, const int *inp)
296
+{
297
+    int i;
298
+
299
+    for (i=0; i < 10; i++)
300
+        *out++ = *inp++;
301
+}
302
+
303
+/**
304
+ * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
305
+ * odd way to make the output identical to the binary decoder.
306
+ */
307
+int t_sqrt(unsigned int x)
308
+{
309
+    int s = 2;
310
+    while (x > 0xfff) {
311
+        s++;
312
+        x >>= 2;
313
+    }
314
+
315
+    return ff_sqrt(x << 20) << s;
316
+}
317
+
318
+unsigned int rms(const int *data)
319
+{
320
+    int i;
321
+    unsigned int res = 0x10000;
322
+    int b = 10;
323
+
324
+    for (i=0; i < 10; i++) {
325
+        res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
326
+
327
+        if (res == 0)
328
+            return 0;
329
+
330
+        while (res <= 0x3fff) {
331
+            b++;
332
+            res <<= 2;
333
+        }
334
+    }
335
+
336
+    return t_sqrt(res) >> b;
337
+}
338
+
339
+int interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy)
273 340
 {
274 341
     int work[10];
275 342
     int b = NBLOCKS - a;
... ...
@@ -290,75 +1666,21 @@ static int interp(RA144Context *ractx, int16_t *out, int a,
290 290
     }
291 291
 }
292 292
 
293
-/** Uncompress one block (20 bytes -> 160*2 bytes). */
294
-static int ra144_decode_frame(AVCodecContext * avctx, void *vdata,
295
-                              int *data_size, AVPacket *avpkt)
293
+unsigned int rescale_rms(unsigned int rms, unsigned int energy)
296 294
 {
297
-    const uint8_t *buf = avpkt->data;
298
-    int buf_size = avpkt->size;
299
-    static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
300
-    unsigned int refl_rms[4];    // RMS of the reflection coefficients
301
-    uint16_t block_coefs[4][10]; // LPC coefficients of each sub-block
302
-    unsigned int lpc_refl[10];   // LPC reflection coefficients of the frame
303
-    int i, j;
304
-    int16_t *data = vdata;
305
-    unsigned int energy;
306
-
307
-    RA144Context *ractx = avctx->priv_data;
308
-    GetBitContext gb;
309
-
310
-    if (*data_size < 2*160)
311
-        return -1;
312
-
313
-    if(buf_size < 20) {
314
-        av_log(avctx, AV_LOG_ERROR,
315
-               "Frame too small (%d bytes). Truncated file?\n", buf_size);
316
-        *data_size = 0;
317
-        return buf_size;
318
-    }
319
-    init_get_bits(&gb, buf, 20 * 8);
320
-
321
-    for (i=0; i<10; i++)
322
-        lpc_refl[i] = lpc_refl_cb[i][get_bits(&gb, sizes[i])];
323
-
324
-    eval_coefs(ractx->lpc_coef[0], lpc_refl);
325
-    ractx->lpc_refl_rms[0] = rms(lpc_refl);
326
-
327
-    energy = energy_tab[get_bits(&gb, 5)];
328
-
329
-    refl_rms[0] = interp(ractx, block_coefs[0], 1, 1, ractx->old_energy);
330
-    refl_rms[1] = interp(ractx, block_coefs[1], 2, energy <= ractx->old_energy,
331
-                    t_sqrt(energy*ractx->old_energy) >> 12);
332
-    refl_rms[2] = interp(ractx, block_coefs[2], 3, 0, energy);
333
-    refl_rms[3] = rescale_rms(ractx->lpc_refl_rms[0], energy);
334
-
335
-    int_to_int16(block_coefs[3], ractx->lpc_coef[0]);
336
-
337
-    for (i=0; i < 4; i++) {
338
-        do_output_subblock(ractx, block_coefs[i], refl_rms[i], &gb);
295
+    return (rms * energy) >> 10;
296
+}
339 297
 
340
-        for (j=0; j < BLOCKSIZE; j++)
341
-            *data++ = av_clip_int16(ractx->curr_sblock[j + 10] << 2);
342
-    }
298
+/** inverse root mean square */
299
+int irms(const int16_t *data)
300
+{
301
+    unsigned int i, sum = 0;
343 302
 
344
-    ractx->old_energy = energy;
345
-    ractx->lpc_refl_rms[1] = ractx->lpc_refl_rms[0];
303
+    for (i=0; i < BLOCKSIZE; i++)
304
+        sum += data[i] * data[i];
346 305
 
347
-    FFSWAP(unsigned int *, ractx->lpc_coef[0], ractx->lpc_coef[1]);
306
+    if (sum == 0)
307
+        return 0; /* OOPS - division by zero */
348 308
 
349
-    *data_size = 2*160;
350
-    return 20;
309
+    return 0x20000000 / (t_sqrt(sum) >> 8);
351 310
 }
352
-
353
-AVCodec ra_144_decoder =
354
-{
355
-    "real_144",
356
-    AVMEDIA_TYPE_AUDIO,
357
-    CODEC_ID_RA_144,
358
-    sizeof(RA144Context),
359
-    ra144_decode_init,
360
-    NULL,
361
-    NULL,
362
-    ra144_decode_frame,
363
-    .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),
364
-};
... ...
@@ -24,1483 +24,50 @@
24 24
 
25 25
 #include <stdint.h>
26 26
 
27
-static const int16_t gain_val_tab[256][3] = {
28
-    { 541, 956,  768}, { 877, 581,  568}, { 675,1574,  635}, {1248,1464,  668},
29
-    {1246, 839, 1394}, {2560,1386,  991}, { 925, 687,  608}, {2208, 797, 1144},
30
-    { 535, 832,  799}, { 762, 605, 1154}, { 832,1122, 1003}, {1180, 687, 1176},
31
-    {1292, 901,  732}, {1656, 689,  896}, {1750,1248,  848}, {2284, 942, 1022},
32
-    { 824,1472,  643}, { 517, 765,  512}, { 562,1816, 1522}, { 694,1826, 2700},
33
-    { 704, 524,  672}, {1442, 757, 2232}, { 884, 551, 1266}, {2232,1007, 1692},
34
-    { 932, 746,  777}, {1132, 822,  926}, {1226, 771,  611}, {2948,1342, 1008},
35
-    {1302, 594, 1158}, {1602, 636, 1128}, {3408, 910, 1438}, {1996, 614,  575},
36
-    { 665, 935,  628}, { 631,1192,  829}, { 644, 926, 1052}, { 879, 988, 1226},
37
-    { 941,2768, 2772}, { 565,1344, 2304}, { 547, 628,  740}, { 639, 532, 1074},
38
-    { 955,1208,  598}, {1124,1160,  900}, {1206, 899, 1242}, { 746, 533,  624},
39
-    {1458,1028,  735}, {1706,1102,  692}, {1898,1018, 1004}, {2176, 988,  735},
40
-    {1578, 782, 1642}, { 897, 516,  754}, {2068, 702, 1656}, {2344, 818, 1526},
41
-    { 907, 652,  592}, {1056, 652,  642}, {2124,1416,  780}, {2664,1250,  727},
42
-    {1894, 727, 1108}, {2196, 657,  981}, {4840, 920, 1704}, {4992,1238,  983},
43
-    {2420, 909, 1094}, {2760, 935, 1032}, {2800, 612,  853}, {3068, 832,  574},
44
-    { 523,1796,  923}, { 722,1916, 1382}, {1226,1542,  928}, { 758, 757,  584},
45
-    { 512,1134,  577}, { 615,1276,  698}, { 574,2568, 2356}, { 993,2728, 3512},
46
-    { 539, 890,  913}, { 694, 928, 1088}, { 805, 600, 1360}, {2160, 951, 3128},
47
-    { 816, 950,  590}, { 955, 847,  811}, {1094, 883,  556}, {1304, 888,  604},
48
-    { 863,1170,  855}, {1023, 997, 1032}, { 932,1228, 1280}, { 627, 564,  573},
49
-    { 876, 900, 1448}, {1030, 857, 1792}, {1294, 953, 1758}, {1612, 854, 1714},
50
-    {1090,1166,  631}, {1314,1202,  751}, {1480, 905,  795}, {1682,1016,  568},
51
-    {1494,1178,  983}, { 878, 613,  526}, {1728,1446,  779}, {2136,1348,  774},
52
-    { 950, 649,  939}, {1180, 703,  899}, {1236, 527, 1158}, {1450, 647,  972},
53
-    {1282, 647,  707}, {1460, 663,  644}, {1614, 572,  578}, {3516,1222,  821},
54
-    {2668, 729, 1682}, {3128, 585, 1502}, {3208, 733,  976}, {6800, 871, 1416},
55
-    {3480, 743, 1408}, {3764, 899, 1170}, {3772, 632,  875}, {4092, 732,  638},
56
-    {3112, 753, 2620}, {3372, 945, 1890}, {3768, 969, 2288}, {2016, 559,  854},
57
-    {1736, 729,  787}, {1940, 686,  547}, {2140, 635,  674}, {4480,1272,  828},
58
-    {3976, 592, 1666}, {4384, 621, 1388}, {4400, 801,  955}, {4656, 522,  646},
59
-    {4848, 625, 1636}, {4984, 591,  874}, {5352, 535, 1001}, {11216,938, 1184},
60
-    { 925,3280, 1476}, { 735,1580, 1088}, {1150,1576,  674}, { 655, 783,  528},
61
-    { 527,2052, 1354}, { 782,1704, 1880}, { 578, 910, 1026}, { 692, 882, 1468},
62
-    { 586, 683,  715}, { 739, 609,  717}, { 778, 773,  697}, { 922, 785,  813},
63
-    { 766, 651,  984}, { 978, 596, 1030}, {1070, 757, 1080}, {1324, 687, 1178},
64
-    {1108,2144,  979}, { 723, 982,  690}, { 936, 956,  527}, {1180,1002,  547},
65
-    { 517,1306,  825}, { 832,1184,  974}, {1024, 957,  903}, {1262,1090,  906},
66
-    {1028, 720,  649}, {1192, 679,  694}, {2468,1480,  979}, {2844,1370,  877},
67
-    {1310, 835,  848}, {1508, 839,  698}, {1742,1030,  769}, {1910, 852,  573},
68
-    {1280, 859, 1174}, {1584, 863, 1108}, {1686, 708, 1364}, {1942, 768, 1104},
69
-    { 891, 536,  690}, {1016, 560,  663}, {2172, 870, 1348}, {2404, 999, 1170},
70
-    {1890, 966,  889}, {2116, 912,  777}, {2296,1020,  714}, {4872,1844,  932},
71
-    {2392, 778,  929}, {2604, 772,  744}, {2764, 957,  722}, {5832,1532,  984},
72
-    {2188, 519, 1264}, {2332, 532,  922}, {5064, 995, 2412}, {2708, 571,  874},
73
-    {2408, 545,  666}, {5016,1084,  875}, {5376, 983, 1196}, {5536, 979,  730},
74
-    {5344, 634, 1744}, {5688, 706, 1348}, {5912, 977, 1190}, {6072, 905,  763},
75
-    {6048, 582, 1526}, {11968,1013,1816}, {12864,937, 1900}, {12560,1086, 998},
76
-    {1998, 684, 1884}, {2504, 633, 1992}, {1252, 567,  835}, {1478, 571,  973},
77
-    {2620, 769, 1414}, {2808, 952, 1142}, {2908, 712, 1028}, {2976, 686,  741},
78
-    {1462, 552,  714}, {3296, 991, 1452}, {1590, 615,  544}, {3480,1150,  824},
79
-    {3212, 832,  923}, {3276, 839,  531}, {3548, 786,  852}, {3732, 764,  570},
80
-    {5728, 906, 2616}, {6272, 804, 2252}, {3096, 535,  876}, {3228, 598,  649},
81
-    {6536, 759, 1436}, {6648, 993,  846}, {6864, 567, 1210},{14016,1012, 1302},
82
-    {3408, 548, 1098}, {7160,1008, 1742}, {7136,1000, 1182}, {7480,1032,  836},
83
-    {7448, 612, 1552}, {7744, 614,  816}, {8384, 777, 1438}, {8784, 694,  786},
84
-    { 882,1508, 1068}, { 597, 837,  766}, {1270, 954, 1408}, { 803, 550,  798},
85
-    {1398,1308,  798}, {1848,1534,  738}, { 970, 675,  608}, {1264, 706,  684},
86
-    {1716, 767, 1126}, {2108, 765, 1404}, {2236, 924, 1003}, {2472,1048,  611},
87
-    { 999, 942,  963}, {1094, 857,  935}, {2936, 926, 1138}, {1934, 746,  551},
88
-    {3336, 633, 1762}, {3764, 701, 1454}, {1890, 564,  636}, {4096,1126,  793},
89
-    {3936, 556, 1140}, {3936, 540,  740}, {4216, 764,  874}, {8480,1328, 1014},
90
-    {2184, 515, 1042}, {4432, 934, 1344}, {4784, 945, 1112}, {5016,1062,  733},
91
-    {9216,1020, 2028}, {9968, 924, 1188}, {5424, 909, 1206}, {6512, 744, 1086}
92
-};
93
-
94
-static const uint8_t gain_exp_tab[256] = {
95
-   15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14,
96
-   14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13,
97
-   13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13,
98
-   13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13,
99
-   13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12,
100
-   12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12,
101
-   12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13,
102
-   13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14,
103
-   13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
104
-   12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11,
105
-   12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13,
106
-   12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
107
-   12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12,
108
-   13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13,
109
-   11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10,  9, 11, 10,
110
-   12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12
111
-};
112
-
113
-static const int8_t cb1_vects[128][40]={
114
-    {
115
-     38,  -4,  15,  -4,  14, -13,  12, -11,  -2,  -6,
116
-     -6, -11, -45, -16, -11, -13,  -7,   6, -12,   4,
117
-    -20,   3, -16,  12,  -1,  12,  46,  24,   0,  33,
118
-     -3,   9, -12, -12,  -8,  -7,  17,  -6,   0,  -2,
119
-    }, {
120
-     60, -16,   3, -22,  10, -32,   0, -28, -17, -18,
121
-     -3, -25, -37, -23, -10,   3,   2,   3,   0,   3,
122
-    -14,   0, -14,  -1,   0,   2,  32,   9,  -1,  25,
123
-      7,  13,  -5,  13,   8,   1,   2,   8, -10,   6,
124
-    }, {
125
-     27, -12,  28,  -2,   6,  -7,  15,   9, -11,   1,
126
-    -13, -11, -40,   4, -29, -14, -19,  -5, -23,  -8,
127
-    -30, -13, -17,   0, -14,  12,  34,  20,  -2,  25,
128
-      2, -16,  -4, -12,  15,  16,  29,   7,  24,  10,
129
-    }, {
130
-     49, -24,  16, -20,   2, -26,   2,  -7, -25, -10,
131
-    -11, -25, -32,  -3, -27,   2,  -8,  -8, -11,  -9,
132
-    -24, -17, -16, -14, -13,   2,  20,   5,  -4,  17,
133
-     14, -12,   3,  13,  33,  25,  14,  23,  15,  19,
134
-    }, {
135
-     46,  -6,  21,   8,  -2, -16,  -5,  -8, -11,   4,
136
-      8,  15, -24,   4,  -2, -26,  -3, -16, -16, -14,
137
-     -9,  -2,  -1,   4,  19,   7,  36,  17,   9,  13,
138
-      0,  31,  -5, -12,   7,  -8,  11, -15, -13,  -4,
139
-    }, {
140
-     68, -18,   9,  -9,  -6, -35, -18, -25, -26,  -7,
141
-     10,   1, -16,  -3,  -1,  -9,   6, -19,  -4, -15,
142
-     -4,  -6,   0,  -8,  20,  -2,  23,   2,   7,   5,
143
-     12,  35,   1,  13,  24,   0,  -3,   0, -22,   4,
144
-    }, {
145
-     35, -14,  34,  10, -10, -10,  -1,  12, -20,  12,
146
-      0,  15, -18,  24, -20, -27, -14, -28, -27, -27,
147
-    -20, -19,  -2,  -8,   5,   7,  25,  13,   5,   5,
148
-      6,   5,   2, -12,  31,  15,  23,  -1,  12,   8,
149
-    }, {
150
-     57, -26,  22,  -7, -14, -28, -14,  -3, -35,   0,
151
-      3,   1, -11,  16, -18, -10,  -4, -31, -15, -28,
152
-    -14, -23,  -1, -21,   7,  -2,  11,  -1,   3,  -1,
153
-     18,   9,  10,  13,  49,  24,   8,  14,   2,  16,
154
-    }, {
155
-     25,  15,  22,  11,  18,   4,  15, -22,   8,  -2,
156
-    -17,  -9, -48, -20, -30, -17, -16,  11,  -1,  16,
157
-      2,  10,  -5,  26,  -2,  -4,  22,   0,   2,  10,
158
-     -6,  13, -14,  10, -23,   0,  10,  -2,   1,   0,
159
-    }, {
160
-     47,   3,  11,  -6,  15, -13,   2, -38,  -6, -13,
161
-    -15, -22, -40, -28, -28,   0,  -5,   8,  10,  15,
162
-      7,   7,  -4,  13,  -1, -14,   9, -14,   0,   2,
163
-      4,  18,  -7,  36,  -6,   8,  -3,  13,  -7,   8,
164
-    }, {
165
-     14,   7,  36,  13,  10,  10,  18,   0,   0,   5,
166
-    -25,  -8, -43,   0, -48, -18, -27,   0, -12,   3,
167
-     -7,  -6,  -7,  13, -15,  -5,  11,  -3,   0,   2,
168
-      0, -12,  -6,  10,   0,  23,  22,  11,  26,  12,
169
-    }, {
170
-     36,  -5,  24,  -4,   7,  -7,   6, -17, -14,  -5,
171
-    -22, -22, -35,  -8, -46,  -1, -17,  -3,   0,   2,
172
-     -2, -10,  -5,   0, -14, -15,  -2, -18,  -2,  -4,
173
-     11,  -7,   1,  36,  18,  32,   7,  27,  17,  20,
174
-    }, {
175
-     33,  13,  29,  24,   1,   1,  -2, -18,   0,   9,
176
-     -3,  17, -27,   0, -21, -30, -12, -11,  -5,  -2,
177
-     12,   4,   9,  19,  18,  -9,  13,  -6,  11,  -8,
178
-     -2,  35,  -8,  10,  -7,  -1,   4, -11, -10,  -2,
179
-    }, {
180
-     55,   1,  17,   6,  -1, -16, -15, -35, -15,  -2,
181
-      0,   4, -19,  -8, -20, -13,  -1, -14,   7,  -3,
182
-     18,   0,  10,   5,  19, -19,   0, -21,   8, -16,
183
-      9,  39,   0,  36,  10,   7,  -9,   4, -20,   5,
184
-    }, {
185
-     22,   5,  42,  26,  -6,   8,   1,   2,  -9,  17,
186
-    -10,  18, -21,  19, -39, -31, -23, -23, -16, -15,
187
-      2, -12,   7,   6,   5,  -9,   1, -10,   7, -16,
188
-      4,   9,   0,  10,  17,  22,  16,   2,  14,   9,
189
-    }, {
190
-     44,  -6,  30,   8,  -9, -10, -11, -14, -23,   5,
191
-     -8,   4, -14,  12, -37, -14, -12, -26,  -4, -16,
192
-      8, -16,   9,  -7,   6, -19, -12, -25,   5, -24,
193
-     15,  13,   8,  36,  34,  31,   1,  18,   4,  18,
194
-    }, {
195
-     -3,  -5,  -9,  -7,  15,  -1,   5,  13,   2,  12,
196
-      5,   2, -21, -23,  -2, -16,   0,   5,  -6,  13,
197
-    -23,   3, -32,  10, -15,   8,  44,  28,   9,  37,
198
-     -2,  13,  -9, -15, -12, -27,  -7, -12,   0, -11,
199
-    }, {
200
-     18, -17, -21, -25,  11, -19,  -6,  -3, -11,   0,
201
-      7, -11, -13, -31,  -1,   0,   9,   1,   5,  12,
202
-    -18,   0, -31,  -2, -13,  -1,  30,  14,   7,  29,
203
-      9,  18,  -1,  10,   4, -18, -22,   3, -10,  -2,
204
-    }, {
205
-    -13, -13,   3,  -5,   7,   4,   9,  34,  -5,  20,
206
-     -2,   3, -16,  -3, -20, -17, -11,  -7, -17,   0,
207
-    -34, -13, -33,  -2, -28,   8,  32,  24,   5,  29,
208
-      3, -12,   0, -15,  11,  -3,   3,   2,  24,   1,
209
-    }, {
210
-      8, -25,  -8, -23,   3, -13,  -3,  17, -20,   8,
211
-      0, -10,  -8, -11, -18,   0,  -1, -10,  -5,   0,
212
-    -28, -17, -32, -15, -26,  -1,  19,   9,   3,  21,
213
-     15,  -7,   6,   9,  29,   5, -10,  17,  15,   9,
214
-    }, {
215
-      4,  -6,  -3,   5,  -1,  -4, -11,  16,  -6,  23,
216
-     19,  29,   0,  -3,   6, -30,   3, -17, -10,  -5,
217
-    -13,  -2, -17,   3,   5,   3,  35,  21,  17,  17,
218
-      2,  35,  -2, -15,   3, -28, -13, -21, -13, -13,
219
-    }, {
220
-     26, -19, -15, -12,  -5, -22, -24,   0, -21,  12,
221
-     21,  15,   8, -11,   7, -12,  14, -20,   2,  -6,
222
-     -7,  -6, -16,  -9,   6,  -5,  21,   7,  15,  10,
223
-     13,  39,   5,  10,  20, -19, -28,  -5, -22,  -5,
224
-    }, {
225
-     -5, -15,   9,   7,  -9,   2,  -8,  37, -14,  31,
226
-     11,  29,   5,  16, -11, -30,  -7, -29, -21, -18,
227
-    -23, -19, -18,  -9,  -7,   3,  23,  17,  14,   9,
228
-      8,   9,   6, -15,  27,  -4,  -2,  -6,  12,  -1,
229
-    }, {
230
-     16, -27,  -2, -10, -13, -16, -20,  20, -29,  20,
231
-     14,  16,  13,   8,  -9, -13,   2, -33,  -9, -19,
232
-    -17, -23, -17, -22,  -6,  -6,   9,   2,  12,   2,
233
-     20,  13,  13,  10,  45,   4, -16,   8,   2,   7,
234
-    }, {
235
-    -16,  14,  -2,   8,  20,  17,   9,   2,  14,  16,
236
-     -6,   5, -24, -28, -21, -20,  -8,   9,   4,  25,
237
-     -1,  11, -22,  24, -15,  -8,  21,   5,  11,  14,
238
-     -5,  18, -11,   7, -27, -20, -14,  -7,   1,  -9,
239
-    }, {
240
-      6,   2, -14,  -9,  16,  -1,  -3, -14,   0,   5,
241
-     -3,  -8, -16, -36, -19,  -3,   1,   6,  17,  24,
242
-      4,   7, -21,  11, -14, -18,   7,  -9,   9,   7,
243
-      6,  22,  -3,  33, -10, -11, -28,   7,  -7,   0,
244
-    }, {
245
-    -26,   6,  11,  10,  12,  23,  12,  23,   5,  24,
246
-    -13,   5, -19,  -8, -38, -21, -20,  -2,  -6,  12,
247
-    -11,  -5, -23,  11, -29,  -9,   9,   0,   7,   6,
248
-      1,  -7,  -2,   7,  -3,   3,  -2,   6,  27,   3,
249
-    }, {
250
-     -4,  -6,   0,  -7,   8,   4,   0,   6,  -9,  13,
251
-    -11,  -7, -11, -15, -37,  -4,  -9,  -5,   5,  11,
252
-     -5,  -9, -22,  -1, -27, -18,  -4, -14,   5,   0,
253
-     12,  -3,   4,  32,  14,  12, -17,  22,  17,  11,
254
-    }, {
255
-     -8,  12,   3,  21,   3,  14,  -8,   5,   4,  28,
256
-      7,  32,  -2,  -8, -12, -34,  -4, -12,   1,   6,
257
-      9,   4,  -7,  17,   4, -13,  11,  -1,  19,  -4,
258
-      0,  39,  -4,   7, -11, -21, -20, -16, -10, -11,
259
-    }, {
260
-     13,   0,  -8,   3,   0,  -4, -21, -11,  -9,  16,
261
-     10,  18,   5, -16, -10, -16,   5, -15,  13,   5,
262
-     15,   1,  -6,   4,   6, -23,  -2, -16,  17, -12,
263
-     10,  44,   3,  33,   6, -12, -34,  -1, -20,  -3,
264
-    }, {
265
-    -18,   4,  17,  23,  -4,  20,  -4,  26,  -3,  36,
266
-      0,  32,   2,  12, -29, -34, -16, -24, -10,  -6,
267
-      0, -12,  -8,   4,  -8, -13,   0,  -6,  16, -12,
268
-      5,  13,   3,   7,  13,   3,  -8,  -2,  14,   0,
269
-    }, {
270
-      3,  -7,   5,   5,  -8,   2, -17,   9, -18,  24,
271
-      2,  19,  10,   4, -28, -17,  -5, -28,   2,  -7,
272
-      4, -15,  -7,  -8,  -6, -23, -13, -21,  14, -20,
273
-     17,  18,  11,  33,  30,  11, -23,  13,   5,   9,
274
-    }, {
275
-     60,  10,   7,  -1,   9,  -8,   6, -13,   2, -15,
276
-     -1, -10, -13, -11,  15,   0,   6,   9,  -1,   0,
277
-    -13,   1, -11,  -3, -13,  21,  13,  26,  -7,  31,
278
-    -10,  -7, -16, -33, -31, -10,  22,  -8,   1,  -2,
279
-    }, {
280
-     82,  -1,  -4, -19,   6, -27,  -6, -29, -12, -26,
281
-      1, -24,  -5, -18,  17,  17,  17,   6,  10,   0,
282
-     -7,  -2,  -9, -16, -12,  11,   0,  11,  -9,  23,
283
-      0,  -3,  -8,  -8, -13,  -1,   8,   7,  -7,   6,
284
-    }, {
285
-     49,   2,  21,   0,   1,  -2,   9,   8,  -6,  -6,
286
-     -8, -10,  -8,   9,  -2,   0,  -4,  -2, -13, -12,
287
-    -23, -15, -12, -16, -26,  21,   2,  21, -11,  23,
288
-     -4, -33,  -7, -33,  -6,  13,  34,   5,  27,  10,
289
-    }, {
290
-     71, -10,   9, -17,  -1, -20,  -3,  -8, -21, -18,
291
-     -6, -24,   0,   1,   0,  16,   6,  -5,   0, -13,
292
-    -17, -19, -11, -29, -25,  11, -11,   6, -13,  15,
293
-      7, -29,   0,  -8,  11,  22,  20,  21,  17,  18,
294
-    }, {
295
-     67,   8,  14,  11,  -7, -11, -11,  -9,  -7,  -3,
296
-     13,  16,   8,   9,  24, -12,  10, -13,  -5, -17,
297
-     -2,  -4,   3, -10,   6,  17,   4,  19,   0,  11,
298
-     -6,  13,  -9, -33, -14, -10,  16, -17, -10,  -4,
299
-    }, {
300
-     90,  -3,   2,  -6, -10, -29, -24, -26, -21, -15,
301
-     15,   2,  16,   1,  25,   4,  21, -16,   6, -18,
302
-      3,  -8,   5, -24,   8,   7,  -9,   4,  -1,   3,
303
-      5,  18,  -1,  -7,   2,  -1,   2,  -1, -19,   3,
304
-    }, {
305
-     57,   0,  27,  13, -14,  -5,  -7,  11, -15,   4,
306
-      5,  16,  13,  29,   6, -13,   0, -25, -16, -31,
307
-    -12, -22,   2, -23,  -6,  16,  -7,  14,  -2,   3,
308
-      0, -12,   0, -33,   9,  13,  28,  -3,  14,   7,
309
-    }, {
310
-     79, -11,  15,  -4, -18, -23, -20,  -5, -30,  -7,
311
-      7,   2,  21,  21,   8,   3,  10, -28,  -4, -31,
312
-     -6, -25,   3, -37,  -4,   7, -20,   0,  -4,  -4,
313
-     11,  -7,   6,  -8,  27,  22,  14,  12,   5,  16,
314
-    }, {
315
-     47,  30,  15,  14,  14,   9,   9, -23,  13, -10,
316
-    -12,  -7, -16, -15,  -3,  -3,  -1,  14,   9,  12,
317
-      9,   8,   0,  10, -14,   4,  -9,   2,  -5,   8,
318
-    -13,  -3, -18, -10, -45,  -3,  16,  -4,   4,   0,
319
-    }, {
320
-     69,  17,   3,  -3,  10,  -8,  -3, -40,  -1, -21,
321
-    -10, -21,  -8, -23,  -1,  13,   8,  11,  21,  11,
322
-     15,   4,   0,  -2, -13,  -5, -23, -12,  -7,   0,
323
-     -1,   0, -10,  14, -28,   5,   1,  11,  -5,   7,
324
-    }, {
325
-     36,  21,  28,  16,   6,  16,  12,  -2,   4,  -2,
326
-    -20,  -7, -11,   4, -20,  -4, -12,   2,  -1,   0,
327
-      0,  -8,  -2,  -2, -27,   4, -21,  -2,  -9,   0,
328
-     -6, -29,  -9, -10, -21,  21,  28,  10,  29,  11,
329
-    }, {
330
-     58,   9,  16,  -1,   2,  -2,   0, -19, -10, -13,
331
-    -17, -21,  -3,  -3, -19,  12,  -2,   0,  10,  -1,
332
-      5, -12,   0, -15, -26,  -5, -34, -16, -11,  -7,
333
-      4, -25,  -2,  14,  -3,  29,  13,  25,  20,  20,
334
-    }, {
335
-     55,  28,  21,  27,  -2,   7,  -8, -20,   4,   1,
336
-      1,  18,   5,   4,   5, -16,   2,  -8,   5,  -5,
337
-     19,   2,  14,   3,   6,   0, -18,  -4,   2, -11,
338
-     -8,  18, -11, -10, -29,  -3,  10, -13,  -8,  -3,
339
-    }, {
340
-     77,  16,   9,   9,  -6, -11, -21, -37, -10, -10,
341
-      4,   5,  13,  -3,   7,   0,  13, -11,  17,  -6,
342
-     25,  -1,  15,  -9,   7,  -9, -32, -19,   0, -18,
343
-      2,  22,  -3,  15, -12,   5,  -4,   2, -17,   5,
344
-    }, {
345
-     44,  20,  34,  29, -10,  13,  -4,   0,  -4,   9,
346
-     -5,  19,  10,  24, -11, -17,  -8, -20,  -5, -19,
347
-      9, -14,  12,  -9,  -6,   0, -30,  -9,   0, -19,
348
-     -2,  -7,  -2, -10,  -5,  20,  21,   1,  17,   9,
349
-    }, {
350
-     66,   8,  23,  11, -14,  -5, -17, -16, -19,  -2,
351
-     -3,   5,  18,  17, -10,   0,   1, -23,   6, -20,
352
-     15, -18,  14, -22,  -5, -10, -44, -23,  -2, -26,
353
-      9,  -3,   4,  14,  12,  29,   7,  16,   7,  18,
354
-    }, {
355
-     18,   9, -17,  -4,  11,   3,   0,  11,   7,   4,
356
-     10,   3,  10, -18,  24,  -3,  14,   7,   4,  10,
357
-    -16,   1, -27,  -4, -27,  17,  12,  30,   0,  35,
358
-     -9,  -3, -12, -36, -35, -30,  -2, -13,   2, -11,
359
-    }, {
360
-     40,  -2, -29, -22,   7, -14, -12,  -5,  -7,  -7,
361
-     12,  -9,  18, -26,  26,  14,  24,   4,  16,   9,
362
-    -10,  -2, -26, -18, -26,   7,  -1,  15,  -1,  27,
363
-      2,   0,  -4, -11, -17, -21, -16,   1,  -7,  -3,
364
-    }, {
365
-      8,   1,  -3,  -2,   3,  10,   3,  32,  -1,  12,
366
-      2,   4,  15,   1,   7,  -3,   2,  -4,  -6,  -3,
367
-    -26, -15, -29, -17, -40,  17,   0,  26,  -2,  27,
368
-     -2, -29,  -4, -36, -10,  -6,   9,   0,  27,   0,
369
-    }, {
370
-     30, -11, -15, -20,   0,  -8,  -9,  15, -15,   0,
371
-      5,  -9,  23,  -6,   8,  13,  13,  -7,   5,  -3,
372
-    -20, -19, -27, -31, -39,   7, -13,  11,  -4,  19,
373
-      8, -25,   3, -11,   7,   2,  -4,  16,  18,   9,
374
-    }, {
375
-     26,   7, -11,   8,  -5,   1, -17,  14,  -1,  15,
376
-     24,  30,  32,   1,  33, -16,  18, -14,   0,  -8,
377
-     -6,  -4, -12, -12,  -6,  13,   2,  23,   8,  15,
378
-     -4,  17,  -5, -36, -18, -30,  -8, -22, -10, -14,
379
-    }, {
380
-     48,  -4, -23,  -9,  -9, -17, -30,  -2, -16,   3,
381
-     26,  16,  40,  -6,  35,   1,  28, -17,  12,  -9,
382
-      0,  -8, -11, -25,  -5,   3, -10,   8,   6,   7,
383
-      6,  22,   1, -11,  -1, -21, -22,  -7, -19,  -5,
384
-    }, {
385
-     15,   0,   2,  10, -13,   7, -14,  35, -10,  23,
386
-     16,  31,  37,  21,  16, -17,   6, -26, -10, -21,
387
-    -16, -21, -13, -25, -19,  13,  -8,  19,   5,   7,
388
-      1,  -8,   2, -36,   5,  -6,   3,  -8,  15,  -1,
389
-    }, {
390
-     37, -12,  -9,  -7, -17, -11, -26,  18, -25,  12,
391
-     19,  17,  45,  14,  17,   0,  17, -30,   1, -22,
392
-    -10, -25, -12, -38, -18,   3, -22,   4,   3,   0,
393
-     13,  -3,  10, -11,  23,   2, -10,   7,   5,   7,
394
-    }, {
395
-      5,  29,  -9,  11,  15,  22,   3,   0,  18,   8,
396
-     -1,   6,   7, -23,   6,  -6,   5,  12,  15,  21,
397
-      5,   8, -17,   9, -28,   0, -11,   6,   2,  12,
398
-    -11,   0, -14, -13, -49, -22,  -8,  -9,   4,  -9,
399
-    }, {
400
-     27,  16, -21,  -6,  12,   3,  -9, -16,   3,  -2,
401
-      1,  -7,  15, -31,   7,  10,  16,   9,  27,  21,
402
-     11,   5, -16,  -3, -26,  -9, -24,  -7,   0,   4,
403
-      0,   4,  -6,  11, -32, -14, -23,   6,  -5,  -1,
404
-    }, {
405
-     -4,  20,   3,  13,   8,  28,   6,  21,  10,  16,
406
-     -8,   7,  12,  -3, -11,  -7,  -5,   0,   4,   8,
407
-     -4,  -8, -18,  -3, -41,   0, -22,   2,   0,   4,
408
-     -5, -25,  -6, -14, -25,   1,   2,   4,  29,   2,
409
-    }, {
410
-     17,   8,  -8,  -4,   4,  10,  -6,   5,  -4,   5,
411
-     -6,  -6,  20, -10,  -9,   9,   4,  -2,  16,   7,
412
-      1, -12, -17, -16, -39,  -9, -36, -12,  -2,  -3,
413
-      6, -21,   1,  11,  -7,  10, -11,  20,  20,  11,
414
-    }, {
415
-     13,  27,  -3,  24,  -1,  19, -14,   3,   9,  20,
416
-     12,  33,  29,  -3,  15, -20,   9,  -9,  11,   3,
417
-     16,   2,  -2,   2,  -7,  -3, -20,   0,  10,  -7,
418
-     -7,  22,  -7, -13, -33, -23, -14, -18,  -7, -12,
419
-    }, {
420
-     35,  15, -15,   6,  -4,   1, -27, -12,  -5,   8,
421
-     15,  19,  37, -11,  16,  -2,  20, -12,  23,   2,
422
-     22,  -1,  -1, -11,  -5, -13, -34, -14,   8, -14,
423
-      4,  26,   0,  11, -16, -14, -29,  -2, -17,  -3,
424
-    }, {
425
-      3,  19,   9,  26,  -8,  26, -10,  24,   0,  28,
426
-      5,  33,  34,  17,  -2, -20,  -1, -22,   0, -10,
427
-      6, -14,  -3, -10, -20,  -4, -32,  -4,   7, -15,
428
-      0,  -3,   0, -13,  -9,   0,  -3,  -4,  17,   0,
429
-    }, {
430
-     25,   7,  -2,   8, -12,   7, -23,   8, -13,  16,
431
-      7,  20,  42,   9,   0,  -3,   9, -25,  12, -10,
432
-     12, -18,  -2, -24, -19, -13, -46, -19,   5, -22,
433
-     10,   0,   8,  11,   8,   9, -17,  11,   7,   8,
434
-    }, {
435
-    -25,  -7,   2,  -8,  12,  -7,  23,  -8,  13, -16,
436
-     -7, -20, -42,  -9,   0,   3,  -9,  25, -12,  10,
437
-    -12,  18,   2,  24,  19,  13,  46,  19,  -5,  22,
438
-    -10,   0,  -8, -11,  -8,  -9,  17, -11,  -7,  -8,
439
-    }, {
440
-     -3, -19,  -9, -26,   8, -26,  10, -24,   0, -28,
441
-     -5, -33, -34, -17,   2,  20,   1,  22,   0,  10,
442
-     -6,  14,   3,  10,  20,   4,  32,   4,  -7,  15,
443
-      0,   3,   0,  13,   9,   0,   3,   4, -17,   0,
444
-    }, {
445
-    -35, -15,  15,  -6,   4,  -1,  27,  12,   5,  -8,
446
-    -15, -19, -37,  11, -16,   2, -20,  12, -23,  -2,
447
-    -22,   1,   1,  11,   5,  13,  34,  14,  -8,  14,
448
-     -4, -26,   0, -11,  16,  14,  29,   2,  17,   3,
449
-    }, {
450
-    -13, -27,   3, -24,   1, -19,  14,  -3,  -9, -20,
451
-    -12, -33, -29,   3, -15,  20,  -9,   9, -11,  -3,
452
-    -16,  -2,   2,  -2,   7,   3,  20,   0, -10,   7,
453
-      7, -22,   7,  13,  33,  23,  14,  18,   7,  12,
454
-    }, {
455
-    -17,  -8,   8,   4,  -4, -10,   6,  -5,   4,  -5,
456
-      6,   6, -20,  10,   9,  -9,  -4,   2, -16,  -7,
457
-     -1,  12,  17,  16,  39,   9,  36,  12,   2,   3,
458
-     -6,  21,  -1, -11,   7, -10,  11, -20, -20, -11,
459
-    }, {
460
-      4, -20,  -3, -13,  -8, -28,  -6, -21, -10, -16,
461
-      8,  -7, -12,   3,  11,   7,   5,   0,  -4,  -8,
462
-      4,   8,  18,   3,  41,   0,  22,  -2,   0,  -4,
463
-      5,  25,   6,  14,  25,  -1,  -2,  -4, -29,  -2,
464
-    }, {
465
-    -27, -16,  21,   6, -12,  -3,   9,  16,  -3,   2,
466
-     -1,   7, -15,  31,  -7, -10, -16,  -9, -27, -21,
467
-    -11,  -5,  16,   3,  26,   9,  24,   7,   0,  -4,
468
-      0,  -4,   6, -11,  32,  14,  23,  -6,   5,   1,
469
-    }, {
470
-     -5, -29,   9, -11, -15, -22,  -3,   0, -18,  -8,
471
-      1,  -6,  -7,  23,  -6,   6,  -5, -12, -15, -21,
472
-     -5,  -8,  17,  -9,  28,   0,  11,  -6,  -2, -12,
473
-     11,   0,  14,  13,  49,  22,   8,   9,  -4,   9,
474
-    }, {
475
-    -37,  12,   9,   7,  17,  11,  26, -18,  25, -12,
476
-    -19, -17, -45, -14, -17,   0, -17,  30,  -1,  22,
477
-     10,  25,  12,  38,  18,  -3,  22,  -4,  -3,   0,
478
-    -13,   3, -10,  11, -23,  -2,  10,  -7,  -5,  -7,
479
-    }, {
480
-    -15,   0,  -2, -10,  13,  -7,  14, -35,  10, -23,
481
-    -16, -31, -37, -21, -16,  17,  -6,  26,  10,  21,
482
-     16,  21,  13,  25,  19, -13,   8, -19,  -5,  -7,
483
-     -1,   8,  -2,  36,  -5,   6,  -3,   8, -15,   1,
484
-    }, {
485
-    -48,   4,  23,   9,   9,  17,  30,   2,  16,  -3,
486
-    -26, -16, -40,   6, -35,  -1, -28,  17, -12,   9,
487
-      0,   8,  11,  25,   5,  -3,  10,  -8,  -6,  -7,
488
-     -6, -22,  -1,  11,   1,  21,  22,   7,  19,   5,
489
-    }, {
490
-    -26,  -7,  11,  -8,   5,  -1,  17, -14,   1, -15,
491
-    -24, -30, -32,  -1, -33,  16, -18,  14,   0,   8,
492
-      6,   4,  12,  12,   6, -13,  -2, -23,  -8, -15,
493
-      4, -17,   5,  36,  18,  30,   8,  22,  10,  14,
494
-    }, {
495
-    -30,  11,  15,  20,   0,   8,   9, -15,  15,   0,
496
-     -5,   9, -23,   6,  -8, -13, -13,   7,  -5,   3,
497
-     20,  19,  27,  31,  39,  -7,  13, -11,   4, -19,
498
-     -8,  25,  -3,  11,  -7,  -2,   4, -16, -18,  -9,
499
-    }, {
500
-     -8,  -1,   3,   2,  -3, -10,  -3, -32,   1, -12,
501
-     -2,  -4, -15,  -1,  -7,   3,  -2,   4,   6,   3,
502
-     26,  15,  29,  17,  40, -17,   0, -26,   2, -27,
503
-      2,  29,   4,  36,  10,   6,  -9,   0, -27,   0,
504
-    }, {
505
-    -40,   2,  29,  22,  -7,  14,  12,   5,   7,   7,
506
-    -12,   9, -18,  26, -26, -14, -24,  -4, -16,  -9,
507
-     10,   2,  26,  18,  26,  -7,   1, -15,   1, -27,
508
-     -2,   0,   4,  11,  17,  21,  16,  -1,   7,   3,
509
-    }, {
510
-    -18,  -9,  17,   4, -11,  -3,   0, -11,  -7,  -4,
511
-    -10,  -3, -10,  18, -24,   3, -14,  -7,  -4, -10,
512
-     16,  -1,  27,   4,  27, -17, -12, -30,   0, -35,
513
-      9,   3,  12,  36,  35,  30,   2,  13,  -2,  11,
514
-    }, {
515
-    -66,  -8, -23, -11,  14,   5,  17,  16,  19,   2,
516
-      3,  -5, -18, -17,  10,   0,  -1,  23,  -6,  20,
517
-    -15,  18, -14,  22,   5,  10,  44,  23,   2,  26,
518
-     -9,   3,  -4, -14, -12, -29,  -7, -16,  -7, -18,
519
-    }, {
520
-    -44, -20, -34, -29,  10, -13,   4,   0,   4,  -9,
521
-      5, -19, -10, -24,  11,  17,   8,  20,   5,  19,
522
-     -9,  14, -12,   9,   6,   0,  30,   9,   0,  19,
523
-      2,   7,   2,  10,   5, -20, -21,  -1, -17,  -9,
524
-    }, {
525
-    -77, -16,  -9,  -9,   6,  11,  21,  37,  10,  10,
526
-     -4,  -5, -13,   3,  -7,   0, -13,  11, -17,   6,
527
-    -25,   1, -15,   9,  -7,   9,  32,  19,   0,  18,
528
-     -2, -22,   3, -15,  12,  -5,   4,  -2,  17,  -5,
529
-    }, {
530
-    -55, -28, -21, -27,   2,  -7,   8,  20,  -4,  -1,
531
-     -1, -18,  -5,  -4,  -5,  16,  -2,   8,  -5,   5,
532
-    -19,  -2, -14,  -3,  -6,   0,  18,   4,  -2,  11,
533
-      8, -18,  11,  10,  29,   3, -10,  13,   8,   3,
534
-    }, {
535
-    -58,  -9, -16,   1,  -2,   2,   0,  19,  10,  13,
536
-     17,  21,   3,   3,  19, -12,   2,   0, -10,   1,
537
-     -5,  12,   0,  15,  26,   5,  34,  16,  11,   7,
538
-     -4,  25,   2, -14,   3, -29, -13, -25, -20, -20,
539
-    }, {
540
-    -36, -21, -28, -16,  -6, -16, -12,   2,  -4,   2,
541
-     20,   7,  11,  -4,  20,   4,  12,  -2,   1,   0,
542
-      0,   8,   2,   2,  27,  -4,  21,   2,   9,   0,
543
-      6,  29,   9,  10,  21, -21, -28, -10, -29, -11,
544
-    }, {
545
-    -69, -17,  -3,   3, -10,   8,   3,  40,   1,  21,
546
-     10,  21,   8,  23,   1, -13,  -8, -11, -21, -11,
547
-    -15,  -4,   0,   2,  13,   5,  23,  12,   7,   0,
548
-      1,   0,  10, -14,  28,  -5,  -1, -11,   5,  -7,
549
-    }, {
550
-    -47, -30, -15, -14, -14,  -9,  -9,  23, -13,  10,
551
-     12,   7,  16,  15,   3,   3,   1, -14,  -9, -12,
552
-     -9,  -8,   0, -10,  14,  -4,   9,  -2,   5,  -8,
553
-     13,   3,  18,  10,  45,   3, -16,   4,  -4,   0,
554
-    }, {
555
-    -79,  11, -15,   4,  18,  23,  20,   5,  30,   7,
556
-     -7,  -2, -21, -21,  -8,  -3, -10,  28,   4,  31,
557
-      6,  25,  -3,  37,   4,  -7,  20,   0,   4,   4,
558
-    -11,   7,  -6,   8, -27, -22, -14, -12,  -5, -16,
559
-    }, {
560
-    -57,   0, -27, -13,  14,   5,   7, -11,  15,  -4,
561
-     -5, -16, -13, -29,  -6,  13,   0,  25,  16,  31,
562
-     12,  22,  -2,  23,   6, -16,   7, -14,   2,  -3,
563
-      0,  12,   0,  33,  -9, -13, -28,   3, -14,  -7,
564
-    }, {
565
-    -90,   3,  -2,   6,  10,  29,  24,  26,  21,  15,
566
-    -15,  -2, -16,  -1, -25,  -4, -21,  16,  -6,  18,
567
-     -3,   8,  -5,  24,  -8,  -7,   9,  -4,   1,  -3,
568
-     -5, -18,   1,   7,  -2,   1,  -2,   1,  19,  -3,
569
-    }, {
570
-    -67,  -8, -14, -11,   7,  11,  11,   9,   7,   3,
571
-    -13, -16,  -8,  -9, -24,  12, -10,  13,   5,  17,
572
-      2,   4,  -3,  10,  -6, -17,  -4, -19,   0, -11,
573
-      6, -13,   9,  33,  14,  10, -16,  17,  10,   4,
574
-    }, {
575
-    -71,  10,  -9,  17,   1,  20,   3,   8,  21,  18,
576
-      6,  24,   0,  -1,   0, -16,  -6,   5,   0,  13,
577
-     17,  19,  11,  29,  25, -11,  11,  -6,  13, -15,
578
-     -7,  29,   0,   8, -11, -22, -20, -21, -17, -18,
579
-    }, {
580
-    -49,  -2, -21,   0,  -1,   2,  -9,  -8,   6,   6,
581
-      8,  10,   8,  -9,   2,   0,   4,   2,  13,  12,
582
-     23,  15,  12,  16,  26, -21,  -2, -21,  11, -23,
583
-      4,  33,   7,  33,   6, -13, -34,  -5, -27, -10,
584
-    }, {
585
-    -82,   1,   4,  19,  -6,  27,   6,  29,  12,  26,
586
-     -1,  24,   5,  18, -17, -17, -17,  -6, -10,   0,
587
-      7,   2,   9,  16,  12, -11,   0, -11,   9, -23,
588
-      0,   3,   8,   8,  13,   1,  -8,  -7,   7,  -6,
589
-    }, {
590
-    -60, -10,  -7,   1,  -9,   8,  -6,  13,  -2,  15,
591
-      1,  10,  13,  11, -15,   0,  -6,  -9,   1,   0,
592
-     13,  -1,  11,   3,  13, -21, -13, -26,   7, -31,
593
-     10,   7,  16,  33,  31,  10, -22,   8,  -1,   2,
594
-    }, {
595
-     -3,   7,  -5,  -5,   8,  -2,  17,  -9,  18, -24,
596
-     -2, -19, -10,  -4,  28,  17,   5,  28,  -2,   7,
597
-     -4,  15,   7,   8,   6,  23,  13,  21, -14,  20,
598
-    -17, -18, -11, -33, -30, -11,  23, -13,  -5,  -9,
599
-    }, {
600
-     18,  -4, -17, -23,   4, -20,   4, -26,   3, -36,
601
-      0, -32,  -2, -12,  29,  34,  16,  24,  10,   6,
602
-      0,  12,   8,  -4,   8,  13,   0,   6, -16,  12,
603
-     -5, -13,  -3,  -7, -13,  -3,   8,   2, -14,   0,
604
-    }, {
605
-    -13,   0,   8,  -3,   0,   4,  21,  11,   9, -16,
606
-    -10, -18,  -5,  16,  10,  16,  -5,  15, -13,  -5,
607
-    -15,  -1,   6,  -4,  -6,  23,   2,  16, -17,  12,
608
-    -10, -44,  -3, -33,  -6,  12,  34,   1,  20,   3,
609
-    }, {
610
-      8, -12,  -3, -21,  -3, -14,   8,  -5,  -4, -28,
611
-     -7, -32,   2,   8,  12,  34,   4,  12,  -1,  -6,
612
-     -9,  -4,   7, -17,  -4,  13, -11,   1, -19,   4,
613
-      0, -39,   4,  -7,  11,  21,  20,  16,  10,  11,
614
-    }, {
615
-      4,   6,   0,   7,  -8,  -4,   0,  -6,   9, -13,
616
-     11,   7,  11,  15,  37,   4,   9,   5,  -5, -11,
617
-      5,   9,  22,   1,  27,  18,   4,  14,  -5,   0,
618
-    -12,   3,  -4, -32, -14, -12,  17, -22, -17, -11,
619
-    }, {
620
-     26,  -6, -11, -10, -12, -23, -12, -23,  -5, -24,
621
-     13,  -5,  19,   8,  38,  21,  20,   2,   6, -12,
622
-     11,   5,  23, -11,  29,   9,  -9,   0,  -7,  -6,
623
-     -1,   7,   2,  -7,   3,  -3,   2,  -6, -27,  -3,
624
-    }, {
625
-     -6,  -2,  14,   9, -16,   1,   3,  14,   0,  -5,
626
-      3,   8,  16,  36,  19,   3,  -1,  -6, -17, -24,
627
-     -4,  -7,  21, -11,  14,  18,  -7,   9,  -9,  -7,
628
-     -6, -22,   3, -33,  10,  11,  28,  -7,   7,   0,
629
-    }, {
630
-     16, -14,   2,  -8, -20, -17,  -9,  -2, -14, -16,
631
-      6,  -5,  24,  28,  21,  20,   8,  -9,  -4, -25,
632
-      1, -11,  22, -24,  15,   8, -21,  -5, -11, -14,
633
-      5, -18,  11,  -7,  27,  20,  14,   7,  -1,   9,
634
-    }, {
635
-    -16,  27,   2,  10,  13,  16,  20, -20,  29, -20,
636
-    -14, -16, -13,  -8,   9,  13,  -2,  33,   9,  19,
637
-     17,  23,  17,  22,   6,   6,  -9,  -2, -12,  -2,
638
-    -20, -13, -13, -10, -45,  -4,  16,  -8,  -2,  -7,
639
-    }, {
640
-      5,  15,  -9,  -7,   9,  -2,   8, -37,  14, -31,
641
-    -11, -29,  -5, -16,  11,  30,   7,  29,  21,  18,
642
-     23,  19,  18,   9,   7,  -3, -23, -17, -14,  -9,
643
-     -8,  -9,  -6,  15, -27,   4,   2,   6, -12,   1,
644
-    }, {
645
-    -26,  19,  15,  12,   5,  22,  24,   0,  21, -12,
646
-    -21, -15,  -8,  11,  -7,  12, -14,  20,  -2,   6,
647
-      7,   6,  16,   9,  -6,   5, -21,  -7, -15, -10,
648
-    -13, -39,  -5, -10, -20,  19,  28,   5,  22,   5,
649
-    }, {
650
-     -4,   6,   3,  -5,   1,   4,  11, -16,   6, -23,
651
-    -19, -29,   0,   3,  -6,  30,  -3,  17,  10,   5,
652
-     13,   2,  17,  -3,  -5,  -3, -35, -21, -17, -17,
653
-     -2, -35,   2,  15,  -3,  28,  13,  21,  13,  13,
654
-    }, {
655
-     -8,  25,   8,  23,  -3,  13,   3, -17,  20,  -8,
656
-      0,  10,   8,  11,  18,   0,   1,  10,   5,   0,
657
-     28,  17,  32,  15,  26,   1, -19,  -9,  -3, -21,
658
-    -15,   7,  -6,  -9, -29,  -5,  10, -17, -15,  -9,
659
-    }, {
660
-     13,  13,  -3,   5,  -7,  -4,  -9, -34,   5, -20,
661
-      2,  -3,  16,   3,  20,  17,  11,   7,  17,   0,
662
-     34,  13,  33,   2,  28,  -8, -32, -24,  -5, -29,
663
-     -3,  12,   0,  15, -11,   3,  -3,  -2, -24,  -1,
664
-    }, {
665
-    -18,  17,  21,  25, -11,  19,   6,   3,  11,   0,
666
-     -7,  11,  13,  31,   1,   0,  -9,  -1,  -5, -12,
667
-     18,   0,  31,   2,  13,   1, -30, -14,  -7, -29,
668
-     -9, -18,   1, -10,  -4,  18,  22,  -3,  10,   2,
669
-    }, {
670
-      3,   5,   9,   7, -15,   1,  -5, -13,  -2, -12,
671
-     -5,  -2,  21,  23,   2,  16,   0,  -5,   6, -13,
672
-     23,  -3,  32, -10,  15,  -8, -44, -28,  -9, -37,
673
-      2, -13,   9,  15,  12,  27,   7,  12,   0,  11,
674
-    }, {
675
-    -44,   6, -30,  -8,   9,  10,  11,  14,  23,  -5,
676
-      8,  -4,  14, -12,  37,  14,  12,  26,   4,  16,
677
-     -8,  16,  -9,   7,  -6,  19,  12,  25,  -5,  24,
678
-    -15, -13,  -8, -36, -34, -31,  -1, -18,  -4, -18,
679
-    }, {
680
-    -22,  -5, -42, -26,   6,  -8,  -1,  -2,   9, -17,
681
-     10, -18,  21, -19,  39,  31,  23,  23,  16,  15,
682
-     -2,  12,  -7,  -6,  -5,   9,  -1,  10,  -7,  16,
683
-     -4,  -9,   0, -10, -17, -22, -16,  -2, -14,  -9,
684
-    }, {
685
-    -55,  -1, -17,  -6,   1,  16,  15,  35,  15,   2,
686
-      0,  -4,  19,   8,  20,  13,   1,  14,  -7,   3,
687
-    -18,   0, -10,  -5, -19,  19,   0,  21,  -8,  16,
688
-     -9, -39,   0, -36, -10,  -7,   9,  -4,  20,  -5,
689
-    }, {
690
-    -33, -13, -29, -24,  -1,  -1,   2,  18,   0,  -9,
691
-      3, -17,  27,   0,  21,  30,  12,  11,   5,   2,
692
-    -12,  -4,  -9, -19, -18,   9, -13,   6, -11,   8,
693
-      2, -35,   8, -10,   7,   1,  -4,  11,  10,   2,
694
-    }, {
695
-    -36,   5, -24,   4,  -7,   7,  -6,  17,  14,   5,
696
-     22,  22,  35,   8,  46,   1,  17,   3,   0,  -2,
697
-      2,  10,   5,   0,  14,  15,   2,  18,   2,   4,
698
-    -11,   7,  -1, -36, -18, -32,  -7, -27, -17, -20,
699
-    }, {
700
-    -14,  -7, -36, -13, -10, -10, -18,   0,   0,  -5,
701
-     25,   8,  43,   0,  48,  18,  27,   0,  12,  -3,
702
-      7,   6,   7, -13,  15,   5, -11,   3,   0,  -2,
703
-      0,  12,   6, -10,   0, -23, -22, -11, -26, -12,
704
-    }, {
705
-    -47,  -3, -11,   6, -15,  13,  -2,  38,   6,  13,
706
-     15,  22,  40,  28,  28,   0,   5,  -8, -10, -15,
707
-     -7,  -7,   4, -13,   1,  14,  -9,  14,   0,  -2,
708
-     -4, -18,   7, -36,   6,  -8,   3, -13,   7,  -8,
709
-    }, {
710
-    -25, -15, -22, -11, -18,  -4, -15,  22,  -8,   2,
711
-     17,   9,  48,  20,  30,  17,  16, -11,   1, -16,
712
-     -2, -10,   5, -26,   2,   4, -22,   0,  -2, -10,
713
-      6, -13,  14, -10,  23,   0, -10,   2,  -1,   0,
714
-    }, {
715
-    -57,  26, -22,   7,  14,  28,  14,   3,  35,   0,
716
-     -3,  -1,  11, -16,  18,  10,   4,  31,  15,  28,
717
-     14,  23,   1,  21,  -7,   2, -11,   1,  -3,   1,
718
-    -18,  -9, -10, -13, -49, -24,  -8, -14,  -2, -16,
719
-    }, {
720
-    -35,  14, -34, -10,  10,  10,   1, -12,  20, -12,
721
-      0, -15,  18, -24,  20,  27,  14,  28,  27,  27,
722
-     20,  19,   2,   8,  -5,  -7, -25, -13,  -5,  -5,
723
-     -6,  -5,  -2,  12, -31, -15, -23,   1, -12,  -8,
724
-    }, {
725
-    -68,  18,  -9,   9,   6,  35,  18,  25,  26,   7,
726
-    -10,  -1,  16,   3,   1,   9,  -6,  19,   4,  15,
727
-      4,   6,   0,   8, -20,   2, -23,  -2,  -7,  -5,
728
-    -12, -35,  -1, -13, -24,   0,   3,   0,  22,  -4,
729
-    }, {
730
-    -46,   6, -21,  -8,   2,  16,   5,   8,  11,  -4,
731
-     -8, -15,  24,  -4,   2,  26,   3,  16,  16,  14,
732
-      9,   2,   1,  -4, -19,  -7, -36, -17,  -9, -13,
733
-      0, -31,   5,  12,  -7,   8, -11,  15,  13,   4,
734
-    }, {
735
-    -49,  24, -16,  20,  -2,  26,  -2,   7,  25,  10,
736
-     11,  25,  32,   3,  27,  -2,   8,   8,  11,   9,
737
-     24,  17,  16,  14,  13,  -2, -20,  -5,   4, -17,
738
-    -14,  12,  -3, -13, -33, -25, -14, -23, -15, -19,
739
-    }, {
740
-    -27,  12, -28,   2,  -6,   7, -15,  -9,  11,  -1,
741
-     13,  11,  40,  -4,  29,  14,  19,   5,  23,   8,
742
-     30,  13,  17,   0,  14, -12, -34, -20,   2, -25,
743
-     -2,  16,   4,  12, -15, -16, -29,  -7, -24, -10,
744
-    }, {
745
-    -60,  16,  -3,  22, -10,  32,   0,  28,  17,  18,
746
-      3,  25,  37,  23,  10,  -3,  -2,  -3,   0,  -3,
747
-     14,   0,  14,   1,   0,  -2, -32,  -9,   1, -25,
748
-     -7, -13,   5, -13,  -8,  -1,  -2,  -8,  10,  -6,
749
-    }, {
750
-    -38,   4, -15,   4, -14,  13, -12,  11,   2,   6,
751
-      6,  11,  45,  16,  11,  13,   7,  -6,  12,  -4,
752
-     20,  -3,  16, -12,   1, -12, -46, -24,   0, -33,
753
-      3,  -9,  12,  12,   8,   7, -17,   6,   0,   2
754
-    }
755
-};
756
-
757
-static const int8_t cb2_vects[128][40]={
758
-    {
759
-     73, -32, -60, -15, -26,  59,   2, -33,  30, -10,
760
-     -3, -17,   8,  30,  -1, -26,  -4, -22,  10,  16,
761
-    -36,  -5, -11,  56,  37,   6, -10,  -5, -13,  -3,
762
-      6,  -5,  11,   4, -19,  -5, -16,  41,  24,  13,
763
-    }, {
764
-      4, -11, -37,  23,  -5,  46,  -2, -29,  -5, -39,
765
-    -21,  -9,   0,  49,  12,  -9, -16, -26,  22,  15,
766
-    -45, -20,  -5,  40,  22,  17, -26,  31, -14,   2,
767
-    -14,  10,  30,  20, -27,  -9, -39,  39,  18,   5,
768
-    }, {
769
-     34, -25, -48, -28, -11,  34,  -2, -41,   9,  -7,
770
-    -17,  21,  20,  24, -17, -33,   0, -24,  10,  42,
771
-      3,  -5,  10,  42,  11,   8,  -3,   3,  16,   9,
772
-     22,  -2,   0, -33, -10,  18,   7,  58,  10,  28,
773
-    }, {
774
-    -34,  -4, -25,  10,   9,  21,  -7, -36, -26, -36,
775
-    -35,  28,  12,  42,  -3, -16, -12, -28,  21,  42,
776
-     -5, -21,  16,  26,  -4,  19, -19,  39,  15,  15,
777
-      1,  13,  19, -17, -17,  14, -15,  55,   4,  19,
778
-    }, {
779
-     28, -20, -51, -14,  -6,   7,   0, -26,  27,  -4,
780
-     18, -40,  -6,  16,  -1, -15,   0, -55,  -5, -16,
781
-    -19,  14,  -3,  49,  14,   1, -22, -30, -12,   0,
782
-     24,  15,   9, -17, -45, -29,   4,  28,  51,  35,
783
-    }, {
784
-    -40,   0, -28,  24,  14,  -5,  -4, -21,  -7, -33,
785
-      0, -32, -15,  35,  12,   1, -11, -58,   5, -16,
786
-    -28,   0,   1,  33,   0,  11, -39,   5, -14,   6,
787
-      3,  31,  28,  -1, -53, -33, -19,  25,  46,  26,
788
-    }, {
789
-    -11, -14, -39, -27,   9, -17,  -4, -33,   6,   0,
790
-      4,  -1,   5,  10, -17, -22,   5, -57,  -5,   9,
791
-     20,  13,  18,  35, -11,   3, -16, -22,  17,  13,
792
-     40,  19,  -1, -55, -35,  -5,  27,  44,  37,  49,
793
-    }, {
794
-    -80,   6, -16,  11,  30, -30,  -9, -28, -28, -29,
795
-    -13,   6,  -2,  28,  -3,  -5,  -7, -60,   5,   9,
796
-     11,  -1,  24,  19, -27,  13, -32,  13,  15,  19,
797
-     19,  35,  17, -39, -43,  -9,   4,  42,  32,  41,
798
-    }, {
799
-     78, -21, -43,   4, -38,  17,  17,  -5,  55,  24,
800
-    -15, -36,  14,   4,  24, -24,  12,   5,  17,  31,
801
-    -54,  -5,  -2,  27,  43, -12,   2,   9,  -9, -15,
802
-     22,  -3,  28,  21, -20,   3,  20,  28,   9,  -5,
803
-    }, {
804
-      9,  -1, -20,  43, -17,   3,  12,   0,  20,  -4,
805
-    -33, -29,   6,  22,  38,  -7,   0,   1,  29,  30,
806
-    -63, -21,   3,  11,  27,  -1, -14,  45, -10,  -9,
807
-      1,  12,  47,  37, -28,   0,  -2,  26,   4, -13,
808
-    }, {
809
-     39, -14, -30,  -8, -22,  -8,  12, -12,  34,  27,
810
-    -29,   2,  26,  -2,   8, -31,  16,   3,  17,  57,
811
-    -14,  -6,  19,  13,  16, -10,   8,  17,  20,  -2,
812
-     38,   0,  17, -16, -11,  27,  44,  45,  -4,   8,
813
-    }, {
814
-    -29,   5,  -7,  30,  -1, -21,   7,  -7,   0,   0,
815
-    -47,   9,  18,  15,  22, -14,   4,   0,  28,  57,
816
-    -23, -21,  25,  -2,   1,   0,  -7,  53,  19,   3,
817
-     17,  15,  36,   0, -19,  24,  21,  43,  -9,   0,
818
-    }, {
819
-     33, -10, -34,   5, -17, -35,  15,   1,  53,  30,
820
-      6, -59,   0, -10,  24, -13,  17, -27,   1,  -1,
821
-    -37,  13,   4,  20,  20, -18, -10, -16,  -8, -11,
822
-     39,  18,  26,   0, -46, -20,  41,  15,  37,  15,
823
-    }, {
824
-    -35,  10, -11,  44,   3, -48,  10,   6,  17,   2,
825
-    -11, -51,  -8,   8,  38,   3,   4, -31,  12,  -2,
826
-    -46,  -1,  10,   4,   5,  -7, -26,  19, -10,  -5,
827
-     18,  34,  45,  15, -54, -24,  18,  13,  31,   7,
828
-    }, {
829
-     -5,  -3, -21,  -7,  -2, -60,  10,  -5,  32,  34,
830
-     -7, -20,  11, -16,   8, -20,  21, -29,   1,  24,
831
-      2,  13,  27,   6,  -5, -15,  -3,  -8,  21,   1,
832
-     55,  21,  15, -38, -37,   3,  65,  32,  23,  30,
833
-    }, {
834
-    -74,  17,   0,  31,  18, -73,   5,   0,  -3,   5,
835
-    -25, -12,   3,   1,  22,  -3,   9, -33,  12,  24,
836
-     -6,  -2,  33,  -9, -21,  -5, -20,  27,  19,   7,
837
-     34,  37,  34, -22, -44,   0,  41,  29,  17,  21,
838
-    }, {
839
-     76, -35, -31, -28, -49,  43, -40,   0,  29, -14,
840
-      8,   5,  10,  18, -26, -46,   0,   7,   6,   3,
841
-    -25,  -7,  -2,  40,  28,  14,  18,  -3, -27, -28,
842
-     -8, -45, -13,  34, -13, -27, -15,  31,  12,   3,
843
-    }, {
844
-      7, -15,  -9,   9, -28,  29, -45,   5,  -6, -43,
845
-     -9,  12,   2,  36, -12, -30, -11,   3,  17,   3,
846
-    -34, -22,   3,  24,  12,  24,   2,  32, -28, -22,
847
-    -29, -29,   5,  50, -21, -31, -38,  29,   7,  -5,
848
-    }, {
849
-     36, -29, -19, -41, -34,  18, -45,  -6,   8, -10,
850
-     -5,  43,  23,  11, -42, -53,   5,   5,   6,  30,
851
-     14,  -8,  20,  26,   1,  16,  25,   4,   3, -15,
852
-      7, -41, -23,  -3,  -4,  -3,   8,  48,  -1,  17,
853
-    }, {
854
-    -32,  -8,   3,  -2, -13,   4, -50,  -1, -27, -39,
855
-    -23,  51,  15,  30, -27, -37,  -7,   1,  17,  29,
856
-      5, -23,  25,  10, -14,  26,   8,  41,   1,  -9,
857
-    -13, -26,  -5,  12, -12,  -7, -14,  45,  -6,   9,
858
-    }, {
859
-     31, -24, -23, -27, -29,  -9, -43,   8,  26,  -7,
860
-     30, -17,  -4,   3, -26, -35,   5, -24, -10, -28,
861
-     -9,  12,   5,  33,   5,   8,   5, -29, -26, -24,
862
-      9, -23, -14,  12, -39, -52,   5,  18,  39,  24,
863
-    }, {
864
-    -37,  -3,   0,  10,  -7, -22, -48,  12,  -8, -36,
865
-     12,  -9, -12,  22, -12, -19,  -6, -28,   0, -29,
866
-    -18,  -3,  11,  17, -10,  18, -10,   7, -27, -18,
867
-    -11,  -7,   3,  28, -47, -55, -18,  15,  34,  16,
868
-    }, {
869
-     -8, -17, -10, -40, -13, -34, -47,   0,   5,  -4,
870
-     16,  21,   8,  -2, -42, -43,  10, -26, -10,  -2,
871
-     31,  11,  27,  19, -21,  10,  12, -20,   3, -11,
872
-     25, -20, -25, -25, -29, -28,  28,  34,  25,  38,
873
-    }, {
874
-    -77,   2,  11,  -1,   7, -47, -52,   5, -29, -33,
875
-     -1,  28,   0,  15, -28, -26,  -2, -30,   0,  -2,
876
-     22,  -4,  33,   3, -36,  21,  -3,  15,   2,  -5,
877
-      4,  -4,  -6,  -9, -37, -31,   5,  32,  20,  30,
878
-    }, {
879
-     81, -25, -14,  -8, -61,   0, -25,  28,  54,  20,
880
-     -3, -14,  17,  -8,   0, -44,  16,  35,  13,  18,
881
-    -43,  -7,   6,  11,  33,  -4,  30,  11, -22, -40,
882
-      6, -43,   3,  50, -14, -18,  22,  18,  -1, -16,
883
-    }, {
884
-     12,  -4,   8,  29, -39, -12, -30,  33,  19,  -8,
885
-    -21,  -6,   8,   9,  13, -28,   4,  31,  24,  18,
886
-    -52, -23,  12,  -4,  18,   5,  14,  47, -24, -34,
887
-    -14, -27,  22,  66, -22, -22,  -1,  16,  -6, -24,
888
-    }, {
889
-     41, -18,  -2, -21, -45, -24, -30,  21,  33,  24,
890
-    -17,  24,  29, -15, -16, -51,  21,  33,  13,  45,
891
-     -3,  -8,  28,  -2,   7,  -2,  37,  19,   7, -27,
892
-     22, -39,  -7,  12,  -5,   5,  45,  35, -15,  -1,
893
-    }, {
894
-    -27,   1,  20,  17, -24, -38, -35,  26,  -1,  -4,
895
-    -35,  32,  21,   3,  -2, -35,   8,  29,  24,  44,
896
-    -12, -24,  34, -18,  -8,   7,  21,  55,   5, -21,
897
-      2, -23,  11,  28, -13,   1,  22,  33, -21, -10,
898
-    }, {
899
-     36, -13,  -5,  -7, -40, -51, -28,  36,  52,  27,
900
-     18, -36,   2, -22,   0, -33,  21,   2,  -3, -13,
901
-    -26,  11,  14,   4,  10, -10,  18, -14, -22, -36,
902
-     24, -21,   1,  28, -40, -42,  42,   5,  25,   5,
903
-    }, {
904
-    -32,   6,  17,  31, -19, -65, -33,  41,  16,  -1,
905
-      0, -29,  -6,  -4,  13, -17,   9,  -1,   8, -14,
906
-    -35,  -3,  19, -11,  -4,   0,   1,  21, -23, -30,
907
-      3,  -5,  20,  44, -48, -46,  19,   3,  20,  -3,
908
-    }, {
909
-     -3,  -7,   6, -20, -25, -77, -32,  29,  31,  30,
910
-      4,   2,  14, -29, -16, -40,  26,   0,  -3,  12,
911
-     13,  10,  36,  -9, -15,  -8,  24,  -6,   7, -22,
912
-     40, -17,  -8,  -9, -31, -18,  66,  22,  11,  19,
913
-    }, {
914
-    -72,  13,  29,  18,  -4, -90, -37,  34,  -4,   1,
915
-    -13,   9,   6, -11,  -2, -24,  13,  -3,   7,  11,
916
-      4,  -4,  42, -25, -31,   1,   8,  29,   6, -17,
917
-     19,  -2,  10,   6, -38, -22,  42,  19,   6,  11,
918
-    }, {
919
-    116, -20, -68, -30, -28,  83,  28, -18,  32, -22,
920
-    -13, -21,   5,  28,   5,  -7, -24,  -8, -22,  17,
921
-    -23,  30, -25,  45,  15,  -9, -11, -18,  22, -10,
922
-      4,  -2,  19, -12,  23,   3, -43,   2,  12,  -4,
923
-    }, {
924
-     47,   0, -45,   7,  -7,  69,  23, -13,  -2, -51,
925
-    -32, -14,  -3,  47,  19,   8, -37, -11, -10,  16,
926
-    -32,  15, -19,  29,   0,   1, -28,  18,  20,  -4,
927
-    -16,  13,  38,   3,  15,   0, -66,   0,   7, -13,
928
-    }, {
929
-     77, -13, -56, -43, -13,  57,  23, -26,  11, -19,
930
-    -27,  16,  17,  22, -10, -15, -19, -10, -22,  43,
931
-     16,  30,  -2,  31, -11,  -6,  -5,  -9,  52,   2,
932
-     20,   0,   8, -50,  33,  27, -19,  19,  -1,   9,
933
-    }, {
934
-      8,   6, -33,  -4,   7,  44,  18, -21, -23, -48,
935
-    -46,  24,   9,  40,   3,   1, -32, -13, -11,  43,
936
-      7,  14,   3,  15, -26,   3, -21,  26,  50,   8,
937
-      0,  16,  27, -34,  25,  23, -43,  17,  -6,   1,
938
-    }, {
939
-     71,  -9, -59, -29,  -8,  30,  26, -11,  30, -16,
940
-      8, -44,  -9,  14,   5,   2, -19, -40, -38, -15,
941
-     -7,  50, -17,  38,  -7, -14, -24, -43,  22,  -6,
942
-     22,  19,  17, -34,  -2, -20, -23, -10,  39,  16,
943
-    }, {
944
-      2,  11, -36,   9,  13,  17,  21,  -6,  -5, -45,
945
-    -10, -36, -18,  33,  19,  19, -31, -44, -27, -15,
946
-    -16,  34, -11,  22, -22,  -4, -40,  -7,  21,   0,
947
-      1,  35,  36, -18, -10, -24, -46, -12,  34,   8,
948
-    }, {
949
-     32,  -2, -47, -42,   7,   5,  21, -18,   9, -12,
950
-     -5,  -5,   2,   8, -10,  -4, -14, -42, -38,  10,
951
-     33,  49,   5,  24, -33, -12, -17, -35,  52,   6,
952
-     38,  22,   7, -72,   7,   3,   0,   6,  25,  30,
953
-    }, {
954
-    -36,  18, -24,  -3,  28,  -7,  16, -13, -26, -41,
955
-    -24,   1,  -5,  26,   3,  12, -27, -46, -27,  10,
956
-     24,  34,  10,   8, -49,  -2, -34,   0,  51,  12,
957
-     17,  38,  25, -56,   0,   0, -22,   3,  20,  22,
958
-    }, {
959
-    121,  -9, -50, -10, -40,  40,  43,   9,  58,  12,
960
-    -25, -41,  11,   2,  31,  -5,  -8,  19, -15,  32,
961
-    -41,  30, -16,  16,  20, -28,   0,  -3,  26, -22,
962
-     19,   0,  36,   4,  22,  12,  -6,  -9,  -1, -24,
963
-    }, {
964
-     52,  10, -27,  27, -18,  26,  38,  14,  23, -16,
965
-    -44, -33,   3,  20,  45,  10, -20,  15,  -3,  31,
966
-    -50,  14, -10,   0,   5, -17, -15,  32,  24, -16,
967
-     -1,  15,  55,  20,  14,   8, -29, -12,  -7, -32,
968
-    }, {
969
-     82,  -3, -38, -23, -24,  15,  38,   2,  37,  15,
970
-    -39,  -2,  23,  -4,  15, -12,  -3,  17, -15,  58,
971
-     -1,  29,   6,   2,  -5, -26,   7,   4,  56,  -9,
972
-     35,   3,  25, -33,  32,  36,  17,   7, -15,  -9,
973
-    }, {
974
-     13,  17, -15,  15,  -3,   1,  33,   7,   1, -12,
975
-    -58,   5,  15,  13,  29,   3, -16,  13,  -4,  57,
976
-    -10,  13,  11, -13, -21, -15,  -9,  40,  55,  -3,
977
-     14,  19,  44, -17,  24,  32,  -5,   4, -21, -18,
978
-    }, {
979
-     76,   1, -41,  -9, -19, -12,  41,  17,  55,  18,
980
-     -3, -63,  -3, -12,  30,   5,  -3, -12, -31,   0,
981
-    -24,  49,  -8,   9,  -1, -33, -12, -29,  27, -18,
982
-     37,  21,  34, -17,  -3, -11,  14, -23,  25,  -2,
983
-    }, {
984
-      7,  22, -18,  29,   1, -25,  36,  21,  20,  -9,
985
-    -22, -56, -11,   6,  45,  21, -15, -16, -20,  -1,
986
-    -33,  34,  -2,  -6, -17, -23, -28,   6,  25, -12,
987
-     16,  37,  53,  -1, -11, -15,  -8, -25,  20, -11,
988
-    }, {
989
-     37,   8, -29, -22,  -4, -37,  36,   9,  34,  22,
990
-    -17, -24,   8, -18,  15,  -2,   1, -14, -31,  25,
991
-     15,  48,  13,  -4, -28, -31,  -5, -21,  57,  -4,
992
-     53,  24,  23, -55,   6,  12,  37,  -6,  11,  11,
993
-    }, {
994
-    -31,  28,  -6,  16,  16, -50,  31,  14,   0,  -6,
995
-    -36, -17,   0,   0,  29,  14, -11, -18, -20,  25,
996
-      6,  33,  19, -20, -43, -21, -21,  14,  55,   0,
997
-     32,  40,  42, -39,  -1,   8,  14,  -8,   6,   3,
998
-    }, {
999
-    119, -24, -39, -44, -51,  66, -14,  15,  31, -26,
1000
-     -1,   0,   7,  16, -19, -28, -19,  22, -26,   4,
1001
-    -13,  28, -16,  29,   5,  -1,  16, -16,   8, -35,
1002
-    -10, -42,  -4,  17,  29, -19, -42,  -7,   0, -15,
1003
-    }, {
1004
-     50,  -3, -16,  -5, -30,  53, -19,  20,  -3, -55,
1005
-    -19,   8,   0,  34,  -5, -11, -32,  18, -15,   4,
1006
-    -22,  13, -10,  13,  -9,   8,   0,  19,   7, -29,
1007
-    -31, -26,  13,  33,  21, -22, -65,  -9,  -4, -23,
1008
-    }, {
1009
-     79, -17, -27, -56, -36,  41, -19,   8,  10, -22,
1010
-    -15,  39,  20,   9, -35, -35, -15,  20, -26,  31,
1011
-     26,  27,   6,  15, -20,   0,  23,  -8,  38, -22,
1012
-      5, -38, -15, -20,  39,   4, -18,   9, -13,  -1,
1013
-    }, {
1014
-     10,   3,  -4, -18, -15,  27, -24,  13, -24, -51,
1015
-    -34,  47,  12,  28, -21, -19, -27,  16, -15,  30,
1016
-     17,  12,  12,   0, -36,  10,   7,  27,  37, -16,
1017
-    -15, -22,   3,  -4,  31,   1, -42,   7, -18,  -9,
1018
-    }, {
1019
-     74, -12, -30, -42, -30,  14, -16,  23,  29, -19,
1020
-     20, -21,  -7,   1, -19, -17, -14, -10, -43, -27,
1021
-      3,  48,  -8,  22, -16,  -7,   4, -42,   9, -31,
1022
-      6, -20,  -6,  -4,   3, -43, -22, -20,  28,   5,
1023
-    }, {
1024
-      5,   7,  -7,  -4,  -9,   0, -21,  28,  -6, -48,
1025
-      2, -14, -15,  20,  -5,   0, -27, -14, -32, -28,
1026
-     -5,  32,  -2,   6, -32,   3, -12,  -5,   8, -25,
1027
-    -14,  -4,  12,  11,  -4, -47, -45, -22,  22,  -2,
1028
-    }, {
1029
-     34,  -6, -18, -55, -15, -11, -21,  16,   8, -16,
1030
-      6,  16,   5,  -4, -35, -24, -10, -12, -43,  -1,
1031
-     43,  47,  14,   8, -43,  -5,  10, -34,  39, -18,
1032
-     22, -16, -17, -42,  13, -19,   1,  -3,  14,  20,
1033
-    }, {
1034
-    -34,  14,   4, -17,   5, -24, -26,  20, -27, -45,
1035
-    -12,  24,  -2,  13, -21,  -8, -22, -16, -32,  -2,
1036
-     34,  31,  20,  -7, -58,   5,  -5,   2,  38, -12,
1037
-      2,  -1,   1, -26,   5, -23, -21,  -6,   8,  11,
1038
-    }, {
1039
-    124, -13, -21, -23, -62,  23,   0,  43,  57,   8,
1040
-    -13, -18,  14, -10,   6, -26,  -3,  49, -19,  19,
1041
-    -31,  27,  -7,   0,  11, -20,  29,  -1,  12, -47,
1042
-      4, -39,  11,  34,  28,  -9,  -5, -19, -13, -34,
1043
-    }, {
1044
-     55,   6,   1,  14, -41,  10,  -4,  48,  22, -20,
1045
-    -31, -10,   5,   7,  20,  -9, -16,  45,  -8,  19,
1046
-    -40,  12,  -1, -15,  -4, -10,  12,  34,  11, -41,
1047
-    -16, -24,  30,  49,  20, -13, -28, -22, -18, -43,
1048
-    }, {
1049
-     84,  -6,  -9, -36, -47,  -1,  -4,  36,  36,  12,
1050
-    -27,  20,  26, -17,  -9, -33,   1,  47, -19,  46,
1051
-      9,  27,  15, -13, -15, -18,  35,   6,  42, -33,
1052
-     20, -36,   1,  -4,  38,  14,  18,  -2, -27, -20,
1053
-    }, {
1054
-     15,  13,  13,   1, -26, -14,  -9,  41,   1, -16,
1055
-    -46,  27,  18,   1,   4, -16, -11,  43,  -8,  45,
1056
-      0,  11,  21, -29, -30,  -8,  19,  42,  41, -28,
1057
-      0, -20,  20,  11,  30,  10,  -4,  -5, -32, -28,
1058
-    }, {
1059
-     79,  -2, -12, -22, -42, -28,  -1,  51,  54,  15,
1060
-      8, -41,   0, -24,   6, -15,   1,  17, -36, -12,
1061
-    -14,  47,   0,  -6, -11, -26,  16, -27,  13, -43,
1062
-     22, -18,  10,  12,   2, -34,  15, -33,  13, -13,
1063
-    }, {
1064
-     10,  18,  10,  15, -21, -41,  -6,  56,  19, -13,
1065
-     -9, -33,  -9,  -6,  20,   1, -11,  13, -24, -13,
1066
-    -23,  32,   6, -22, -26, -15,   0,   8,  12, -37,
1067
-      1,  -2,  28,  27,  -5, -37,  -7, -35,   8, -21,
1068
-    }, {
1069
-     39,   4,   0, -35, -27, -53,  -6,  44,  33,  18,
1070
-     -5,  -2,  11, -31,  -9, -22,   6,  15, -36,  13,
1071
-     25,  46,  23, -20, -37, -24,  23, -19,  43, -29,
1072
-     38, -14,   0, -26,  12, -10,  38, -16,   0,   0,
1073
-    }, {
1074
-    -29,  25,  22,   2,  -6, -67, -11,  49,  -1, -10,
1075
-    -24,   5,   3, -13,   4,  -5,  -6,  11, -25,  12,
1076
-     16,  31,  28, -36, -53, -13,   6,  16,  42, -24,
1077
-     17,   1,  18, -10,   4, -13,  15, -18,  -5,  -7,
1078
-    }, {
1079
-     29, -25, -22,  -2,   6,  67,  11, -49,   1,  10,
1080
-     24,  -5,  -3,  13,  -4,   5,   6, -11,  25, -12,
1081
-    -16, -31, -28,  36,  53,  13,  -6, -16, -42,  24,
1082
-    -17,  -1, -18,  10,  -4,  13, -15,  18,   5,   7,
1083
-    }, {
1084
-    -39,  -4,   0,  35,  27,  53,   6, -44, -33, -18,
1085
-      5,   2, -11,  31,   9,  22,  -6, -15,  36, -13,
1086
-    -25, -46, -23,  20,  37,  24, -23,  19, -43,  29,
1087
-    -38,  14,   0,  26, -12,  10, -38,  16,   0,   0,
1088
-    }, {
1089
-    -10, -18, -10, -15,  21,  41,   6, -56, -19,  13,
1090
-      9,  33,   9,   6, -20,  -1,  11, -13,  24,  13,
1091
-     23, -32,  -6,  22,  26,  15,   0,  -8, -12,  37,
1092
-     -1,   2, -28, -27,   5,  37,   7,  35,  -8,  21,
1093
-    }, {
1094
-    -79,   2,  12,  22,  42,  28,   1, -51, -54, -15,
1095
-     -8,  41,   0,  24,  -6,  15,  -1, -17,  36,  12,
1096
-     14, -47,   0,   6,  11,  26, -16,  27, -13,  43,
1097
-    -22,  18, -10, -12,  -2,  34, -15,  33, -13,  13,
1098
-    }, {
1099
-    -15, -13, -13,  -1,  26,  14,   9, -41,  -1,  16,
1100
-     46, -27, -18,  -1,  -4,  16,  11, -43,   8, -45,
1101
-      0, -11, -21,  29,  30,   8, -19, -42, -41,  28,
1102
-      0,  20, -20, -11, -30, -10,   4,   5,  32,  28,
1103
-    }, {
1104
-    -84,   6,   9,  36,  47,   1,   4, -36, -36, -12,
1105
-     27, -20, -26,  17,   9,  33,  -1, -47,  19, -46,
1106
-     -9, -27, -15,  13,  15,  18, -35,  -6, -42,  33,
1107
-    -20,  36,  -1,   4, -38, -14, -18,   2,  27,  20,
1108
-    }, {
1109
-    -55,  -6,  -1, -14,  41, -10,   4, -48, -22,  20,
1110
-     31,  10,  -5,  -7, -20,   9,  16, -45,   8, -19,
1111
-     40, -12,   1,  15,   4,  10, -12, -34, -11,  41,
1112
-     16,  24, -30, -49, -20,  13,  28,  22,  18,  43,
1113
-    }, {
1114
-   -124,  13,  21,  23,  62, -23,   0, -43, -57,  -8,
1115
-     13,  18, -14,  10,  -6,  26,   3, -49,  19, -19,
1116
-     31, -27,   7,   0, -11,  20, -29,   1, -12,  47,
1117
-     -4,  39, -11, -34, -28,   9,   5,  19,  13,  34,
1118
-    }, {
1119
-     34, -14,  -4,  17,  -5,  24,  26, -20,  27,  45,
1120
-     12, -24,   2, -13,  21,   8,  22,  16,  32,   2,
1121
-    -34, -31, -20,   7,  58,  -5,   5,  -2, -38,  12,
1122
-     -2,   1,  -1,  26,  -5,  23,  21,   6,  -8, -11,
1123
-    }, {
1124
-    -34,   6,  18,  55,  15,  11,  21, -16,  -8,  16,
1125
-     -6, -16,  -5,   4,  35,  24,  10,  12,  43,   1,
1126
-    -43, -47, -14,  -8,  43,   5, -10,  34, -39,  18,
1127
-    -22,  16,  17,  42, -13,  19,  -1,   3, -14, -20,
1128
-    }, {
1129
-     -5,  -7,   7,   4,   9,   0,  21, -28,   6,  48,
1130
-     -2,  14,  15, -20,   5,   0,  27,  14,  32,  28,
1131
-      5, -32,   2,  -6,  32,  -3,  12,   5,  -8,  25,
1132
-     14,   4, -12, -11,   4,  47,  45,  22, -22,   2,
1133
-    }, {
1134
-    -74,  12,  30,  42,  30, -14,  16, -23, -29,  19,
1135
-    -20,  21,   7,  -1,  19,  17,  14,  10,  43,  27,
1136
-     -3, -48,   8, -22,  16,   7,  -4,  42,  -9,  31,
1137
-     -6,  20,   6,   4,  -3,  43,  22,  20, -28,  -5,
1138
-    }, {
1139
-    -10,  -3,   4,  18,  15, -27,  24, -13,  24,  51,
1140
-     34, -47, -12, -28,  21,  19,  27, -16,  15, -30,
1141
-    -17, -12, -12,   0,  36, -10,  -7, -27, -37,  16,
1142
-     15,  22,  -3,   4, -31,  -1,  42,  -7,  18,   9,
1143
-    }, {
1144
-    -79,  17,  27,  56,  36, -41,  19,  -8, -10,  22,
1145
-     15, -39, -20,  -9,  35,  35,  15, -20,  26, -31,
1146
-    -26, -27,  -6, -15,  20,   0, -23,   8, -38,  22,
1147
-     -5,  38,  15,  20, -39,  -4,  18,  -9,  13,   1,
1148
-    }, {
1149
-    -50,   3,  16,   5,  30, -53,  19, -20,   3,  55,
1150
-     19,  -8,   0, -34,   5,  11,  32, -18,  15,  -4,
1151
-     22, -13,  10, -13,   9,  -8,   0, -19,  -7,  29,
1152
-     31,  26, -13, -33, -21,  22,  65,   9,   4,  23,
1153
-    }, {
1154
-   -119,  24,  39,  44,  51, -66,  14, -15, -31,  26,
1155
-      1,   0,  -7, -16,  19,  28,  19, -22,  26,  -4,
1156
-     13, -28,  16, -29,  -5,   1, -16,  16,  -8,  35,
1157
-     10,  42,   4, -17, -29,  19,  42,   7,   0,  15,
1158
-    }, {
1159
-     31, -28,   6, -16, -16,  50, -31, -14,   0,   6,
1160
-     36,  17,   0,   0, -29, -14,  11,  18,  20, -25,
1161
-     -6, -33, -19,  20,  43,  21,  21, -14, -55,   0,
1162
-    -32, -40, -42,  39,   1,  -8, -14,   8,  -6,  -3,
1163
-    }, {
1164
-    -37,  -8,  29,  22,   4,  37, -36,  -9, -34, -22,
1165
-     17,  24,  -8,  18, -15,   2,  -1,  14,  31, -25,
1166
-    -15, -48, -13,   4,  28,  31,   5,  21, -57,   4,
1167
-    -53, -24, -23,  55,  -6, -12, -37,   6, -11, -11,
1168
-    }, {
1169
-     -7, -22,  18, -29,  -1,  25, -36, -21, -20,   9,
1170
-     22,  56,  11,  -6, -45, -21,  15,  16,  20,   1,
1171
-     33, -34,   2,   6,  17,  23,  28,  -6, -25,  12,
1172
-    -16, -37, -53,   1,  11,  15,   8,  25, -20,  11,
1173
-    }, {
1174
-    -76,  -1,  41,   9,  19,  12, -41, -17, -55, -18,
1175
-      3,  63,   3,  12, -30,  -5,   3,  12,  31,   0,
1176
-     24, -49,   8,  -9,   1,  33,  12,  29, -27,  18,
1177
-    -37, -21, -34,  17,   3,  11, -14,  23, -25,   2,
1178
-    }, {
1179
-    -13, -17,  15, -15,   3,  -1, -33,  -7,  -1,  12,
1180
-     58,  -5, -15, -13, -29,  -3,  16, -13,   4, -57,
1181
-     10, -13, -11,  13,  21,  15,   9, -40, -55,   3,
1182
-    -14, -19, -44,  17, -24, -32,   5,  -4,  21,  18,
1183
-    }, {
1184
-    -82,   3,  38,  23,  24, -15, -38,  -2, -37, -15,
1185
-     39,   2, -23,   4, -15,  12,   3, -17,  15, -58,
1186
-      1, -29,  -6,  -2,   5,  26,  -7,  -4, -56,   9,
1187
-    -35,  -3, -25,  33, -32, -36, -17,  -7,  15,   9,
1188
-    }, {
1189
-    -52, -10,  27, -27,  18, -26, -38, -14, -23,  16,
1190
-     44,  33,  -3, -20, -45, -10,  20, -15,   3, -31,
1191
-     50, -14,  10,   0,  -5,  17,  15, -32, -24,  16,
1192
-      1, -15, -55, -20, -14,  -8,  29,  12,   7,  32,
1193
-    }, {
1194
-   -121,   9,  50,  10,  40, -40, -43,  -9, -58, -12,
1195
-     25,  41, -11,  -2, -31,   5,   8, -19,  15, -32,
1196
-     41, -30,  16, -16, -20,  28,   0,   3, -26,  22,
1197
-    -19,   0, -36,  -4, -22, -12,   6,   9,   1,  24,
1198
-    }, {
1199
-     36, -18,  24,   3, -28,   7, -16,  13,  26,  41,
1200
-     24,  -1,   5, -26,  -3, -12,  27,  46,  27, -10,
1201
-    -24, -34, -10,  -8,  49,   2,  34,   0, -51, -12,
1202
-    -17, -38, -25,  56,   0,   0,  22,  -3, -20, -22,
1203
-    }, {
1204
-    -32,   2,  47,  42,  -7,  -5, -21,  18,  -9,  12,
1205
-      5,   5,  -2,  -8,  10,   4,  14,  42,  38, -10,
1206
-    -33, -49,  -5, -24,  33,  12,  17,  35, -52,  -6,
1207
-    -38, -22,  -7,  72,  -7,  -3,   0,  -6, -25, -30,
1208
-    }, {
1209
-     -2, -11,  36,  -9, -13, -17, -21,   6,   5,  45,
1210
-     10,  36,  18, -33, -19, -19,  31,  44,  27,  15,
1211
-     16, -34,  11, -22,  22,   4,  40,   7, -21,   0,
1212
-     -1, -35, -36,  18,  10,  24,  46,  12, -34,  -8,
1213
-    }, {
1214
-    -71,   9,  59,  29,   8, -30, -26,  11, -30,  16,
1215
-     -8,  44,   9, -14,  -5,  -2,  19,  40,  38,  15,
1216
-      7, -50,  17, -38,   7,  14,  24,  43, -22,   6,
1217
-    -22, -19, -17,  34,   2,  20,  23,  10, -39, -16,
1218
-    }, {
1219
-     -8,  -6,  33,   4,  -7, -44, -18,  21,  23,  48,
1220
-     46, -24,  -9, -40,  -3,  -1,  32,  13,  11, -43,
1221
-     -7, -14,  -3, -15,  26,  -3,  21, -26, -50,  -8,
1222
-      0, -16, -27,  34, -25, -23,  43, -17,   6,  -1,
1223
-    }, {
1224
-    -77,  13,  56,  43,  13, -57, -23,  26, -11,  19,
1225
-     27, -16, -17, -22,  10,  15,  19,  10,  22, -43,
1226
-    -16, -30,   2, -31,  11,   6,   5,   9, -52,  -2,
1227
-    -20,   0,  -8,  50, -33, -27,  19, -19,   1,  -9,
1228
-    }, {
1229
-    -47,   0,  45,  -7,   7, -69, -23,  13,   2,  51,
1230
-     32,  14,   3, -47, -19,  -8,  37,  11,  10, -16,
1231
-     32, -15,  19, -29,   0,  -1,  28, -18, -20,   4,
1232
-     16, -13, -38,  -3, -15,   0,  66,   0,  -7,  13,
1233
-    }, {
1234
-   -116,  20,  68,  30,  28, -83, -28,  18, -32,  22,
1235
-     13,  21,  -5, -28,  -5,   7,  24,   8,  22, -17,
1236
-     23, -30,  25, -45, -15,   9,  11,  18, -22,  10,
1237
-     -4,   2, -19,  12, -23,  -3,  43,  -2, -12,   4,
1238
-    }, {
1239
-     72, -13, -29, -18,   4,  90,  37, -34,   4,  -1,
1240
-     13,  -9,  -6,  11,   2,  24, -13,   3,  -7, -11,
1241
-     -4,   4, -42,  25,  31,  -1,  -8, -29,  -6,  17,
1242
-    -19,   2, -10,  -6,  38,  22, -42, -19,  -6, -11,
1243
-    }, {
1244
-      3,   7,  -6,  20,  25,  77,  32, -29, -31, -30,
1245
-     -4,  -2, -14,  29,  16,  40, -26,   0,   3, -12,
1246
-    -13, -10, -36,   9,  15,   8, -24,   6,  -7,  22,
1247
-    -40,  17,   8,   9,  31,  18, -66, -22, -11, -19,
1248
-    }, {
1249
-     32,  -6, -17, -31,  19,  65,  33, -41, -16,   1,
1250
-      0,  29,   6,   4, -13,  17,  -9,   1,  -8,  14,
1251
-     35,   3, -19,  11,   4,   0,  -1, -21,  23,  30,
1252
-     -3,   5, -20, -44,  48,  46, -19,  -3, -20,   3,
1253
-    }, {
1254
-    -36,  13,   5,   7,  40,  51,  28, -36, -52, -27,
1255
-    -18,  36,  -2,  22,   0,  33, -21,  -2,   3,  13,
1256
-     26, -11, -14,  -4, -10,  10, -18,  14,  22,  36,
1257
-    -24,  21,  -1, -28,  40,  42, -42,  -5, -25,  -5,
1258
-    }, {
1259
-     27,  -1, -20, -17,  24,  38,  35, -26,   1,   4,
1260
-     35, -32, -21,  -3,   2,  35,  -8, -29, -24, -44,
1261
-     12,  24, -34,  18,   8,  -7, -21, -55,  -5,  21,
1262
-     -2,  23, -11, -28,  13,  -1, -22, -33,  21,  10,
1263
-    }, {
1264
-    -41,  18,   2,  21,  45,  24,  30, -21, -33, -24,
1265
-     17, -24, -29,  15,  16,  51, -21, -33, -13, -45,
1266
-      3,   8, -28,   2,  -7,   2, -37, -19,  -7,  27,
1267
-    -22,  39,   7, -12,   5,  -5, -45, -35,  15,   1,
1268
-    }, {
1269
-    -12,   4,  -8, -29,  39,  12,  30, -33, -19,   8,
1270
-     21,   6,  -8,  -9, -13,  28,  -4, -31, -24, -18,
1271
-     52,  23, -12,   4, -18,  -5, -14, -47,  24,  34,
1272
-     14,  27, -22, -66,  22,  22,   1, -16,   6,  24,
1273
-    }, {
1274
-    -81,  25,  14,   8,  61,   0,  25, -28, -54, -20,
1275
-      3,  14, -17,   8,   0,  44, -16, -35, -13, -18,
1276
-     43,   7,  -6, -11, -33,   4, -30, -11,  22,  40,
1277
-     -6,  43,  -3, -50,  14,  18, -22, -18,   1,  16,
1278
-    }, {
1279
-     77,  -2, -11,   1,  -7,  47,  52,  -5,  29,  33,
1280
-      1, -28,   0, -15,  28,  26,   2,  30,   0,   2,
1281
-    -22,   4, -33,  -3,  36, -21,   3, -15,  -2,   5,
1282
-     -4,   4,   6,   9,  37,  31,  -5, -32, -20, -30,
1283
-    }, {
1284
-      8,  17,  10,  40,  13,  34,  47,   0,  -5,   4,
1285
-    -16, -21,  -8,   2,  42,  43, -10,  26,  10,   2,
1286
-    -31, -11, -27, -19,  21, -10, -12,  20,  -3,  11,
1287
-    -25,  20,  25,  25,  29,  28, -28, -34, -25, -38,
1288
-    }, {
1289
-     37,   3,   0, -10,   7,  22,  48, -12,   8,  36,
1290
-    -12,   9,  12, -22,  12,  19,   6,  28,   0,  29,
1291
-     18,   3, -11, -17,  10, -18,  10,  -7,  27,  18,
1292
-     11,   7,  -3, -28,  47,  55,  18, -15, -34, -16,
1293
-    }, {
1294
-    -31,  24,  23,  27,  29,   9,  43,  -8, -26,   7,
1295
-    -30,  17,   4,  -3,  26,  35,  -5,  24,  10,  28,
1296
-      9, -12,  -5, -33,  -5,  -8,  -5,  29,  26,  24,
1297
-     -9,  23,  14, -12,  39,  52,  -5, -18, -39, -24,
1298
-    }, {
1299
-     32,   8,  -3,   2,  13,  -4,  50,   1,  27,  39,
1300
-     23, -51, -15, -30,  27,  37,   7,  -1, -17, -29,
1301
-     -5,  23, -25, -10,  14, -26,  -8, -41,  -1,   9,
1302
-     13,  26,   5, -12,  12,   7,  14, -45,   6,  -9,
1303
-    }, {
1304
-    -36,  29,  19,  41,  34, -18,  45,   6,  -8,  10,
1305
-      5, -43, -23, -11,  42,  53,  -5,  -5,  -6, -30,
1306
-    -14,   8, -20, -26,  -1, -16, -25,  -4,  -3,  15,
1307
-     -7,  41,  23,   3,   4,   3,  -8, -48,   1, -17,
1308
-    }, {
1309
-     -7,  15,   9,  -9,  28, -29,  45,  -5,   6,  43,
1310
-      9, -12,  -2, -36,  12,  30,  11,  -3, -17,  -3,
1311
-     34,  22,  -3, -24, -12, -24,  -2, -32,  28,  22,
1312
-     29,  29,  -5, -50,  21,  31,  38, -29,  -7,   5,
1313
-    }, {
1314
-    -76,  35,  31,  28,  49, -43,  40,   0, -29,  14,
1315
-     -8,  -5, -10, -18,  26,  46,   0,  -7,  -6,  -3,
1316
-     25,   7,   2, -40, -28, -14, -18,   3,  27,  28,
1317
-      8,  45,  13, -34,  13,  27,  15, -31, -12,  -3,
1318
-    }, {
1319
-     74, -17,   0, -31, -18,  73,  -5,   0,   3,  -5,
1320
-     25,  12,  -3,  -1, -22,   3,  -9,  33, -12, -24,
1321
-      6,   2, -33,   9,  21,   5,  20, -27, -19,  -7,
1322
-    -34, -37, -34,  22,  44,   0, -41, -29, -17, -21,
1323
-    }, {
1324
-      5,   3,  21,   7,   2,  60, -10,   5, -32, -34,
1325
-      7,  20, -11,  16,  -8,  20, -21,  29,  -1, -24,
1326
-     -2, -13, -27,  -6,   5,  15,   3,   8, -21,  -1,
1327
-    -55, -21, -15,  38,  37,  -3, -65, -32, -23, -30,
1328
-    }, {
1329
-     35, -10,  11, -44,  -3,  48, -10,  -6, -17,  -2,
1330
-     11,  51,   8,  -8, -38,  -3,  -4,  31, -12,   2,
1331
-     46,   1, -10,  -4,  -5,   7,  26, -19,  10,   5,
1332
-    -18, -34, -45, -15,  54,  24, -18, -13, -31,  -7,
1333
-    }, {
1334
-    -33,  10,  34,  -5,  17,  35, -15,  -1, -53, -30,
1335
-     -6,  59,   0,  10, -24,  13, -17,  27,  -1,   1,
1336
-     37, -13,  -4, -20, -20,  18,  10,  16,   8,  11,
1337
-    -39, -18, -26,   0,  46,  20, -41, -15, -37, -15,
1338
-    }, {
1339
-     29,  -5,   7, -30,   1,  21,  -7,   7,   0,   0,
1340
-     47,  -9, -18, -15, -22,  14,  -4,   0, -28, -57,
1341
-     23,  21, -25,   2,  -1,   0,   7, -53, -19,  -3,
1342
-    -17, -15, -36,   0,  19, -24, -21, -43,   9,   0,
1343
-    }, {
1344
-    -39,  14,  30,   8,  22,   8, -12,  12, -34, -27,
1345
-     29,  -2, -26,   2,  -8,  31, -16,  -3, -17, -57,
1346
-     14,   6, -19, -13, -16,  10,  -8, -17, -20,   2,
1347
-    -38,   0, -17,  16,  11, -27, -44, -45,   4,  -8,
1348
-    }, {
1349
-     -9,   1,  20, -43,  17,  -3, -12,   0, -20,   4,
1350
-     33,  29,  -6, -22, -38,   7,   0,  -1, -29, -30,
1351
-     63,  21,  -3, -11, -27,   1,  14, -45,  10,   9,
1352
-     -1, -12, -47, -37,  28,   0,   2, -26,  -4,  13,
1353
-    }, {
1354
-    -78,  21,  43,  -4,  38, -17, -17,   5, -55, -24,
1355
-     15,  36, -14,  -4, -24,  24, -12,  -5, -17, -31,
1356
-     54,   5,   2, -27, -43,  12,  -2,  -9,   9,  15,
1357
-    -22,   3, -28, -21,  20,  -3, -20, -28,  -9,   5,
1358
-    }, {
1359
-     80,  -6,  16, -11, -30,  30,   9,  28,  28,  29,
1360
-     13,  -6,   2, -28,   3,   5,   7,  60,  -5,  -9,
1361
-    -11,   1, -24, -19,  27, -13,  32, -13, -15, -19,
1362
-    -19, -35, -17,  39,  43,   9,  -4, -42, -32, -41,
1363
-    }, {
1364
-     11,  14,  39,  27,  -9,  17,   4,  33,  -6,   0,
1365
-     -4,   1,  -5, -10,  17,  22,  -5,  57,   5,  -9,
1366
-    -20, -13, -18, -35,  11,  -3,  16,  22, -17, -13,
1367
-    -40, -19,   1,  55,  35,   5, -27, -44, -37, -49,
1368
-    }, {
1369
-     40,   0,  28, -24, -14,   5,   4,  21,   7,  33,
1370
-      0,  32,  15, -35, -12,  -1,  11,  58,  -5,  16,
1371
-     28,   0,  -1, -33,   0, -11,  39,  -5,  14,  -6,
1372
-     -3, -31, -28,   1,  53,  33,  19, -25, -46, -26,
1373
-    }, {
1374
-    -28,  20,  51,  14,   6,  -7,   0,  26, -27,   4,
1375
-    -18,  40,   6, -16,   1,  15,   0,  55,   5,  16,
1376
-     19, -14,   3, -49, -14,  -1,  22,  30,  12,   0,
1377
-    -24, -15,  -9,  17,  45,  29,  -4, -28, -51, -35,
1378
-    }, {
1379
-     34,   4,  25, -10,  -9, -21,   7,  36,  26,  36,
1380
-     35, -28, -12, -42,   3,  16,  12,  28, -21, -42,
1381
-      5,  21, -16, -26,   4, -19,  19, -39, -15, -15,
1382
-     -1, -13, -19,  17,  17, -14,  15, -55,  -4, -19,
1383
-    }, {
1384
-    -34,  25,  48,  28,  11, -34,   2,  41,  -9,   7,
1385
-     17, -21, -20, -24,  17,  33,   0,  24, -10, -42,
1386
-     -3,   5, -10, -42, -11,  -8,   3,  -3, -16,  -9,
1387
-    -22,   2,   0,  33,  10, -18,  -7, -58, -10, -28,
1388
-    }, {
1389
-     -4,  11,  37, -23,   5, -46,   2,  29,   5,  39,
1390
-     21,   9,   0, -49, -12,   9,  16,  26, -22, -15,
1391
-     45,  20,   5, -40, -22, -17,  26, -31,  14,  -2,
1392
-     14, -10, -30, -20,  27,   9,  39, -39, -18,  -5,
1393
-    }, {
1394
-    -73,  32,  60,  15,  26, -59,  -2,  33, -30,  10,
1395
-      3,  17,  -8, -30,   1,  26,   4,  22, -10, -16,
1396
-     36,   5,  11, -56, -37,  -6,  10,   5,  13,   3,
1397
-     -6,   5, -11,  -4,  19,   5,  16, -41, -24, -13
1398
-    }
1399
-};
1400
-
1401
-static const uint16_t cb1_base[128]={
1402
-    19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671,
1403
-    20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411,
1404
-    20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387,
1405
-    21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852,
1406
-    19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086,
1407
-    21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159,
1408
-    19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004,
1409
-    21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781,
1410
-    19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556,
1411
-    18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770,
1412
-    17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138,
1413
-    16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675,
1414
-    20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477,
1415
-    19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389,
1416
-    17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363,
1417
-    16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657,
1418
-};
1419
-
1420
-static const uint16_t cb2_base[128]={
1421
-    12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053,
1422
-    12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268,
1423
-    11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109,
1424
-    11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405,
1425
-    10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818,
1426
-    10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226,
1427
-    10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053,
1428
-    10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198,
1429
-    14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155,
1430
-    15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446,
1431
-    13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443,
1432
-    12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230,
1433
-    12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449,
1434
-    13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982,
1435
-    12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410,
1436
-    12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174,
1437
-};
1438
-
1439
-static const int16_t energy_tab[32]={
1440
-        0,    16,    20,    25,    32,    41,    51,    65,
1441
-       81,   103,   129,   163,   205,   259,   326,   410,
1442
-      516,   650,   819,  1031,  1298,  1634,  2057,  2590,
1443
-     3261,  4105,  5168,  6507,  8192, 10313, 12983, 16345
1444
-};
1445
-
1446
-static const int16_t lpc_refl_cb1[64]={
1447
-    -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879,
1448
-    -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631,
1449
-    -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268,
1450
-    -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676,
1451
-    -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660,
1452
-    -1508, -1348, -1185,  -994,  -798,  -600,  -374,  -110,
1453
-      152,   447,   720,   982,  1229,  1456,  1682,  1916,
1454
-     2130,  2353,  2595,  2853,  3118,  3363,  3588,  3814
1455
-};
1456
-
1457
-static const int16_t lpc_refl_cb2[32]={
1458
-    -3091, -2386, -1871, -1425, -1021,  -649,  -316,   -20,
1459
-      267,   544,   810,  1065,  1305,  1534,  1756,  1970,
1460
-     2171,  2359,  2536,  2700,  2854,  2996,  3133,  3263,
1461
-     3386,  3499,  3603,  3701,  3789,  3870,  3947,  4020
1462
-};
1463
-
1464
-static const int16_t lpc_refl_cb3[32]={
1465
-    -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149,
1466
-    -1979, -1817, -1658, -1498, -1341, -1188, -1032,  -876,
1467
-     -721,  -561,  -394,  -228,   -54,   119,   296,   484,
1468
-      683,   895,  1123,  1373,  1651,  1965,  2360,  2854
1469
-};
1470
-
1471
-static const int16_t lpc_refl_cb4[16]={
1472
-    -1845, -1057,  -522,   -77,   301,   647,   975,  1285,
1473
-     1582,  1873,  2163,  2452,  2735,  3017,  3299,  3569
1474
-};
1475
-
1476
-static const int16_t lpc_refl_cb5[16]={
1477
-    -2691, -2187, -1788, -1435, -1118,  -837,  -571,  -316,
1478
-      -59,   201,   470,   759,  1077,  1457,  1908,  2495
1479
-};
1480
-
1481
-static const int16_t lpc_refl_cb6[8]={
1482
-    -1372,  -474,   133,   632,  1100,  1571,  2075,  2672
1483
-};
1484
-
1485
-static const int16_t lpc_refl_cb7[8]={
1486
-    -2389, -1787, -1231,  -717,  -239,   234,   770,  1474
1487
-};
1488
-
1489
-static const int16_t lpc_refl_cb8[8]={
1490
-    -1569,  -864,  -296,   200,   670,  1151,  1709,  2385
1491
-};
1492
-
1493
-static const int16_t lpc_refl_cb9[8]={
1494
-    -2200, -1608, -1062,  -569,  -120,   338,   863,  1621
1495
-};
1496
-
1497
-static const int16_t lpc_refl_cb10[4]={
1498
-     -617,   190,   802,  1483
1499
-};
1500
-
1501
-static const int16_t * const lpc_refl_cb[10]={
1502
-    lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5,
1503
-    lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10
1504
-};
27
+#define NBLOCKS         4       ///< number of subblocks within a block
28
+#define BLOCKSIZE       40      ///< subblock size in 16-bit words
29
+#define BUFFERSIZE      146     ///< the size of the adaptive codebook
30
+
31
+typedef struct {
32
+    AVCodecContext *avctx;
33
+
34
+    unsigned int     old_energy;        ///< previous frame energy
35
+
36
+    unsigned int     lpc_tables[2][10];
37
+
38
+    /** LPC coefficients: lpc_coef[0] is the coefficients of the current frame
39
+     *  and lpc_coef[1] of the previous one. */
40
+    unsigned int    *lpc_coef[2];
41
+
42
+    unsigned int     lpc_refl_rms[2];
43
+
44
+    /** The current subblock padded by the last 10 values of the previous one. */
45
+    int16_t curr_sblock[50];
46
+
47
+    /** Adaptive codebook, its size is two units bigger to avoid a
48
+     *  buffer overflow. */
49
+    uint16_t adapt_cb[146+2];
50
+} RA144Context;
51
+
52
+void add_wav(int16_t *dest, int n, int skip_first, int *m, const int16_t *s1,
53
+             const int8_t *s2, const int8_t *s3);
54
+void copy_and_dup(int16_t *target, const int16_t *source, int offset);
55
+int eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx);
56
+void eval_coefs(int *coefs, const int *refl);
57
+void int_to_int16(int16_t *out, const int *inp);
58
+int t_sqrt(unsigned int x);
59
+unsigned int rms(const int *data);
60
+int interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy);
61
+unsigned int rescale_rms(unsigned int rms, unsigned int energy);
62
+int irms(const int16_t *data);
63
+
64
+extern const int16_t gain_val_tab[256][3];
65
+extern const uint8_t gain_exp_tab[256];
66
+extern const int8_t cb1_vects[128][40];
67
+extern const int8_t cb2_vects[128][40];
68
+extern const uint16_t cb1_base[128];
69
+extern const uint16_t cb2_base[128];
70
+extern const int16_t energy_tab[32];
71
+extern const int16_t * const lpc_refl_cb[10];
1505 72
 
1506 73
 #endif /* AVCODEC_RA144_H */
1507 74
new file mode 100644
... ...
@@ -0,0 +1,154 @@
0
+/*
1
+ * Real Audio 1.0 (14.4K)
2
+ *
3
+ * Copyright (c) 2008 Vitor Sessak
4
+ * Copyright (c) 2003 Nick Kurshev
5
+ *     Based on public domain decoder at http://www.honeypot.net/audio
6
+ *
7
+ * This file is part of FFmpeg.
8
+ *
9
+ * FFmpeg is free software; you can redistribute it and/or
10
+ * modify it under the terms of the GNU Lesser General Public
11
+ * License as published by the Free Software Foundation; either
12
+ * version 2.1 of the License, or (at your option) any later version.
13
+ *
14
+ * FFmpeg is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
+ * Lesser General Public License for more details.
18
+ *
19
+ * You should have received a copy of the GNU Lesser General Public
20
+ * License along with FFmpeg; if not, write to the Free Software
21
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
+ */
23
+
24
+#include "libavutil/intmath.h"
25
+#include "avcodec.h"
26
+#include "get_bits.h"
27
+#include "ra144.h"
28
+#include "celp_filters.h"
29
+
30
+
31
+static av_cold int ra144_decode_init(AVCodecContext * avctx)
32
+{
33
+    RA144Context *ractx = avctx->priv_data;
34
+
35
+    ractx->avctx = avctx;
36
+
37
+    ractx->lpc_coef[0] = ractx->lpc_tables[0];
38
+    ractx->lpc_coef[1] = ractx->lpc_tables[1];
39
+
40
+    avctx->sample_fmt = SAMPLE_FMT_S16;
41
+    return 0;
42
+}
43
+
44
+static void do_output_subblock(RA144Context *ractx, const uint16_t  *lpc_coefs,
45
+                               int gval, GetBitContext *gb)
46
+{
47
+    uint16_t buffer_a[40];
48
+    uint16_t *block;
49
+    int cba_idx = get_bits(gb, 7); // index of the adaptive CB, 0 if none
50
+    int gain    = get_bits(gb, 8);
51
+    int cb1_idx = get_bits(gb, 7);
52
+    int cb2_idx = get_bits(gb, 7);
53
+    int m[3];
54
+
55
+    if (cba_idx) {
56
+        cba_idx += BLOCKSIZE/2 - 1;
57
+        copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx);
58
+        m[0] = (irms(buffer_a) * gval) >> 12;
59
+    } else {
60
+        m[0] = 0;
61
+    }
62
+
63
+    m[1] = (cb1_base[cb1_idx] * gval) >> 8;
64
+    m[2] = (cb2_base[cb2_idx] * gval) >> 8;
65
+
66
+    memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
67
+            (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
68
+
69
+    block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
70
+
71
+    add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL,
72
+            cb1_vects[cb1_idx], cb2_vects[cb2_idx]);
73
+
74
+    memcpy(ractx->curr_sblock, ractx->curr_sblock + 40,
75
+           10*sizeof(*ractx->curr_sblock));
76
+
77
+    if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs,
78
+                                    block, BLOCKSIZE, 10, 1, 0xfff))
79
+        memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock));
80
+}
81
+
82
+/** Uncompress one block (20 bytes -> 160*2 bytes). */
83
+static int ra144_decode_frame(AVCodecContext * avctx, void *vdata,
84
+                              int *data_size, AVPacket *avpkt)
85
+{
86
+    const uint8_t *buf = avpkt->data;
87
+    int buf_size = avpkt->size;
88
+    static const uint8_t sizes[10] = {6, 5, 5, 4, 4, 3, 3, 3, 3, 2};
89
+    unsigned int refl_rms[4];    // RMS of the reflection coefficients
90
+    uint16_t block_coefs[4][10]; // LPC coefficients of each sub-block
91
+    unsigned int lpc_refl[10];   // LPC reflection coefficients of the frame
92
+    int i, j;
93
+    int16_t *data = vdata;
94
+    unsigned int energy;
95
+
96
+    RA144Context *ractx = avctx->priv_data;
97
+    GetBitContext gb;
98
+
99
+    if (*data_size < 2*160)
100
+        return -1;
101
+
102
+    if(buf_size < 20) {
103
+        av_log(avctx, AV_LOG_ERROR,
104
+               "Frame too small (%d bytes). Truncated file?\n", buf_size);
105
+        *data_size = 0;
106
+        return buf_size;
107
+    }
108
+    init_get_bits(&gb, buf, 20 * 8);
109
+
110
+    for (i=0; i<10; i++)
111
+        lpc_refl[i] = lpc_refl_cb[i][get_bits(&gb, sizes[i])];
112
+
113
+    eval_coefs(ractx->lpc_coef[0], lpc_refl);
114
+    ractx->lpc_refl_rms[0] = rms(lpc_refl);
115
+
116
+    energy = energy_tab[get_bits(&gb, 5)];
117
+
118
+    refl_rms[0] = interp(ractx, block_coefs[0], 1, 1, ractx->old_energy);
119
+    refl_rms[1] = interp(ractx, block_coefs[1], 2, energy <= ractx->old_energy,
120
+                    t_sqrt(energy*ractx->old_energy) >> 12);
121
+    refl_rms[2] = interp(ractx, block_coefs[2], 3, 0, energy);
122
+    refl_rms[3] = rescale_rms(ractx->lpc_refl_rms[0], energy);
123
+
124
+    int_to_int16(block_coefs[3], ractx->lpc_coef[0]);
125
+
126
+    for (i=0; i < 4; i++) {
127
+        do_output_subblock(ractx, block_coefs[i], refl_rms[i], &gb);
128
+
129
+        for (j=0; j < BLOCKSIZE; j++)
130
+            *data++ = av_clip_int16(ractx->curr_sblock[j + 10] << 2);
131
+    }
132
+
133
+    ractx->old_energy = energy;
134
+    ractx->lpc_refl_rms[1] = ractx->lpc_refl_rms[0];
135
+
136
+    FFSWAP(unsigned int *, ractx->lpc_coef[0], ractx->lpc_coef[1]);
137
+
138
+    *data_size = 2*160;
139
+    return 20;
140
+}
141
+
142
+AVCodec ra_144_decoder =
143
+{
144
+    "real_144",
145
+    AVMEDIA_TYPE_AUDIO,
146
+    CODEC_ID_RA_144,
147
+    sizeof(RA144Context),
148
+    ra144_decode_init,
149
+    NULL,
150
+    NULL,
151
+    ra144_decode_frame,
152
+    .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),
153
+};