]> git.sesse.net Git - ffmpeg/blob - libavcodec/ra144.c
fft-test: add option to set cpuflag mask
[ffmpeg] / libavcodec / ra144.c
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]={
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 };
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
1525 /**
1526  * Copy the last offset values of *source to *target. If those values are not
1527  * enough to fill the target buffer, fill it with another copy of those values.
1528  */
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
1538 /**
1539  * Evaluate the reflection coefficients from the filter coefficients.
1540  *
1541  * @return 1 if one of the reflection coefficients is greater than
1542  *         4095, 0 if not.
1543  */
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
1581 /**
1582  * Evaluate the LPC filter coefficients from the reflection coefficients.
1583  * Does the inverse of the ff_eval_refl() function.
1584  */
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
1613 /**
1614  * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
1615  * odd way to make the output identical to the binary decoder.
1616  */
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
1675 /** inverse root mean square */
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 }