aboutsummaryrefslogtreecommitdiffstats
path: root/op25/gr-op25_repeater/lib/p25p2_vf.cc
blob: e593ea777825e8919175a924b7990240379f8508 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
// P25 TDMA Decoder (C) Copyright 2013, 2014, 2016 Max H. Parke KA1RBI
// 
// This file is part of OP25
// 
// OP25 is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3, or (at your option)
// any later version.
// 
// OP25 is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
// License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with OP25; see the file COPYING. If not, write to the Free
// Software Foundation, Inc., 51 Franklin Street, Boston, MA
// 02110-1301, USA.

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "p25p2_vf.h"
#include "rs.h"

static void load_i(const uint8_t src[], int& dest, int count) {
	dest = 0;
	for (int i=0; i<count; i++)
		dest = (dest << 1) + src[count-1-i];
}

static void dump_i(uint8_t dest[], int src, int count) {
	for (int i=0; i<count; i++) {
		dest[i] = src & 1;
		src = src >> 1;
	}
}

static inline void store_reg(int reg, uint8_t val[], int len) {
	for (int i=0; i<len; i++){
		val[i] = (reg >> (len-1-i)) & 1;
	}
}

static inline int load_reg(const uint8_t val[], int len) {
	int acc = 0;
	for (int i=0; i<len; i++){
		acc = (acc << 1) + (val[i] & 1);
	}
	return acc;
}

