ra144.c
Go to the documentation of this file.
1 /*
2  * Real Audio 1.0 (14.4K)
3  * Copyright (c) 2003 the ffmpeg project
4  *
5  * This file is part of Libav.
6  *
7  * Libav is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * Libav is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include <stdint.h>
23 #include "avcodec.h"
24 #include "celp_filters.h"
25 #include "ra144.h"
26 
27 const int16_t ff_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 const uint8_t ff_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 const int8_t ff_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 const int8_t ff_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 const uint16_t ff_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 const uint16_t ff_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 const int16_t ff_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 const int16_t * const ff_lpc_refl_cb[10]={
1504 };
1505 
1506 static void ff_add_wav(int16_t *dest, int n, int skip_first, int *m, const int16_t *s1,
1507  const int8_t *s2, const int8_t *s3)
1508 {
1509  int i;
1510  int v[3];
1511 
1512  v[0] = 0;
1513  for (i=!skip_first; i<3; i++)
1514  v[i] = (ff_gain_val_tab[n][i] * m[i]) >> ff_gain_exp_tab[n];
1515 
1516  if (v[0]) {
1517  for (i=0; i < BLOCKSIZE; i++)
1518  dest[i] = (s1[i]*v[0] + s2[i]*v[1] + s3[i]*v[2]) >> 12;
1519  } else {
1520  for (i=0; i < BLOCKSIZE; i++)
1521  dest[i] = ( s2[i]*v[1] + s3[i]*v[2]) >> 12;
1522  }
1523 }
1524 
1529 void ff_copy_and_dup(int16_t *target, const int16_t *source, int offset)
1530 {
1531  source += BUFFERSIZE - offset;
1532 
1533  memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
1534  if (offset < BLOCKSIZE)
1535  memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
1536 }
1537 
1544 int ff_eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
1545 {
1546  int b, i, j;
1547  int buffer1[LPC_ORDER];
1548  int buffer2[LPC_ORDER];
1549  int *bp1 = buffer1;
1550  int *bp2 = buffer2;
1551 
1552  for (i=0; i < LPC_ORDER; i++)
1553  buffer2[i] = coefs[i];
1554 
1555  refl[LPC_ORDER-1] = bp2[LPC_ORDER-1];
1556 
1557  if ((unsigned) bp2[LPC_ORDER-1] + 0x1000 > 0x1fff) {
1558  av_log(avctx, AV_LOG_ERROR, "Overflow. Broken sample?\n");
1559  return 1;
1560  }
1561 
1562  for (i = LPC_ORDER-2; i >= 0; i--) {
1563  b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12);
1564 
1565  if (!b)
1566  b = -2;
1567 
1568  for (j=0; j <= i; j++)
1569  bp1[j] = ((bp2[j] - ((refl[i+1] * bp2[i-j]) >> 12)) * (0x1000000 / b)) >> 12;
1570 
1571  if ((unsigned) bp1[i] + 0x1000 > 0x1fff)
1572  return 1;
1573 
1574  refl[i] = bp1[i];
1575 
1576  FFSWAP(int *, bp1, bp2);
1577  }
1578  return 0;
1579 }
1580 
1585 void ff_eval_coefs(int *coefs, const int *refl)
1586 {
1587  int buffer[LPC_ORDER];
1588  int *b1 = buffer;
1589  int *b2 = coefs;
1590  int i, j;
1591 
1592  for (i=0; i < LPC_ORDER; i++) {
1593  b1[i] = refl[i] << 4;
1594 
1595  for (j=0; j < i; j++)
1596  b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j];
1597 
1598  FFSWAP(int *, b1, b2);
1599  }
1600 
1601  for (i=0; i < LPC_ORDER; i++)
1602  coefs[i] >>= 4;
1603 }
1604 
1605 void ff_int_to_int16(int16_t *out, const int *inp)
1606 {
1607  int i;
1608 
1609  for (i = 0; i < LPC_ORDER; i++)
1610  *out++ = *inp++;
1611 }
1612 
1617 int ff_t_sqrt(unsigned int x)
1618 {
1619  int s = 2;
1620  while (x > 0xfff) {
1621  s++;
1622  x >>= 2;
1623  }
1624 
1625  return ff_sqrt(x << 20) << s;
1626 }
1627 
1628 unsigned int ff_rms(const int *data)
1629 {
1630  int i;
1631  unsigned int res = 0x10000;
1632  int b = LPC_ORDER;
1633 
1634  for (i = 0; i < LPC_ORDER; i++) {
1635  res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
1636 
1637  if (res == 0)
1638  return 0;
1639 
1640  while (res <= 0x3fff) {
1641  b++;
1642  res <<= 2;
1643  }
1644  }
1645 
1646  return ff_t_sqrt(res) >> b;
1647 }
1648 
1649 int ff_interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy)
1650 {
1651  int work[LPC_ORDER];
1652  int b = NBLOCKS - a;
1653  int i;
1654 
1655  // Interpolate block coefficients from the this frame's forth block and
1656  // last frame's forth block.
1657  for (i = 0; i < LPC_ORDER; i++)
1658  out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2;
1659 
1660  if (ff_eval_refl(work, out, ractx->avctx)) {
1661  // The interpolated coefficients are unstable, copy either new or old
1662  // coefficients.
1663  ff_int_to_int16(out, ractx->lpc_coef[copyold]);
1664  return ff_rescale_rms(ractx->lpc_refl_rms[copyold], energy);
1665  } else {
1666  return ff_rescale_rms(ff_rms(work), energy);
1667  }
1668 }
1669 
1670 unsigned int ff_rescale_rms(unsigned int rms, unsigned int energy)
1671 {
1672  return (rms * energy) >> 10;
1673 }
1674 
1676 int ff_irms(const int16_t *data)
1677 {
1678  unsigned int i, sum = 0;
1679 
1680  for (i=0; i < BLOCKSIZE; i++)
1681  sum += data[i] * data[i];
1682 
1683  if (sum == 0)
1684  return 0; /* OOPS - division by zero */
1685 
1686  return 0x20000000 / (ff_t_sqrt(sum) >> 8);
1687 }
1688 
1689 void ff_subblock_synthesis(RA144Context *ractx, const uint16_t *lpc_coefs,
1690  int cba_idx, int cb1_idx, int cb2_idx,
1691  int gval, int gain)
1692 {
1693  uint16_t buffer_a[BLOCKSIZE];
1694  uint16_t *block;
1695  int m[3];
1696 
1697  if (cba_idx) {
1698  cba_idx += BLOCKSIZE/2 - 1;
1699  ff_copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx);
1700  m[0] = (ff_irms(buffer_a) * gval) >> 12;
1701  } else {
1702  m[0] = 0;
1703  }
1704  m[1] = (ff_cb1_base[cb1_idx] * gval) >> 8;
1705  m[2] = (ff_cb2_base[cb2_idx] * gval) >> 8;
1706  memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
1707  (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
1708 
1709  block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
1710 
1711  ff_add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL,
1712  ff_cb1_vects[cb1_idx], ff_cb2_vects[cb2_idx]);
1713 
1714  memcpy(ractx->curr_sblock, ractx->curr_sblock + BLOCKSIZE,
1715  LPC_ORDER*sizeof(*ractx->curr_sblock));
1716 
1717  if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + LPC_ORDER, lpc_coefs,
1718  block, BLOCKSIZE, LPC_ORDER, 1, 0xfff))
1719  memset(ractx->curr_sblock, 0, (LPC_ORDER+BLOCKSIZE)*sizeof(*ractx->curr_sblock));
1720 }