static const uint32_t pr_n[4096] = {	\
	4377671, 1693438, 3163945, 7023824, 6340423, 3761422, 7558385, 15388512, 	\
	8494239, 14558670, 14137157, 9226424, 9263403, 16192087, 12361860, 10859305, 	\
	15624954, 16243111, 12370460, 4657881, 5187874, 1374775, 6112236, 5652757, 	\
	2726546, 2140651, 8089725, 3924900, 2152795, 7014490, 5387173, 10069108, 	\
	12643787, 13328146, 9536597, 16291820, 14888507, 11173058, 11659209, 16537117, 	\
	10948070, 9289331, 13956616, 5727629, 941654, 4558251, 8263096, 3630661, 	\
	3014022, 6614075, 4136800, 3441076, 5087247, 424910, 1796273, 13734696, 	\
	13239295, 10688598, 16313217, 16380664, 10641511, 11082678, 15833689, 10117448, 	\
	8614582, 13166703, 9673180, 1704593, 6394178, 7203327, 3570220, 8201489, 	\
	6587610, 3088143, 1994164, 5633761, 960266, 400534, 14487109, 11851576, 	\
	11494571, 14974786, 16629405, 11961516, 16668531, 12706978, 9108749, 9645780, 	\
	14161123, 8488250, 2252524, 8022341, 3252498, 2798315, 6490484, 7887541, 	\
	1172430, 4878683, 4205216, 1678205, 1491038, 7295619, 10812176, 12560620, 	\
	16135095, 15482898, 11393225, 14084892, 14495783, 8692218, 13606425, 14044288, 	\
	12338519, 10991150, 7220641, 3219280, 3720846, 6542783, 4746848, 1097697, 	\
	6008094, 4867655, 88048, 8047657, 7585514, 2631127, 10523660, 16502777, 	\
	11557986, 8987686, 13022173, 14628928, 9718195, 13554622, 15171661, 12336016, 	\
	16099851, 15126910, 2966453, 3430916, 6203867, 500226, 815412, 4573693, 	\
	6216202, 3211667, 6828228, 6466109, 3889586, 11550787, 15439708, 8567981, 	\
	9514594, 14219259, 8569993, 9002836, 15732711, 16497706, 10676081, 15292100, 	\
	16174367, 4165610, 341217, 5006652, 1572495, 1854546, 4527521, 3049129, 	\
	4177238, 7695495, 7262744, 2593145, 8129190, 13974295, 9363656, 8778385, 	\
	14240566, 9607407, 11240216, 14709505, 12282079, 11717500, 15274149, 14746066, 	\
	9616203, 5892276, 4223349, 721514, 1218715, 7940420, 2324205, 3077562, 	\
	7702115, 8134357, 494860, 5174955, 5597170, 10452009, 13012636, 12916551, 	\
	12346402, 12054457, 15531332, 10814615, 11474826, 14060649, 14253493, 8546062, 	\
	13349979, 5279120, 1640997, 6549758, 6874055, 3242512, 3803609, 7049838, 	\
	16951, 1800648, 5499481, 4764599, 8458598, 14568057, 16120200, 11296855, 	\
	15152126, 16746925, 11835440, 9391043, 13037582, 10330421, 9711584, 13048891, 	\
	5097359, 3438276, 8350777, 6733738, 2721367, 7492868, 5983881, 130674, 	\
	538019, 5449372, 1613133, 118210, 15365691, 15967597, 11582676, 15208211, 	\
	14898634, 10011773, 9546532, 13514971, 8889178, 10277797, 14043380, 11500399, 	\
	2400914, 8204305, 7752557, 3005118, 4509987, 6169304, 2076829, 305446, 	\
	5200627, 409896, 4043013, 7383766, 11155759, 10601656, 16304064, 13851919, 	\
	9055902, 12695393, 14304496, 9592463, 9031502, 15250641, 11740968, 12123775, 	\
	6413510, 2770689, 1447128, 6139362, 4636215, 1000668, 5559625, 6131250, 	\
	2506159, 2892668, 7725713, 12474754, 10963583, 12882852, 14655793, 9861722, 	\
	13421454, 12703797, 10093292, 15937979, 15251474, 10742725, 12210300, 7372971, 	\
	629698, 141405, 5861772, 5292659, 727138, 4857740, 7382613, 3929538, 	\
	6713275, 7200360, 3442117, 10425886, 12873547, 9240048, 9946661, 14550414, 	\
	12950739, 11447840, 16217532, 16540799, 12427010, 15142033, 13374568, 1173431, 	\
	1768502, 4414281, 525208, 1282087, 8086526, 6322937, 2746624, 7508950, 	\
	7930479, 55600, 781041, 13853006, 9441695, 9145060, 12982633, 12411034, 	\
	11858503, 15706452, 15014057, 12321634, 14143702, 13532813, 8744728, 1873123, 	\
	5736230, 876317, 2419904, 8386323, 4073130, 2432365, 6983444, 5465227, 	\
	1668474, 4239028, 13343909, 9438554, 10049219, 14871860, 11222141, 11609834, 	\
	16422163, 10736328, 8940541, 14284854, 13804259, 9245529, 4540420, 6216695, 	\
	3629946, 2896009, 6794196, 4098119, 3494330, 5071665, 4634820, 1911199, 	\
	5509646, 6275297, 8837435, 15034894, 16495061, 11712000, 11095723, 14704118, 	\
	10216965, 9484184, 13184107, 12836454, 10143677, 13718600, 6963155, 2338211, 	\
	7877740, 7423989, 2874370, 961883, 5586940, 2008101, 513522, 5000907, 	\
	5590036, 4109301, 14983786, 15563163, 11979397, 16765532, 12853695, 9386530, 	\
	9874257, 14438796, 8999447, 8554994, 16365737, 15737628, 2879943, 6473738, 	\
	7871289, 1253605, 4895062, 4320143, 1591520, 1300337, 4753070, 2112607, 	\
	3895104, 7796385, 15025534, 11411175, 14134288, 14464329, 8681199, 9422134, 	\
	13934057, 10292952, 10892563, 15721638, 11853693, 4066560, 7837331, 5023582, 	\
	354477, 5405616, 5882699, 4255, 658196, 7600737, 3727546, 2315023, 	\
	6981844, 11639261, 9974314, 12738803, 13367620, 9472525, 14356978, 12747107, 	\
	11401917, 12347724, 16142915, 11371450, 10751341, 6258420, 1501063, 914506, 	\
	4591345, 6168356, 1428543, 7108554, 6775809, 3972285, 3514350, 6947859, 	\
	193936, 9563725, 14302270, 12780963, 8951384, 15814041, 16416646, 10610295, 	\
	15303144, 15866384, 12274647, 8450510, 13328953, 1194976, 1935455, 4559390, 	\
	6701537, 4057200, 7650223, 7274694, 2494549, 8244136, 5732474, 926055, 	\
	373388, 13404185, 9919458, 12341943, 15066412, 15415241, 11669010, 16375087, 	\
	15255292, 8615681, 14200194, 13745754, 722213, 148660, 7994971, 3288522, 	\
	2831509, 6326124, 7986427, 3361810, 5011269, 4564188, 1982243, 1531890, 	\
	12894424, 11531021, 12004086, 16562539, 10863416, 11424405, 16075078, 14465723, 	\
	8888744, 13574501, 13949598, 10471691, 2240624, 6890148, 3193135, 3360982, 	\
	6904577, 2146360, 1815279, 5389062, 4844697, 186312, 5982071, 7421094, 	\
	11054921, 10729040, 16270726, 11919231, 11439352, 13051265, 10303058, 10415567, 	\
	13065524, 13370993, 11908554, 16690207, 6782628, 2999801, 2545210, 8331142, 	\
	1321045, 914088, 4383667, 1661042, 1084301, 6992668, 6496355, 3177386, 	\
	16500797, 14811588, 11080595, 9480234, 14350820, 8481365, 8966154, 13861851, 	\
	16398948, 10840485, 15655646, 7787075, 4001168, 6594157, 4712302, 1864849, 	\
	1404489, 5152222, 394423, 4011808, 7798233, 7334918, 2365367, 16581880, 	\
	15899945, 8941458, 12678223, 14337852, 9674417, 8916067, 15460254, 11727493, 	\
	12085616, 14752443, 15368750, 3215701, 5794496, 4454699, 688630, 5509829, 	\
	6099228, 2549963, 2980707, 7610684, 4165837, 3050322, 6576259, 14672748, 	\
	9892725, 14485634, 12847899, 9426636, 11822245, 16547646, 10989259, 11179281, 	\
	15795764, 12213487, 8645938, 4732545, 5248476, 1281343, 4775586, 6382961, 	\
	3863564, 3387287, 6823282, 2246377, 3921849, 5270598, 864223, 8819512, 	\
	14532705, 13917142, 11495951, 15186112, 16524145, 12521518, 10930655, 15587904, 	\
	9711753, 10461631, 4561510, 805269, 1528072, 8053315, 6371766, 2763309, 	\
	7590872, 7979395, 2116134, 737277, 5940256, 1119763, 9064415, 12835884, 	\
	16361397, 11547882, 15445083, 14733204, 12407909, 16123386, 13614755, 8760404, 	\
	10376669, 14140970, 843123, 2437069, 7747100, 8254931, 3491554, 7232313, 	\
	6793612, 1880647, 5710618, 4905129, 117364, 1642887, 15868042, 11119440, 	\
	10549413, 16465982, 15913803, 11118720, 13318461, 13787886, 10080439, 12602112, 	\
	13310665, 11579766, 3793831, 6782712, 3067224, 3511943, 8267646, 4668777, 	\
	847536, 5625175, 6227150, 822973, 2473312, 8283355, 12023582, 11324421, 	\
	15015152, 12529450, 9499799, 13232084, 12738313, 10198202, 13666151, 15413772, 	\
	10709401, 3734338, 7438515, 2232620, 2730565, 5306834, 1794314, 131837, 	\
	4757988, 5703691, 4092634, 6676837, 7141940, 11996139, 12324938, 15000213, 	\
	9403372, 9861247, 13992882, 10393408, 8850525, 15531942, 16049203, 12531192, 	\
	14684045, 6921238, 3302891, 1795640, 4257045, 691654, 1252891, 5784992, 	\
	2225776, 2780703, 7937422, 7374417, 2807784, 14908591, 14216790, 9941953, 	\
	9306136, 12917615, 10275302, 11956249, 15672264, 14981362, 12556583, 16139244, 	\
	13463633, 321794, 5651199, 6094956, 316321, 1034906, 7502159, 3777204, 	\
	2261553, 6953450, 7425686, 1636101, 4400380, 13123131, 9538818, 14343381, 	\
	12732172, 10565043, 12238066, 15929165, 11031710, 10601795, 14614392, 13905084, 	\
	898887, 4638418, 6249609, 1331040, 7317239, 6698254, 2886233, 3529440, 	\
	8306991, 865022, 272833, 6273297, 14041774, 8999271, 12834992, 16427913, 	\
	11612506, 11059367, 14932772, 12077177, 9515906, 13345559, 8583420, 10046377, 	\
	5292563, 4427982, 2633565, 7421488, 8375779, 2512478, 2950277, 5684692, 	\
	2076283, 292266, 5100885, 1560140, 10231195, 15017075, 15661028, 12045597, 	\
	16014914, 15697891, 8893500, 9990061, 13725650, 9098243, 8455080, 14170741, 	\
	3385382, 2880411, 6307913, 8100260, 3312319, 4796522, 4223377, 1829380, 	\
	1694063, 4194802, 1028609, 3598812, 16612063, 15090470, 11506169, 16061001, 	\
	14428950, 8911063, 13428328, 12916657, 10390598, 9944927, 15557784, 10908769, 	\
	3641334, 7900303, 6362388, 714481, 5504043, 5861182, 136901, 4949256, 	\
	5275579, 3763942, 2290997, 15308424, 11603779, 12197174, 12837549, 12611960, 	\
	10168515, 14064267, 13468028, 8745189, 16706322, 16115915, 11276484, 2556725, 	\
	8313066, 1403739, 948756, 4628677, 6132602, 1329827, 5208533, 7140188, 	\
	3220111, 8001842, 6458985, 11130268, 9594135, 14401250, 8433081, 8983588, 	\
	13780695, 14216474, 10583080, 15345653, 15963182, 12111503, 11231184, 4613217, 	\
	1882046, 1388399, 5119168, 382873, 1893998, 7814647, 8301312, 2396232, 	\
	7160279, 7756326, 1944057, 8663496, 13566467, 9880030, 9492589, 13330992, 	\
	10629523, 12165710, 15752085, 15419552, 10539642, 14197663, 13842436, 695161, 	\
	115626, 5919799, 1257428, 2669581, 6300986, 4151267, 3984508, 6675869, 	\
	5121730, 1516914, 14474669, 12996196, 9393491, 9741962, 16629373, 10907108, 	\
	11392651, 16041818, 16649409, 8863284, 13149999, 14405826, 1198864, 4823437, 	\
	4237566, 3814179, 3235976, 6871389, 2317062, 3801267, 5353848, 4909705, 	\
	153622, 5882735, 13669048, 9120048, 14957255, 16114398, 12501281, 10951408, 	\
	15567743, 9745422, 10446545, 13917544, 13470911, 8787958, 6235461, 7732376, 	\
	3080034, 6767719, 8164764, 3247881, 687314, 4810671, 1168940, 1739985, 	\
	4398850, 4761245, 11789804, 16414243, 14749338, 11114824, 11665941, 14250406, 	\
	8448107, 9165456, 14025093, 10326142, 9436155, 15100192, 8220765, 3441614, 	\
	7313459, 6581233, 1962984, 1564695, 5118918, 330361, 1998904, 5731303, 	\
	2910302, 10599817, 16484016, 15733879, 10579342, 13303321, 13854145, 9967022, 	\
	8625727, 13356484, 9467409, 12183306, 14859751, 2821684, 3151753, 8119514, 	\
	4683527, 798636, 5606521, 6199107, 869526, 292973, 8367072, 3616947, 	\
	3932490, 15194845, 15657012, 9789795, 14463738, 13076741, 9264084, 13648507, 	\
	14414123, 10627764, 11090765, 16417178, 11784883, 2653028, 4204701, 6009350, 	\
	1048915, 4807864, 4378413, 3929302, 7349387, 6995737, 2346228, 3949863, 	\
	7697946, 9350337, 8732484, 13913791, 14603758, 8898385, 15482496, 16199023, 	\
	12498550, 15030177, 15486297, 11976398, 10331431, 4468856, 772841, 1235222, 	\
	5849223, 6304744, 2271281, 7948450, 7361375, 2867228, 6470561, 5843579, 	\
	9580686, 9094037, 12671568, 9963947, 11776822, 15512133, 15026584, 12507675, 	\
	16155110, 15545845, 9317900, 8912339, 6079571, 1398444, 951805, 6597698, 	\
	4030347, 3556476, 7329381, 6557618, 3882059, 5416900, 4782005, 85038, 	\
	10133499, 13735425, 10495244, 11239423, 15910946, 12112305, 10683084, 15382791, 	\
	13756850, 9990761, 12796188, 13404311, 1317442, 4153784, 6746785, 3001174, 	\
	3545311, 7832072, 2929649, 289006, 6257439, 5673936, 884801, 4594494, 	\
	16772327, 11861328, 11093912, 14881999, 12094838, 11632301, 13268232, 12838227, 	\
	10002086, 14355773, 12818152, 11069059, 7437598, 7999213, 2201392, 2655266, 	\
	7565007, 1834772, 304289, 5183354, 5638443, 1955972, 6579037, 15692010, 	\
	10848691, 16030548, 16732365, 10904338, 9304674, 14035197, 10425116, 8749763, 	\
	13433306, 15952425, 12104436, 6390103, 6947338, 3365273, 7989348, 4354751, 	\
	206234, 1612864, 5361589, 685358, 2188387, 7978896, 7478285, 11225086, 	\
	14997287, 16641064, 9846745, 9283142, 12948663, 10375144, 9928288, 15508887, 	\
	11478606, 11934841, 16633248, 6673999, 3039708, 5585025, 6072946, 217595, 	\
	671756, 5372757, 3914186, 2236986, 6919093, 3197124, 3889947, 14691202, 	\
	12693621, 10167228, 13785739, 13224018, 8561577, 12267580, 16001399, 11393666, 	\
	10896408, 16537061, 11906790, 965947, 4679112, 5035605, 1563950, 5648107, 	\
	7092080, 2467205, 4087518, 7688047, 2921633, 2336600, 5914447, 13663382, 	\
	9160545, 12735720, 14232727, 11583238, 15458521, 14831928, 12110503, 12294366, 	\
	14819593, 9003665, 1110386, 6015791, 4201108, 827713, 7844538, 8285119, 	\
	2447716, 7242457, 7803658, 3946615, 322292, 5230889, 10240219, 9804742, 	\
	13544493, 15168764, 12347235, 16178194, 15437261, 10487396, 16381107, 13823818, 	\
	9002589, 8390020, 5936939, 1257211, 2653572, 6546965, 7509966, 3743011, 	\
	6327856, 7009741, 1139742, 6053523, 4688352, 954429, 9790342, 16707667, 	\
	11987065, 11340716, 14946423, 16745418, 11827865, 13461616, 13538279, 9863742, 	\
	10295617, 12905424, 2880063, 3158510, 7932529, 2267401, 2802126, 7435895, 	\
	5959072, 236697, 4720198, 5330311, 1764412, 2715497, 14759058, 12224007, 	\
	11771852, 15486129, 10975011, 10397662, 13966349, 13438720, 8836347, 14546286, 	\
	16019349, 3128532, 2526571, 8213170, 3621221, 2554332, 5057179, 1315171, 	\
	2085628, 4246061, 4815186, 3351251, 8041260, 14747893, 11164386, 11789083, 	\
	16298136, 8465253, 9144630, 13684874, 14238529, 9074836, 14920111, 16267130, 	\
	12010625, 7331084, 6614623, 4011426, 1455921, 6262476, 286151, 1000982, 	\
	5748456, 8170873, 2440838, 7260111, 8246392, 11806369, 13577590, 12827743, 	\
	9979776, 9655665, 13290734, 8502207, 12066900, 15954368, 15321915, 10508326, 	\
	16462837, 5415448, 637067, 4344822, 5493293, 1671576, 277075, 7285254, 	\
	3469757, 4047456, 6703490, 7321627, 1417804, 14578165, 13060138, 9232331, 	\
	9766356, 14562309, 10874874, 10812515, 16668420, 11765725, 11058282, 12791730, 	\
	5930725, 1164364, 4757399, 4329058, 1686905, 3204796, 7037959, 2252250, 	\
	3772073, 7353652, 681207, 653834, 13945104, 14618853, 8815422, 13482395, 	\
	15104576, 12477211, 11899054, 15502197, 10959824, 10281099, 14021470, 9308901, 	\
	399400, 6128474, 5660871, 2586900, 6867689, 7442658, 3801363, 2162380, 	\
	4844925, 1209634, 1771179, 4228444, 9150085, 9596850, 16315754, 14780069, 	\
	11149076, 15797451, 15792058, 9398069, 8813804, 14458655, 9929730, 9327857, 	\
	4583228, 8191119, 3605970, 7082568, 6604989, 4192630, 5661251, 5087640, 	\
	432965, 2034422, 5788091, 57928, 11221969, 15862030, 16355951, 10666993, 	\
	15431680, 13663135, 10002918, 12783649, 13126584, 9558095, 10153110, 6502313, 	\
	2655336, 3579827, 7818758, 7103581, 374697, 5123618, 5578239, 1886092, 	\
	4707857, 5189106, 3423855, 12551444, 15095233, 11361882, 11857343, 14660836, 	\
	12658269, 8445323, 14403666, 13783925, 8986796, 10664531, 16452546, 3227677, 	\
	2675516, 6531811, 1587226, 1123213, 4903652, 4409651, 1661867, 5677144, 	\
	7319813, 2906798, 3524987, 16701856, 10822293, 9253198, 14085283, 10444336, 	\
	8668525, 13612766, 14069507, 12397801, 15030012, 15648519, 12000470, 3682137, 	\
	4437792, 189687, 1662798, 5360793, 697680, 79719, 7892158, 7593217, 	\
	2803409, 6362526, 8104239, 9616116, 9003273, 12603930, 10459895, 9709860, 	\
	12923577, 15721410, 10934279, 16583356, 16159593, 11509811, 4486030, 6121805, 	\
	1558768, 824227, 4530298, 2030021, 3664644, 6836475, 6489578, 3907093, 	\
	7876036, 4290379, 9106995, 13733348, 14163549, 8627866, 9106819, 15756924, 	\
	12279725, 10650646, 15308371, 15756680, 10480693, 12908518, 4982170, 2038809, 	\
	5697476, 5076031, 2384170, 4168657, 7637012, 2888623, 2617974, 6219873, 	\
	5585800, 920159, 13079014, 14213808, 9468521, 11266502, 14717463, 11600232, 	\
	12208377, 14940710, 8937935, 9580760, 14388001, 12622258, 615503, 5437188, 	\
	7974032, 2105195, 3020734, 7849109, 3997512, 1519259, 5149734, 886645, 	\
	1334936, 6188291, 12973782, 11281453, 16190780, 16703186, 10863939, 11433148, 	\
	14036709, 10329458, 8389275, 13325132, 9494901, 1686186, 6962027, 6455508, 	\
	3789701, 7490426, 7043298, 41761, 1642524, 5392591, 711472, 127145, 	\
	5906894, 12007959, 11323520, 15028601, 16663206, 11843975, 12955480, 13506184, 	\
	9946419, 10276470, 13057933, 9315600, 11843267, 8212478, 6708285, 3000256, 	\
	7386459, 5975086, 155637, 4838512, 5457034, 1720279, 633956, 6340029, 	\
	3884666, 11587651, 15305628, 14891565, 10101218, 13747123, 13261324, 8849885, 	\
	14463522, 16098218, 12548573, 10766852, 15585683, 4063338, 3619617, 5044628, 	\
	4702287, 2053082, 5540001, 5093484, 2499551, 8221698, 7393104, 2858749, 	\
	2303014, 16295891, 9567944, 9063737, 12654582, 13665903, 10173720, 14905025, 	\
	15267190, 11781567, 12195369, 14794064, 11070607, 1537598, 6112753, 302240, 	\
	1019679, 5648582, 8249893, 2554680, 7276747, 8192790, 3453581, 3107049, 	\
	12876658, 10338951, 9867612, 13568833, 8779938, 12247423, 15954636, 15210897, 	\
	10586442, 16446187, 15819060, 9041989, 690907, 5444922, 1574629, 262012, 	\
	6978571, 3221138, 3774325, 6458540, 7176115, 3468866, 6288541, 5637948, 	\
	9247847, 8900027, 14608136, 11891925, 10792374, 15703595, 16123344, 12416325, 	\
	15134222, 13515259, 9765472, 14193309, 4446670, 551495, 3257265, 8036456, 	\
	2235103, 2706310, 7532617, 7595000, 538919, 4294742, 5948361, 1069088, 	\
	13199799, 14859246, 12525593, 11800961, 15714922, 10943807, 12330916, 13973073, 	\
	13540762, 8736423, 14442100, 14673321, 2536986, 7081303, 7855340, 4113977, 	\
	2454979, 6827222, 1290013, 1594860, 4211827, 4972426, 1223901, 16332628, 	\
	14813091, 11262074, 15747909, 15741572, 11251803, 8432619, 14244532, 9617677, 	\
	9425614, 12855347, 15481120, 3654397, 8147206, 6637699, 3058424, 3649837, 	\
	6037686, 416578, 510217, 6034100, 1385319, 3060986, 6672153, 16539456, 	\
	11703551, 15443758, 14696145, 10185936, 9623311, 13190390, 8396128, 10137113, 	\
	15856862, 11031879, 11226808, 7511529, 7939158, 2242199, 4975884, 5627505, 	\
	1835938, 495887, 5024476, 3500960, 4083763, 6800366, 2988805, 11937808, 	\
	16774123, 12902462, 8738981, 14551880, 13996123, 9269666, 10644085, 16505068, 	\
	11569538, 11211347, 14852588, 7994175, 1142354, 4855241, 4425244, 1609703, 	\
	5471730, 6481433, 2742208, 3214423, 8003374, 2483640, 11301969, 13070214, 	\
	14589087, 9802848, 13576113, 13040670, 12447183, 15996592, 15664169, 10788846, 	\
	12446231, 16740612, 435192, 887395, 5380518, 5989085, 62280, 6908339, 	\
	7543406, 3703149, 6410384, 6972227, 3406334, 1620133, 12780352, 9113818, 	\
	10020875, 13761396, 15343861, 10851082, 16551571, 16211140, 11495229, 10806970, 	\
	14630211, 9834396, 906893, 4515186, 2064050, 3517705, 7116116, 6768295, 	\
	3562810, 8256761, 6596292, 734495, 1150186, 5824353, 8610868, 9057999, 	\
	15838043, 12196000, 10699757, 15254142, 15792263, 12266320, 12597865, 13222310, 	\
	10113815, 9660616, 6076697, 2531878, 3080687, 7657753, 4049536, 2503127, 	\
	7152190, 5552801, 1984848, 4674059, 5023646, 9944181, 12467880, 15550363, 	\
	10802246, 12210165, 15809593, 15246442, 8640471, 14306316, 13753849, 9086962, 	\
	12723239, 7945692, 3198533, 2839842, 6293499, 3784300, 3321237, 4347403, 	\
	5063274, 1495477, 6240772, 4467675, 3010690, 16171557, 16669180, 10848271, 	\
	11449106, 16212425, 10246188, 8768439, 13500611, 13906200, 10333085, 15399014, 	\
	14893947, 3674760, 7571797, 6962166, 2123435, 1693040, 5430977, 593438, 	\
	46591, 6022881, 7503160, 2641103, 6526550, 16418097, 12401832, 13954935, 	\
	13616518, 8656009, 10227576, 14138535, 9332510, 10843981, 16680065, 16228146, 	\
	11274991, 6680732, 6288129, 1329866, 858431, 4620836, 1306833, 1599818, 	\
	6552199, 2851316, 3149933, 7932571, 14870866, 9007309, 13632444, 14391651, 	\
	8620754, 8942365, 13754468, 12255219, 10555178, 15467677, 12572628, 12054059, 	\
	5012667, 4687712, 2003989, 5590430, 5013099, 517296, 4011437, 7609934, 	\
	3116435, 2554912, 8218237, 1488262, 9145858, 13180889, 13649260, 10220087, 	\
	12643278, 15280201, 11703184, 12305383, 14776446, 11168641, 9678912, 14155871, 	\
	4266926, 706672, 5370321, 6107790, 3549239, 6789600, 7094841, 3633434, 	\
	4107207, 4569660, 852393, 1496818, 14536471, 12873100, 9385584, 16164643, 	\
	16604348, 10964829, 15398274, 15836219, 9451368, 9112773, 12639254, 10049483, 	\
	1254640, 4898085, 6401742, 3691610, 7587585, 6881012, 2174319, 5976962, 	\
	5423825, 608588, 416447, 14655782, 10269001, 10840728, 15620391, 16040182, 	\
	12399544, 15083777, 13613270, 9753391, 10436792, 13015793, 9218830, 1388703, 	\
	8282976, 2218545, 2640058, 7550791, 7513812, 585128, 4415355, 5917910, 	\
	1152261, 534104, 4406755, 12119334, 11589341, 15402440, 10664979, 11124458, 	\
	14050669, 14636564, 8687490, 12852315, 14624420, 9762725, 11390042, 6708107, 	\
	4133428, 3449069, 7240618, 485395, 1888708, 5604157, 5118006, 240098, 	\
	5829145, 7487884, 2820599, 11049586, 15835561, 12218964, 8514119, 13146554, 	\
	13763193, 10163140, 12640415, 13336139, 11689968, 16352305, 14980942, 3042519, 	\
	3537920, 6088617, 463998, 396551, 6135704, 5694537, 943526, 6659767, 	\
	8162633, 3610512, 7104035, 15072622, 10383037, 9573888, 13206995, 8575726, 	\
	10189605, 13689072, 14783051, 11143454, 15816949, 16376681, 2290106, 4925639, 	\
	5282644, 1802429, 147810, 4815699, 108684, 4070237, 7668466, 7131435, 	\
	2616092, 8288965, 14524691, 8754874, 13524717, 13978900, 10286731, 8889674, 	\
	15604785, 11898532, 12571999, 15099010, 15286177, 9481596, 5965039, 4216595, 	\
	642120, 1294317, 5383990, 2692323, 2281432, 8084997, 3170790, 2732927, 	\
	4438696, 5786065, 9556574, 13557935, 13056369, 10234432, 12030367, 15679518, 	\
	10769121, 11909560, 16689167, 8729558, 9191701, 14146088, 6253555, 274438, 	\
	5219229, 7789529, 3755042, 2148287, 7059020, 3222593, 1605554, 4441199, 	\
	677364, 1650305, 13810762, 13346299, 10573348, 16276989, 15961803, 12203522, 	\
	10561013, 13565548, 9948987, 10311106, 12887629, 5226428, 1337507, 8209234, 	\
	7262621, 2557956, 8207222, 7774379, 1044504, 279509, 6101134, 1485115, 	\
	602848, 12611605, 16435998, 11770563, 15204720, 14922669, 12249694, 13728086, 	\
	12599977, 9081720, 9514471, 14184070, 8648025, 2802920, 7413559, 7998830, 	\
	2536649, 7169808, 5536999, 2067710, 4495136, 5059715, 1503066, 2031149, 	\
	7161012, 10884939, 12553866, 16055701, 15558500, 8836795, 14453010, 13699653, 	\
	9075100, 8642858, 16282355, 11602260, 11180045, 6325206, 3764579, 3860664, 	\
	4430813, 4722758, 1245883, 5962600, 5302389, 2716566, 2523722, 8231153, 	\
	3427236, 11498095, 15136218, 10227457, 9903160, 13534703, 12973606, 9727377, 	\
	16760264, 14976567, 11277734, 12012616, 8318617, 2209158, 657015, 5480360, 	\
	1625089, 30290, 4941775, 7386172, 3739633, 6446794, 7065631, 3728324, 	\
	11679856, 13338939, 8426438, 10043477, 14055848, 9284347, 10793334, 16646541, 	\
	16239196, 11327843, 15164082, 16659005, 1411524, 809618, 5194539, 1569004, 	\
	1878581, 6765442, 7230683, 3262244, 7888037, 6499418, 2733835, 5276816, 	\
	14376301, 8572910, 9024658, 13772097, 12267228, 10607911, 14700386, 16471769, 	\
	11576588, 16367319, 12734202, 9393449, 5621456, 6175559, 473151, 2925296, 	\
	7721313, 4081822, 2472719, 7184752, 7745713, 1526574, 5036247, 4653440, 	\
	10363705, 14006526, 15330087, 10637853, 12141000, 15776547, 11217590, 10645965, 	\
	14271056, 13884547, 9051502, 4302461, 5813632, 3894363, 2121422, 6915493, 	\
	3355761, 4073418, 6683923, 839236, 1525741, 6034490, 4566915, 9404244, 	\
	16147517, 16635810, 10915443, 11484556, 16050077, 11919475, 9394602, 12847677, 	\
	10063940, 9576855, 13335098, 6351329, 3903668, 7537167, 6830554, 2226801, 	\
	3826476, 5329375, 559683, 236416, 4350205, 1635182, 3402647, 15603784, 	\
	15008713, 12362934, 16252007, 15495128, 8690689, 10454278, 14030591, 9268265, 	\
	8846736, 16721615, 15996174, 2924209, 7335520, 7632155, 3794582, 4366181, 	\
	4918712, 1070763, 1763158, 4455581, 2633513, 3244402, 8032487, 14904092, 	\
	11040985, 15900898, 14357311, 8390892, 12704085, 14344850, 9793771, 11311988, 	\
	15108741, 12538187, 3433306, 7338661, 6727996, 1905355, 5555074, 5167381, 	\
	355052, 6040887, 7836674, 2492361, 2972956, 7531686, 12236795, 10560520, 	\
	13147269, 13881206, 9983019, 12679096, 13282885, 11705550, 12142395, 14866016, 	\
	11267569, 10501918, 7939780, 1742321, 282154, 5065215, 5681492, 2073097, 	\
	6560250, 7293031, 3593108, 3940761, 6633538, 3058615, 9814060, 14439004, 	\
	8899475, 9353226, 13902845, 15815332, 11190275, 14769114, 16263693, 11776308, 	\
	11187179, 12667914, 1793429, 1214052, 4797818, 11683, 3923520, 7390685, 	\
	6902958, 2338419, 7777768, 8222221, 411478, 1039587, 13897272, 10303477, 	\
	8905926, 15523610, 11882153, 12457072, 15185695, 15476878, 12024145, 14664608, 	\
	12882111, 8980830, 1751681, 5366040, 2642927, 2312886, 8096016, 7355081, 	\
	2843158, 6484263, 5884652, 1055577, 4923522, 12710655, 8939884, 11753633, 	\
	16422738, 11371599, 10894516, 16772960, 16119019, 9176478, 13049669, 14462192, 	\
	9795371, 5137954, 6802901, 4038412, 3409595, 7304690, 2420237, 4030108, 	\
	5375298, 4429491, 634300, 5405765, 6025874, 10518795, 15276152, 15862709, 	\
	12185870, 10608859, 15348672, 9668661, 10001406, 12804930, 13262865, 9829356, 	\
	16583279, 7213490, 2474945, 3996252, 7825831, 963174, 360569, 6166920, 	\
	1474071, 910831, 4502568, 8326705, 3448262, 15582239, 14841760, 12217825, 	\
	10075678, 12720015, 9126992, 9502521, 14282666, 8533079, 11044741, 15851160, 	\
	16403827, 3373030, 6857757, 4435272, 1710803, 1361974, 5108205, 402128, 	\
	1521923, 8161534, 2577021, 3031461, 16055002, 16628555, 8782244, 13488693, 	\
	13945706, 10451091, 8790788, 13415405, 11765946, 12213027, 14794972, 15245325, 	\
	3882791, 5246194, 4773129, 214676, 5913799, 5352810, 702137, 2311492, 	\
	7888471, 3202714, 2827617, 6305524, 14536591, 9887067, 13584080, 13416233, 	\
	9872638, 14630855, 14961936, 11388153, 11932518, 16590903, 10795144, 9356121, 	\
	5722294, 6048175, 506489, 4857984, 5337863, 3725950, 6474157, 6361648, 	\
	3711691, 3406222, 4868661, 87008, 9994587, 13777414, 14232005, 8446073, 	\
	15456170, 15863127, 12393548, 15116173, 15692914, 9784547, 10280860, 13599829, 	\
	276418, 1965627, 5696620, 7296981, 2426395, 8295850, 7811061, 2915364, 	\
	378267, 5936730, 1121569, 8990140, 12776047, 10183058, 12064913, 14912366, 	\
	15372726, 11624993, 16382792, 12765407, 8978982, 9442297, 14411848, 195335, 	\
	877270, 7835757, 4098992, 2439363, 7102798, 7861148, 1316961, 5049722, 	\
	4691599, 2024772, 1408465, 13561514, 10982719, 12322516, 16088585, 11267386, 	\
	10677987, 14227252, 13796508, 9166531, 12611378, 13726893, 10200956, 2104467, 	\
	6884490, 2291581, 3929316, 7350579, 4954970, 229569, 5787956, 5597934, 	\
	981451, 4563728, 8131277, 12044670, 11528739, 15495872, 12001629, 10394254, 	\
	12913651, 13389928, 9953933, 14530838, 12855366, 11506617, 15912992, 7957703, 	\
	2244510, 2860073, 5281264, 1591103, 253070, 4255697, 5846560, 1189311, 	\
	7065462, 6315584, 12215705, 15971946, 15249143, 8723900, 10405449, 14013906, 	\
	9186343, 8797820, 14661081, 16039938, 10836959, 15657452, 7712800, 3941331, 	\
	415818, 5229333, 1332132, 2044011, 4369306, 653829, 3162460, 8016811, 	\
	6400546, 2636245, 15934092, 14340146, 9030115, 8522284, 13285661, 9544902, 	\
	9983603, 14896568, 11066597, 11872086, 16659851, 15134328, 909173, 5657775, 	\
	6227802, 311233, 863412, 5658495, 3458754, 2989329, 6696776, 4175103, 	\
	3466550, 5197449, 12983384, 9994503, 13709991, 13265272, 8509569, 12108438, 	\
	15929679, 11152040, 10550065, 15954242, 14303903, 8493860, 4753633, 5452794, 	\
	1762063, 4247765, 7277416, 3545131, 4038902, 6579013, 3111064, 1363443, 	\
	6067814, 13042877, 9338700, 14544595, 14046650, 11470381, 14982901, 16645378, 	\
	12019227, 11073524, 12684581, 10100378, 9635275, 4781076, 4452277, 1777002, 	\
	7373843, 6915968, 2784333, 6383807, 7926690, 1245273, 728012, 4246023, 	\
	2093170, 9855977, 13474324, 14981575, 12520170, 16085561, 15524324, 10992223, 	\
	14551439, 13996512, 8839793, 9402798, 13969431, 1868624, 2560425, 6835262, 	\
	7471079, 3859600, 6501913, 4820966, 1104951, 1795853, 4220632, 637971, 	\
	3313582, 16455421, 11126016, 10682259, 16460894, 15742309, 9275056, 13000011, 	\
	14515662, 9823765, 9351529, 15141114, 12376835, 3654084, 7238397, 2433834, 	\
	4045043, 6212172, 4539149, 848050, 5745505, 6175420, 2162823, 2872131, 	\
	15878328, 12138797, 10527606, 15446175, 9459976, 10078961, 13890982, 13247775, 	\
	8470224, 15912193, 16504382, 10503918, 2735441, 7777944, 3942223, 349302, 	\
	5164709, 5717848, 1844443, 4700038, 7261309, 3431656, 8193795, 6730838, 	\
	11484652, 12349233, 14143650, 9355727, 8401436, 14264737, 13826938, 11092523, 	\
	14700932, 16484949, 11676330, 15217075, 6546020, 1760140, 1116187, 4731618, 	\
	762301, 1079324, 7883715, 6787154, 3051565, 7678972, 8322135, 2606474, 	\
	13391833, 13896804, 10469302, 8676955, 13464896, 11980693, 12553838, 14947835, 	\
	15083152, 12582413, 15748606, 13178403, 165152, 1686745, 5271046, 716214, 	\
	2348265, 7866152, 3348887, 3860558, 6386617, 6832288, 1219431, 5868446, 	\
	13135881, 8876912, 10414827, 16062734, 11273172, 10916033, 16640314, 11827959, 	\
	11501636, 13013273, 14486218, 1468791, 5173436, 4580041, 3939666, 4165255, 	\
	6608700, 2712948, 3309187, 8032026, 70893, 661300, 5500731, 14220490, 	\
	8464149, 15373476, 15828459, 12148538, 10644613, 15447388, 11568682, 9637027, 	\
	13557104, 8775373, 10318230, 5646947, 7183080, 2375965, 8344134, 7793627, 	\
	2996520, 2560741, 6194135, 1431562, 814033, 4665712, 5546031, 12163998, 	\
	14895169, 15388816, 11658047, 16394342, 14883217, 8962568, 8475903, 14380983, 	\
	9616936, 9020889, 14833158, 8113719, 3210748, 6897185, 7284626, 3446223, 	\
	6147692, 4611505, 1025130, 1357663, 6237573, 2579552, 2934779, 16082054, 	\
	16661589, 10857416, 15519787, 14107634, 10476229, 12625948, 12792707, 10101346, 	\
	11655485, 15260301, 2302546, 3781019, 7383724, 7035253, 147842, 5870107, 	\
	5384564, 735397, 127806, 7913931, 3627216, 2371389, 15578351, 11953778, 	\
	12539649, 12963036, 13541239, 9905826, 14460153, 12975948, 11423367, 11867510, 	\
	16623593, 10894480, 3108167, 7657167, 1819960, 662817, 4275934, 5825807, 	\
	1209472, 7031793, 6330670, 2859671, 3306304, 7989257, 10541754, 9044839, 	\
	13697181, 10009496, 8612451, 13529334, 16089901, 11966544, 15608275, 15037230, 	\
	12378365, 12015970, 4987411, 362972, 2027877, 5662391, 5111274, 2526809, 	\
	8329108, 7611759, 2752122, 6451073, 7341060, 1677023, 8556450, 13335601, 	\
	9463756, 10195982, 14814231, 15212520, 11658297, 16446854, 14778311, 11045912, 	\
	13866913, 6177398, 293199, 1043336, 6197873, 3473894, 2923070, 6810193, 	\
	8151488, 3420731, 7309806, 4593909, 1917464, 13955531, 13625462, 8657701, 	\
	12093688, 15978579, 11170694, 10578108, 15907689, 16484242, 8410143, 13160268, 	\
	12844725, 1582370, 1120203, 6987420, 2313477, 3700474, 7513131, 3128708, 	\
	2363092, 6149451, 5686450, 360037, 4992332, 14124187, 12572514, 10767865, 	\
	15728300, 11969351, 12398802, 12847913, 9427828, 9781478, 14430987, 12827352, 	\
	9079269, 7426878, 8044731, 2863424, 2173457, 7878830, 1294719, 578192, 	\
	4278665, 1747038, 1290918, 4800817, 6445784, 12308359, 16004374, 15541993, 	\
	10927992, 10472471, 14505934, 8828765, 9415840, 13909987, 10306654, 10933636, 	\
	7196529, 7683178, 4105647, 6813268, 5000393, 1265082, 1750631, 4269540, 	\
	622105, 1231370, 7459315, 7864876, 10697644, 15378771, 15825410, 10179517, 	\
	12746868, 13220739, 9447834, 10219597, 12895156, 11360315, 11995210, 16692177, 	\
	6643716, 3041790, 6281971, 5537792, 866269, 4664910, 6094131, 1394424, 	\
	3020365, 6786454, 3981027, 3372904, 15459773, 12623431, 10030430, 13776041, 	\
	13231904, 8945143, 13847566, 16488209, 10519776, 11103279, 15892414, 12182721, 	\
	4888, 4915887, 5683303, 1895216, 4682377, 5144914, 3508983, 3938988, 	\
	6775129, 2421442, 3959063, 5708156, 9339617, 8778002, 14575823, 14121949, 	\
	9212208, 14942443, 16472926, 11593861, 11138772, 14821243, 10198178, 1085205, 	\
	5928524, 746667, 44850, 5872877, 7472541, 2742018, 6352099, 8027452, 	\
	3343909, 824790, 4672779, 10387112, 9829877, 13411942, 8787867, 12422464, 	\
	16570981, 15164351, 11415626, 16091857, 14588828, 8798319, 9298930, 5552129, 	\
	1779928, 136151, 6930470, 7494073, 3828552, 6402071, 6848927, 1268328, 	\
	5298609, 4842374, 143967, 10103216, 13737507, 11192190, 10704269, 16559620, 	\
	16105459, 11404458, 12863029, 14540229, 9858122, 13580091, 12887268, 2086013, 	\
	4083594, 6609987, 2991476, 3553197, 8215638, 4509635, 775816, 5383549, 	\
	5880807, 240154, 4870425, 15811268, 12098103, 11741610, 15213265, 11129108, 	\
	9685135, 14310010, 12689697, 9089168, 13855582, 14440615, 10862768, 3113833, 	\
	7616670, 4041495, 2544488, 5193977, 1318694, 1945287, 4666712, 4482849, 	\
	1957622, 7773550, 15666829, 10761424, 12576107, 15949502, 8932677, 8492096, 	\
	14329499, 9534758, 8973557, 12830600, 16454923, 11546326, 6536996, 6972473, 	\
	3232722, 1608451, 4429980, 599021, 1339954, 6289819, 396108, 2953397, 	\
	7774626, 8387195, 10840276, 15520004, 14123643, 10230250, 9267249, 13034204, 	\
	10449359, 9767474, 15637473, 10723692, 12088863, 15822786, 6986873, 69548, 	\
	4790150, 5436499, 1830792, 31797, 4949350, 3315599, 3238936, 6913473, 	\
	6481598, 3871791, 13897152, 13618705, 8844686, 14509814, 13975089, 9341320, 	\
	10818143, 16540518, 12057017, 11446904, 15012803, 14061718, 2018157, 4553208, 	\
	5005363, 1291086, 5802204, 6379553, 2810866, 3338495, 7940868, 2230929, 	\
	757866, 13648683, 14250644, 8564045, 13155994, 14222883, 11720036, 15462044, 	\
	14691587, 12531154, 11962029, 13425964, 8735955, 2029322, 5612829, 4988132, 	\
	479079, 8311962, 7632585, 3092341, 2538686, 7702379, 1857104, 510085, 	\
	4766590, 9446131, 10162592, 12765789, 15321294, 10514739, 16491064, 15776233, 	\
	11028759, 8606342, 14336377, 9517104, 8530823, 4970846, 3199625, 3949472, 	\
	6797439, 7121550, 3486481, 8275008, 4710315, 822847, 1455300, 6268889, 	\
	314378, 11361767, 16140148, 12432393, 11283922, 15105639, 16500140, 9491961, 	\
	13307458, 12729759, 10073725, 9455588, 15359411, 2199050, 3717077, 7544884, 	\
	7010859, 2214906, 5902341, 5964700, 108795, 5011490, 5718933, 3985485, 	\
	10846490, 15612851, 12019816, 12448157, 15090310, 13572419, 9739256, 14524965, 	\
	13005142, 9423563, 16096008, 16123381, 2832111, 2158362, 7961793, 3294820, 	\
	1672639, 4300004, 4878161, 1275018, 5817391, 6496116, 2755745, 7468314, 	\
	16377815, 10648741, 11116344, 14190315, 9909526, 9334557, 12975852, 14614835, 	\
	11932290, 15567581, 15006036, 12548771, 7627130, 7180365, 461461, 1997146, 	\
	5628139, 979764, 985157, 7379146, 7963411, 2318560, 6847485, 7449358, 	\
	12193987, 8586096, 13171245, 9694647, 10172226, 12584585, 11115964, 11689575, 	\
	16344250, 14742793, 10989124, 16719287, 5555246, 915185, 421264, 6110222, 	\
	1345535, 3114080, 6774297, 3993566, 3650631, 7219120, 6624105, 10274902, 	\
	14121879, 13197388, 8958457, 9673634, 16402518, 11653597, 11198976, 14891123, 	\
	12069358, 11588109, 13353360, 4225771, 1681982, 5415333, 4919872, 2116379, 	\
	4118946, 8331892, 2373549, 2993290, 7790419, 6112684, 324669, 13549538, 	\
	14101699, 10245404, 15189989, 15654002, 11873563, 12367564, 15115348, 11100071, 	\
	9457402, 13870417, 13252228, 75359, 5954922, 7524017, 2691932, 6332879, 	\
	8108690, 3164449, 2707708, 4379414, 1747203, 1128696, 4776745, 13095078, 	\
	12339423, 16587528, 15114417, 11416422, 16079535, 16697496, 8885057, 9183998, 	\
	13973806, 10414689, 8672976, 7161099, 7773942, 4173285, 6317320, 7067355, 	\
	3853638, 1055805, 5842936, 193859, 617622, 5267404, 12291185, 10655410, 	\
	15218447, 15952988, 12246917, 14747194, 13112571, 9940740, 10287637, 12870122, 	\
	8901179, 12486836, 7670220, 3043867, 2613666, 8149349, 7670396, 1020291, 	\
	4497490, 6126569, 1468844, 1020535, 6296522, 3868697, 11795045, 14738406, 	\
	11079739, 11701184, 14393045, 12608558, 9140203, 13888592, 14159241, 10557342, 	\
	11191415, 15857056, 3698201, 2563407, 7308694, 5510713, 2059752, 5176983, 	\
	4568838, 1836505, 7839280, 7196455, 2389214, 4154957, 16161712, 11340027, 	\
	8803183, 14672020, 13756481, 8928106, 12779703, 15257956, 11627481, 15890570, 	\
	15442279, 10588924, 3803433, 5495762, 586435, 74029, 5913276, 5344067, 	\
	2740506, 6447757, 8387940, 3452083, 7282314, 15091029, 9815188, 10321707, 	\
	12987514, 9286789, 9733917, 16735454, 15134691, 11384624, 16065743, 16650070, 	\
	10870321, 4769256, 5453695, 1748614, 114009, 4933240, 3821735, 3271031, 	\
	6830796, 6500745, 3719282, 7461615, 4933948, 8564737, 10068930, 13776959, 	\
	9390756, 10802129, 16621578, 11938703, 11320181, 15056936, 16143259, 10437186, 	\
	12892549, 5189564, 1471587, 1885650, 6675997, 3030092, 3515891, 7927330, 	\
	2313693, 678997, 4228642, 6010363, 1191532, 12713877, 13157598, 11732587, 	\
	12074928, 14724133, 11237214, 11683731, 14277664, 8555517, 9384111, 13918466, 	\
	14474201, 481324, 7209271, 7713478, 4122633, 3111312, 6603495, 1872190, 	\
	1510025, 4995648, 4581846, 1983151, 5706608, 15239617, 10664462, 16474975, 	\
	15757536, 11128633, 8527322, 14222535, 9500468, 8584425, 13323634, 13670166, 	\
	3900557, 6438264, 6909603, 3208382, 7997277, 4529792, 822579, 1566318, 	\
	6190773, 331028, 958155, 7735226, 16086308, 11332293, 15202586, 16515203, 	\
	9798644, 13556077, 13002890, 10318675, 9601100, 13308349, 10488674, 11139267, 	\
	7529368, 7877188, 2169079, 4885290, 5984841, 1073620, 653871, 4360890, 	\
	1642993, 3261956, 7011743, 2583906, 12330545, 16225720, 13519950, 8740759, 	\
	14542112, 14070905, 9244598, 9182215, 16238296, 12482473, 10828854, 15708127, 	\
	3577416, 1917969, 4251622, 4976254, 1062293, 5833408, 4446299, 2804142, 	\
	3236453, 8040792, 2335115, 2103894, 14240229, 9695912, 8921875, 12663238, 	\
	14322236, 9949993, 15487202, 15182355, 12565388, 11804789, 15553314, 444587, 	\
	1964124, 5515141, 1029306, 1035643, 5525412, 8344596, 2532683, 7159538, 	\
	7351601, 3921868, 1296095, 13122818, 8630009, 10139516, 13718791, 13127378, 	\
	10739529, 16360637, 16266998, 10743115, 15391896, 13716229, 10105062, 237759, 	\
	5073664, 1333457, 2081070, 6591279, 7153904, 3586825, 8381087, 6640102, 	\
	920353, 5745336, 5550407, 9265686, 8838057, 14535016, 11801331, 11149710, 	\
	14941277, 16281328, 11752739, 13276255, 12693452, 9976849, 13788410, 4839407, 	\
	3092, 3874753, 8038234, 2225335, 2781092, 7507549, 6133130, 272147, 	\
	5207677, 5565868, 1924627, 8783040, 15634861, 11921974, 12351971, 15167512, 	\
	11305485, 10295782, 14035007, 13562792, 8773841, 14293575, 5475246, 3707001, 	\
	2188128, 6974367, 3201102, 3736545, 4330032, 780623, 1113046, 5988369, 	\
	4330984, 36603, 16342023, 15889820, 11396697, 10788130, 16714935, 9868876, 	\
	9233809, 13074066, 10366831, 9804988, 13370881, 15157082, 3996863, 7663397, 	\
	6756340, 3015819, 1433354, 5926133, 225644, 566075, 5281986, 5970245, 	\
	2147004, 6942819, 15870322, 12262029, 14713165, 13259510, 9661099, 10008920, 	\
	13214405, 8520454, 10180923, 16042720, 15627029, 10952862, 8166347, 7719216, 	\
	939172, 4581215, 6077458, 1523073, 984952, 4510895, 4179350, 3554905, 	\
	6663400, 7116599, 10700518, 14245337, 13696528, 9119462, 12727679, 14274088, 	\
	9625025, 11224414, 14792367, 12103156, 11753569, 6833034, 4309335, 1226852, 	\
	5974969, 4567050, 967622, 1530773, 8136744, 2470899, 3023366, 7690253, 	\
	4053976, 8831523, 13578682, 13937373, 10483716, 12992915, 13455978, 12429812, 	\
	11713941, 15281738, 10536443, 12309540, 13766525, 605658, 108035, 5928944, 	\
	5328109, 564790, 6531027, 8008776, 3276604, 2871015, 6444130, 1378201, 	\
	1883268, 13102455, 9205418, 9815049, 14653780, 15084175, 11346238, 16183777, 	\
	16730624, 10754334, 9274055, 14136112, 10250665, 359118, 4375383, 2822280, 	\
	3160697, 8121206, 6549639, 2638680, 7444705, 5933234, 97150, 549069, 	\
	5502224, 10096483, 10489086, 15447349, 15918784, 12156379, 15470382, 15177397, 	\
	10225016, 13925899, 13627282, 8844644, 1906349, 7769906, 3144771, 2385564, 	\
	8156461, 7834850, 3022747, 4521996, 6222037, 1309538, 4204587, 4723156, 	\
	11764548, 12089503, 14773226, 11186785, 11764116, 16259919, 12765778, 9167281, 	\
	13660780, 14222303, 8558978, 15288953, 7631357, 3596326, 3127955, 6557128, 	\
	4133937, 1497014, 5074031, 4471832, 2000769, 5608574, 7098303, 2621344, 	\
	12510289, 16070543, 11406894, 10669425, 13227976, 9987615, 9682374, 13143781, 	\
	12670008, 12207555, 15924822, 15280397, 2240744, 3904115, 7391631, 612572, 	\
	172867, 5812386, 1378941, 940996, 7325847, 7664442, 4137961, 6727732, 	\
	15522575, 11879130, 10375473, 13085605, 9189630, 9896203, 14602896, 10800253, 	\
	11353390, 16168627, 16360768, 2121433, 6508214, 5936487, 1156824, 737033
};

	void p25p2_vf::process_vcw(const uint8_t vf[], int* b) {
		int c0,c1,c2,c3;
		int u0,u1,u2,u3;
		extract_vcw(vf, c0, c1, c2, c3 );

		u0 = gly24128Dec(c0);
		// TODO: use pr_n[] to lookup m1
		int pr[24];
		int _m1[24];
		pr[0] = 16 * u0;
		for (int n=1; n < 24; n++) {
			pr[n] = (173*pr[n-1] + 13849) - 65536 * int((173*pr[n-1]+13849)/65536);
			_m1[n-1] = (pr[n] / 32768) & 1;
		}
		_m1[23] = 0;
		int m1 = 0;
		for (int i=0; i<23; i++)
			m1 = (m1 << 1) + _m1[i];
	
		u1 = gly23127Dec(c1 ^ m1);
		u2 = c2;
		u3 = c3;
		// int b[9];
		b[0] = ((u0 >> 5) & 0x78) + ((u3 >> 9) & 0x7);
		b[1] = ((u0 >> 3) & 0x1e) + ((u3 >> 13) & 0x1);
		b[2] = ((u0 << 1) & 0x1e) + ((u3 >> 12) & 0x1);
		b[3] = ((u1 >> 3) & 0x1fe) + ((u3 >> 8) & 0x1);
		b[4] = ((u1 << 3) & 0x78) + ((u3 >> 5) & 0x7);
		b[5] = ((u2 >> 6) & 0x1e) + ((u3 >> 4) & 0x1);
		b[6] = ((u2 >> 3) & 0x0e) + ((u3 >> 3) & 0x1);
		b[7] = ( u2       & 0x0e) + ((u3 >> 2) & 0x1);
		b[8] = ((u2 << 2) & 0x04) + ( u3       & 0x3);
	}

	void p25p2_vf::encode_vcw(uint8_t vf[], const int* b) {
		uint32_t c0,c1,c2,c3;
		int u0,u1,u2,u3;
		u0 =	\
			((b[0] & 0x78) << 5 ) |	\
			((b[1] & 0x1e) << 3 ) |	\
			((b[2] & 0x1e) >> 1 );
		u1 =	\
			((b[3] & 0x1fe) << 3 ) |	\
			((b[4] & 0x78) >> 3 );
		u2 =	\
			((b[5] & 0x1e) << 6 ) |	\
			((b[6] & 0xe) << 3 ) |	\
			((b[7] & 0xe)  ) |	\
			((b[8] & 0x4) >> 2 );
		u3 =	\
			((b[1] & 0x1) << 13 ) |	\
			((b[2] & 0x1) << 12 ) |	\
			((b[0] & 0x7) << 9 ) |	\
			((b[3] & 0x1) << 8 ) |	\
			((b[4] & 0x7) << 5 ) |	\
			((b[5] & 0x1) << 4 ) |	\
			((b[6] & 0x1) << 3 ) |	\
			((b[7] & 0x1) << 2 ) |	\
			((b[8] & 0x3)  );
		int m1 = pr_n[u0] >> 1;
		c0 = golay_24_encode(u0);
		c1 = golay_23_encode(u1) ^ m1;
		c2 = u2;
		c3 = u3;

		interleave_vcw(vf, c0, c1, c2, c3);
	}

	void p25p2_vf::interleave_vcw(uint8_t _vf[], int _c0, int _c1, int _c2, int _c3){
		uint8_t vf[72];
		uint8_t c0[24];
		uint8_t c1[23];
		uint8_t c2[11];
		uint8_t c3[14];

		dump_i(c0, _c0, 24);
		dump_i(c1, _c1, 23);
		dump_i(c2, _c2, 11);
		dump_i(c3, _c3, 14);

		vf[0] = c0[23];
		vf[1] = c0[5];
		vf[2] = c1[10];
		vf[3] = c2[3];
		vf[4] = c0[22];
		vf[5] = c0[4];
		vf[6] = c1[9];
		vf[7] = c2[2];
		vf[8] = c0[21];
		vf[9] = c0[3];
		vf[10] = c1[8];
		vf[11] = c2[1];
		vf[12] = c0[20];
		vf[13] = c0[2];
		vf[14] = c1[7];
		vf[15] = c2[0];
		vf[16] = c0[19];
		vf[17] = c0[1];
		vf[18] = c1[6];
		vf[19] = c3[13];
		vf[20] = c0[18];
		vf[21] = c0[0];
		vf[22] = c1[5];
		vf[23] = c3[12];
		vf[24] = c0[17];
		vf[25] = c1[22];
		vf[26] = c1[4];
		vf[27] = c3[11];
		vf[28] = c0[16];
		vf[29] = c1[21];
		vf[30] = c1[3];
		vf[31] = c3[10];
		vf[32] = c0[15];
		vf[33] = c1[20];
		vf[34] = c1[2];
		vf[35] = c3[9];
		vf[36] = c0[14];
		vf[37] = c1[19];
		vf[38] = c1[1];
		vf[39] = c3[8];
		vf[40] = c0[13];
		vf[41] = c1[18];
		vf[42] = c1[0];
		vf[43] = c3[7];
		vf[44] = c0[12];
		vf[45] = c1[17];
		vf[46] = c2[10];
		vf[47] = c3[6];
		vf[48] = c0[11];
		vf[49] = c1[16];
		vf[50] = c2[9];
		vf[51] = c3[5];
		vf[52] = c0[10];
		vf[53] = c1[15];
		vf[54] = c2[8];
		vf[55] = c3[4];
		vf[56] = c0[9];
		vf[57] = c1[14];
		vf[58] = c2[7];
		vf[59] = c3[3];
		vf[60] = c0[8];
		vf[61] = c1[13];
		vf[62] = c2[6];
		vf[63] = c3[2];
		vf[64] = c0[7];
		vf[65] = c1[12];
		vf[66] = c2[5];
		vf[67] = c3[1];
		vf[68] = c0[6];
		vf[69] = c1[11];
		vf[70] = c2[4];
		vf[71] = c3[0];

		for (int i=0; i<sizeof(vf)/2; i++) {
			_vf[i] = (vf[i*2] << 1) | vf[i*2+1];
		}
	}

	void p25p2_vf::extract_vcw(const uint8_t _vf[], int& _c0, int& _c1, int& _c2, int& _c3){
		uint8_t vf[72];
		uint8_t c0[24];
		uint8_t c1[23];
		uint8_t c2[11];
		uint8_t c3[14];

		for (int i=0; i<sizeof(vf)/2; i++) {
			vf[i*2]   = (_vf[i] >> 1) & 1;
			vf[i*2+1] = _vf[i] & 1;
		}

		c0[23] = vf[0];
		c0[5] = vf[1];
		c1[10] = vf[2];
		c2[3] = vf[3];
		c0[22] = vf[4];
		c0[4] = vf[5];
		c1[9] = vf[6];
		c2[2] = vf[7];
		c0[21] = vf[8];
		c0[3] = vf[9];
		c1[8] = vf[10];
		c2[1] = vf[11];
		c0[20] = vf[12];
		c0[2] = vf[13];
		c1[7] = vf[14];
		c2[0] = vf[15];
		c0[19] = vf[16];
		c0[1] = vf[17];
		c1[6] = vf[18];
		c3[13] = vf[19];
		c0[18] = vf[20];
		c0[0] = vf[21];
		c1[5] = vf[22];
		c3[12] = vf[23];
		c0[17] = vf[24];
		c1[22] = vf[25];
		c1[4] = vf[26];
		c3[11] = vf[27];
		c0[16] = vf[28];
		c1[21] = vf[29];
		c1[3] = vf[30];
		c3[10] = vf[31];
		c0[15] = vf[32];
		c1[20] = vf[33];
		c1[2] = vf[34];
		c3[9] = vf[35];
		c0[14] = vf[36];
		c1[19] = vf[37];
		c1[1] = vf[38];
		c3[8] = vf[39];
		c0[13] = vf[40];
		c1[18] = vf[41];
		c1[0] = vf[42];
		c3[7] = vf[43];
		c0[12] = vf[44];
		c1[17] = vf[45];
		c2[10] = vf[46];
		c3[6] = vf[47];
		c0[11] = vf[48];
		c1[16] = vf[49];
		c2[9] = vf[50];
		c3[5] = vf[51];
		c0[10] = vf[52];
		c1[15] = vf[53];
		c2[8] = vf[54];
		c3[4] = vf[55];
		c0[9] = vf[56];
		c1[14] = vf[57];
		c2[7] = vf[58];
		c3[3] = vf[59];
		c0[8] = vf[60];
		c1[13] = vf[61];
		c2[6] = vf[62];
		c3[2] = vf[63];
		c0[7] = vf[64];
		c1[12] = vf[65];
		c2[5] = vf[66];
		c3[1] = vf[67];
		c0[6] = vf[68];
		c1[11] = vf[69];
		c2[4] = vf[70];
		c3[0] = vf[71];
		load_i(c0, _c0, 24);
		load_i(c1, _c1, 23);
		load_i(c2, _c2, 11);
		load_i(c3, _c3, 14);
	}

static const int m_list[] = {0, 1, 2, 3, 4, 5, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 7, 8, 9, 10, 15, 16, 24, 25, 31, 32, 6};

static const int d_list[] = {7, 1, 11, 21, 31, 25, 35, 45, 55, 49, 59, 69, 6, 0, 10, 20, 30, 24, 34, 44, 54, 48, 58, 68, 5, 15, 9, 19, 29, 39, 33, 43, 53, 63, 57, 67, 4, 14, 8, 18, 28, 38, 32, 42, 52, 62, 56, 66, 3, 13, 23, 17, 27, 37, 47, 41, 51, 61, 71, 65, 2, 12, 22, 16, 26, 36, 46, 40, 50, 60, 70, 64};

static const int alt_d_list[] = {0, 12, 24, 36, 48, 60, 1, 13, 25, 37, 49, 61, 2, 14, 26, 38, 50, 62, 3, 15, 27, 39, 51, 63, 4, 16, 28, 40, 52, 64, 5, 17, 29, 41, 53, 65, 6, 18, 30, 42, 54, 66, 7, 19, 31, 43, 55, 67, 8, 20, 32, 44, 56, 68, 9, 21, 33, 45, 57, 69, 10, 22, 34, 46, 58, 70, 11, 23, 35, 47, 59, 71};

static const int b_lengths[] = {7,4,6,9,7,4,4,4,3};

void p25p2_vf::encode_dstar(uint8_t result[72], const int b[9], bool alt_dstar_interleave) {
	uint8_t pbuf[48];
	uint8_t tbuf[48];

	int tbufp = 0;
	for (int i=0; i < 9; i++) {
		store_reg(b[i], &tbuf[tbufp], b_lengths[i]);
		tbufp += b_lengths[i];
	}
	for (int i=0; i < 48; i++)
		pbuf[i] = tbuf[m_list[i]];
	int u0 = load_reg(pbuf+0, 12);
	int u1 = load_reg(pbuf+12, 12);

	int m1 = pr_n[u0];
	int c0 = golay_24_encode(u0);
	int c1 = golay_24_encode(u1) ^ m1;

	uint8_t pre_buf[72];
	store_reg(c0, pre_buf, 24);
	store_reg(c1, pre_buf+24, 24);
	memcpy(pre_buf+48, pbuf+24, 24);
	for (int i=0; i < 72; i++)
		if (alt_dstar_interleave)
			result[i] = pre_buf[alt_d_list[i]];
		else
			result[d_list[i]] = pre_buf[i];
}

void p25p2_vf::decode_dstar(const uint8_t codeword[72], int b[9], bool alt_dstar_interleave) {
	uint8_t pre_buf[72];
	uint8_t post_buf[48];
	uint8_t tbuf[48];
	for (int i=0; i < 72; i++)
		if (alt_dstar_interleave)
			pre_buf[alt_d_list[i]] = codeword[i];
		else
			pre_buf[i] = codeword[d_list[i]];

	uint32_t c0 = load_reg(pre_buf, 24);
	uint32_t c1 = load_reg(pre_buf+24, 24);
	uint32_t u0 = gly24128Dec(c0);
	uint32_t m1 = pr_n[u0];
	uint32_t u1 = gly24128Dec(c1 ^ m1);

	store_reg(u0, post_buf, 12);
	store_reg(u1, post_buf+12, 12);
	memcpy(post_buf+24, pre_buf+48, 24);
	for (int i=0; i < 48; i++)
		tbuf[m_list[i]] = post_buf[i];

	int tbufp = 0;
	for (int i=0; i < 9; i++) {
		b[i] = load_reg(&tbuf[tbufp], b_lengths[i]);
		tbufp += b_lengths[i];
	}
}