1package brotli
2
3/* Lookup table to map the previous two bytes to a context id.
4
5There are four different context modeling modes defined here:
6  contextLSB6: context id is the least significant 6 bits of the last byte,
7  contextMSB6: context id is the most significant 6 bits of the last byte,
8  contextUTF8: second-order context model tuned for UTF8-encoded text,
9  contextSigned: second-order context model tuned for signed integers.
10
11If |p1| and |p2| are the previous two bytes, and |mode| is current context
12mode, we calculate the context as:
13
14  context = ContextLut(mode)[p1] | ContextLut(mode)[p2 + 256].
15
16For contextUTF8 mode, if the previous two bytes are ASCII characters
17(i.e. < 128), this will be equivalent to
18
19  context = 4 * context1(p1) + context2(p2),
20
21where context1 is based on the previous byte in the following way:
22
23  0  : non-ASCII control
24  1  : \t, \n, \r
25  2  : space
26  3  : other punctuation
27  4  : " '
28  5  : %
29  6  : ( < [ {
30  7  : ) > ] }
31  8  : , ; :
32  9  : .
33  10 : =
34  11 : number
35  12 : upper-case vowel
36  13 : upper-case consonant
37  14 : lower-case vowel
38  15 : lower-case consonant
39
40and context2 is based on the second last byte:
41
42  0 : control, space
43  1 : punctuation
44  2 : upper-case letter, number
45  3 : lower-case letter
46
47If the last byte is ASCII, and the second last byte is not (in a valid UTF8
48stream it will be a continuation byte, value between 128 and 191), the
49context is the same as if the second last byte was an ASCII control or space.
50
51If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
52be a continuation byte and the context id is 2 or 3 depending on the LSB of
53the last byte and to a lesser extent on the second last byte if it is ASCII.
54
55If the last byte is a UTF8 continuation byte, the second last byte can be:
56  - continuation byte: the next byte is probably ASCII or lead byte (assuming
57    4-byte UTF8 characters are rare) and the context id is 0 or 1.
58  - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
59  - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
60
61The possible value combinations of the previous two bytes, the range of
62context ids and the type of the next byte is summarized in the table below:
63
64|--------\-----------------------------------------------------------------|
65|         \                         Last byte                              |
66| Second   \---------------------------------------------------------------|
67| last byte \    ASCII            |   cont. byte        |   lead byte      |
68|            \   (0-127)          |   (128-191)         |   (192-)         |
69|=============|===================|=====================|==================|
70|  ASCII      | next: ASCII/lead  |  not valid          |  next: cont.     |
71|  (0-127)    | context: 4 - 63   |                     |  context: 2 - 3  |
72|-------------|-------------------|---------------------|------------------|
73|  cont. byte | next: ASCII/lead  |  next: ASCII/lead   |  next: cont.     |
74|  (128-191)  | context: 4 - 63   |  context: 0 - 1     |  context: 2 - 3  |
75|-------------|-------------------|---------------------|------------------|
76|  lead byte  | not valid         |  next: ASCII/lead   |  not valid       |
77|  (192-207)  |                   |  context: 0 - 1     |                  |
78|-------------|-------------------|---------------------|------------------|
79|  lead byte  | not valid         |  next: cont.        |  not valid       |
80|  (208-)     |                   |  context: 2 - 3     |                  |
81|-------------|-------------------|---------------------|------------------|
82*/
83
84const (
85	contextLSB6   = 0
86	contextMSB6   = 1
87	contextUTF8   = 2
88	contextSigned = 3
89)
90
91/* Common context lookup table for all context modes. */
92var kContextLookup = [2048]byte{
93	/* CONTEXT_LSB6, last byte. */
94	0,
95	1,
96	2,
97	3,
98	4,
99	5,
100	6,
101	7,
102	8,
103	9,
104	10,
105	11,
106	12,
107	13,
108	14,
109	15,
110	16,
111	17,
112	18,
113	19,
114	20,
115	21,
116	22,
117	23,
118	24,
119	25,
120	26,
121	27,
122	28,
123	29,
124	30,
125	31,
126	32,
127	33,
128	34,
129	35,
130	36,
131	37,
132	38,
133	39,
134	40,
135	41,
136	42,
137	43,
138	44,
139	45,
140	46,
141	47,
142	48,
143	49,
144	50,
145	51,
146	52,
147	53,
148	54,
149	55,
150	56,
151	57,
152	58,
153	59,
154	60,
155	61,
156	62,
157	63,
158	0,
159	1,
160	2,
161	3,
162	4,
163	5,
164	6,
165	7,
166	8,
167	9,
168	10,
169	11,
170	12,
171	13,
172	14,
173	15,
174	16,
175	17,
176	18,
177	19,
178	20,
179	21,
180	22,
181	23,
182	24,
183	25,
184	26,
185	27,
186	28,
187	29,
188	30,
189	31,
190	32,
191	33,
192	34,
193	35,
194	36,
195	37,
196	38,
197	39,
198	40,
199	41,
200	42,
201	43,
202	44,
203	45,
204	46,
205	47,
206	48,
207	49,
208	50,
209	51,
210	52,
211	53,
212	54,
213	55,
214	56,
215	57,
216	58,
217	59,
218	60,
219	61,
220	62,
221	63,
222	0,
223	1,
224	2,
225	3,
226	4,
227	5,
228	6,
229	7,
230	8,
231	9,
232	10,
233	11,
234	12,
235	13,
236	14,
237	15,
238	16,
239	17,
240	18,
241	19,
242	20,
243	21,
244	22,
245	23,
246	24,
247	25,
248	26,
249	27,
250	28,
251	29,
252	30,
253	31,
254	32,
255	33,
256	34,
257	35,
258	36,
259	37,
260	38,
261	39,
262	40,
263	41,
264	42,
265	43,
266	44,
267	45,
268	46,
269	47,
270	48,
271	49,
272	50,
273	51,
274	52,
275	53,
276	54,
277	55,
278	56,
279	57,
280	58,
281	59,
282	60,
283	61,
284	62,
285	63,
286	0,
287	1,
288	2,
289	3,
290	4,
291	5,
292	6,
293	7,
294	8,
295	9,
296	10,
297	11,
298	12,
299	13,
300	14,
301	15,
302	16,
303	17,
304	18,
305	19,
306	20,
307	21,
308	22,
309	23,
310	24,
311	25,
312	26,
313	27,
314	28,
315	29,
316	30,
317	31,
318	32,
319	33,
320	34,
321	35,
322	36,
323	37,
324	38,
325	39,
326	40,
327	41,
328	42,
329	43,
330	44,
331	45,
332	46,
333	47,
334	48,
335	49,
336	50,
337	51,
338	52,
339	53,
340	54,
341	55,
342	56,
343	57,
344	58,
345	59,
346	60,
347	61,
348	62,
349	63,
350
351	/* CONTEXT_LSB6, second last byte, */
352	0,
353	0,
354	0,
355	0,
356	0,
357	0,
358	0,
359	0,
360	0,
361	0,
362	0,
363	0,
364	0,
365	0,
366	0,
367	0,
368	0,
369	0,
370	0,
371	0,
372	0,
373	0,
374	0,
375	0,
376	0,
377	0,
378	0,
379	0,
380	0,
381	0,
382	0,
383	0,
384	0,
385	0,
386	0,
387	0,
388	0,
389	0,
390	0,
391	0,
392	0,
393	0,
394	0,
395	0,
396	0,
397	0,
398	0,
399	0,
400	0,
401	0,
402	0,
403	0,
404	0,
405	0,
406	0,
407	0,
408	0,
409	0,
410	0,
411	0,
412	0,
413	0,
414	0,
415	0,
416	0,
417	0,
418	0,
419	0,
420	0,
421	0,
422	0,
423	0,
424	0,
425	0,
426	0,
427	0,
428	0,
429	0,
430	0,
431	0,
432	0,
433	0,
434	0,
435	0,
436	0,
437	0,
438	0,
439	0,
440	0,
441	0,
442	0,
443	0,
444	0,
445	0,
446	0,
447	0,
448	0,
449	0,
450	0,
451	0,
452	0,
453	0,
454	0,
455	0,
456	0,
457	0,
458	0,
459	0,
460	0,
461	0,
462	0,
463	0,
464	0,
465	0,
466	0,
467	0,
468	0,
469	0,
470	0,
471	0,
472	0,
473	0,
474	0,
475	0,
476	0,
477	0,
478	0,
479	0,
480	0,
481	0,
482	0,
483	0,
484	0,
485	0,
486	0,
487	0,
488	0,
489	0,
490	0,
491	0,
492	0,
493	0,
494	0,
495	0,
496	0,
497	0,
498	0,
499	0,
500	0,
501	0,
502	0,
503	0,
504	0,
505	0,
506	0,
507	0,
508	0,
509	0,
510	0,
511	0,
512	0,
513	0,
514	0,
515	0,
516	0,
517	0,
518	0,
519	0,
520	0,
521	0,
522	0,
523	0,
524	0,
525	0,
526	0,
527	0,
528	0,
529	0,
530	0,
531	0,
532	0,
533	0,
534	0,
535	0,
536	0,
537	0,
538	0,
539	0,
540	0,
541	0,
542	0,
543	0,
544	0,
545	0,
546	0,
547	0,
548	0,
549	0,
550	0,
551	0,
552	0,
553	0,
554	0,
555	0,
556	0,
557	0,
558	0,
559	0,
560	0,
561	0,
562	0,
563	0,
564	0,
565	0,
566	0,
567	0,
568	0,
569	0,
570	0,
571	0,
572	0,
573	0,
574	0,
575	0,
576	0,
577	0,
578	0,
579	0,
580	0,
581	0,
582	0,
583	0,
584	0,
585	0,
586	0,
587	0,
588	0,
589	0,
590	0,
591	0,
592	0,
593	0,
594	0,
595	0,
596	0,
597	0,
598	0,
599	0,
600	0,
601	0,
602	0,
603	0,
604	0,
605	0,
606	0,
607	0,
608
609	/* CONTEXT_MSB6, last byte. */
610	0,
611	0,
612	0,
613	0,
614	1,
615	1,
616	1,
617	1,
618	2,
619	2,
620	2,
621	2,
622	3,
623	3,
624	3,
625	3,
626	4,
627	4,
628	4,
629	4,
630	5,
631	5,
632	5,
633	5,
634	6,
635	6,
636	6,
637	6,
638	7,
639	7,
640	7,
641	7,
642	8,
643	8,
644	8,
645	8,
646	9,
647	9,
648	9,
649	9,
650	10,
651	10,
652	10,
653	10,
654	11,
655	11,
656	11,
657	11,
658	12,
659	12,
660	12,
661	12,
662	13,
663	13,
664	13,
665	13,
666	14,
667	14,
668	14,
669	14,
670	15,
671	15,
672	15,
673	15,
674	16,
675	16,
676	16,
677	16,
678	17,
679	17,
680	17,
681	17,
682	18,
683	18,
684	18,
685	18,
686	19,
687	19,
688	19,
689	19,
690	20,
691	20,
692	20,
693	20,
694	21,
695	21,
696	21,
697	21,
698	22,
699	22,
700	22,
701	22,
702	23,
703	23,
704	23,
705	23,
706	24,
707	24,
708	24,
709	24,
710	25,
711	25,
712	25,
713	25,
714	26,
715	26,
716	26,
717	26,
718	27,
719	27,
720	27,
721	27,
722	28,
723	28,
724	28,
725	28,
726	29,
727	29,
728	29,
729	29,
730	30,
731	30,
732	30,
733	30,
734	31,
735	31,
736	31,
737	31,
738	32,
739	32,
740	32,
741	32,
742	33,
743	33,
744	33,
745	33,
746	34,
747	34,
748	34,
749	34,
750	35,
751	35,
752	35,
753	35,
754	36,
755	36,
756	36,
757	36,
758	37,
759	37,
760	37,
761	37,
762	38,
763	38,
764	38,
765	38,
766	39,
767	39,
768	39,
769	39,
770	40,
771	40,
772	40,
773	40,
774	41,
775	41,
776	41,
777	41,
778	42,
779	42,
780	42,
781	42,
782	43,
783	43,
784	43,
785	43,
786	44,
787	44,
788	44,
789	44,
790	45,
791	45,
792	45,
793	45,
794	46,
795	46,
796	46,
797	46,
798	47,
799	47,
800	47,
801	47,
802	48,
803	48,
804	48,
805	48,
806	49,
807	49,
808	49,
809	49,
810	50,
811	50,
812	50,
813	50,
814	51,
815	51,
816	51,
817	51,
818	52,
819	52,
820	52,
821	52,
822	53,
823	53,
824	53,
825	53,
826	54,
827	54,
828	54,
829	54,
830	55,
831	55,
832	55,
833	55,
834	56,
835	56,
836	56,
837	56,
838	57,
839	57,
840	57,
841	57,
842	58,
843	58,
844	58,
845	58,
846	59,
847	59,
848	59,
849	59,
850	60,
851	60,
852	60,
853	60,
854	61,
855	61,
856	61,
857	61,
858	62,
859	62,
860	62,
861	62,
862	63,
863	63,
864	63,
865	63,
866
867	/* CONTEXT_MSB6, second last byte, */
868	0,
869	0,
870	0,
871	0,
872	0,
873	0,
874	0,
875	0,
876	0,
877	0,
878	0,
879	0,
880	0,
881	0,
882	0,
883	0,
884	0,
885	0,
886	0,
887	0,
888	0,
889	0,
890	0,
891	0,
892	0,
893	0,
894	0,
895	0,
896	0,
897	0,
898	0,
899	0,
900	0,
901	0,
902	0,
903	0,
904	0,
905	0,
906	0,
907	0,
908	0,
909	0,
910	0,
911	0,
912	0,
913	0,
914	0,
915	0,
916	0,
917	0,
918	0,
919	0,
920	0,
921	0,
922	0,
923	0,
924	0,
925	0,
926	0,
927	0,
928	0,
929	0,
930	0,
931	0,
932	0,
933	0,
934	0,
935	0,
936	0,
937	0,
938	0,
939	0,
940	0,
941	0,
942	0,
943	0,
944	0,
945	0,
946	0,
947	0,
948	0,
949	0,
950	0,
951	0,
952	0,
953	0,
954	0,
955	0,
956	0,
957	0,
958	0,
959	0,
960	0,
961	0,
962	0,
963	0,
964	0,
965	0,
966	0,
967	0,
968	0,
969	0,
970	0,
971	0,
972	0,
973	0,
974	0,
975	0,
976	0,
977	0,
978	0,
979	0,
980	0,
981	0,
982	0,
983	0,
984	0,
985	0,
986	0,
987	0,
988	0,
989	0,
990	0,
991	0,
992	0,
993	0,
994	0,
995	0,
996	0,
997	0,
998	0,
999	0,
1000	0,
1001	0,
1002	0,
1003	0,
1004	0,
1005	0,
1006	0,
1007	0,
1008	0,
1009	0,
1010	0,
1011	0,
1012	0,
1013	0,
1014	0,
1015	0,
1016	0,
1017	0,
1018	0,
1019	0,
1020	0,
1021	0,
1022	0,
1023	0,
1024	0,
1025	0,
1026	0,
1027	0,
1028	0,
1029	0,
1030	0,
1031	0,
1032	0,
1033	0,
1034	0,
1035	0,
1036	0,
1037	0,
1038	0,
1039	0,
1040	0,
1041	0,
1042	0,
1043	0,
1044	0,
1045	0,
1046	0,
1047	0,
1048	0,
1049	0,
1050	0,
1051	0,
1052	0,
1053	0,
1054	0,
1055	0,
1056	0,
1057	0,
1058	0,
1059	0,
1060	0,
1061	0,
1062	0,
1063	0,
1064	0,
1065	0,
1066	0,
1067	0,
1068	0,
1069	0,
1070	0,
1071	0,
1072	0,
1073	0,
1074	0,
1075	0,
1076	0,
1077	0,
1078	0,
1079	0,
1080	0,
1081	0,
1082	0,
1083	0,
1084	0,
1085	0,
1086	0,
1087	0,
1088	0,
1089	0,
1090	0,
1091	0,
1092	0,
1093	0,
1094	0,
1095	0,
1096	0,
1097	0,
1098	0,
1099	0,
1100	0,
1101	0,
1102	0,
1103	0,
1104	0,
1105	0,
1106	0,
1107	0,
1108	0,
1109	0,
1110	0,
1111	0,
1112	0,
1113	0,
1114	0,
1115	0,
1116	0,
1117	0,
1118	0,
1119	0,
1120	0,
1121	0,
1122	0,
1123	0,
1124
1125	/* CONTEXT_UTF8, last byte. */
1126	/* ASCII range. */
1127	0,
1128	0,
1129	0,
1130	0,
1131	0,
1132	0,
1133	0,
1134	0,
1135	0,
1136	4,
1137	4,
1138	0,
1139	0,
1140	4,
1141	0,
1142	0,
1143	0,
1144	0,
1145	0,
1146	0,
1147	0,
1148	0,
1149	0,
1150	0,
1151	0,
1152	0,
1153	0,
1154	0,
1155	0,
1156	0,
1157	0,
1158	0,
1159	8,
1160	12,
1161	16,
1162	12,
1163	12,
1164	20,
1165	12,
1166	16,
1167	24,
1168	28,
1169	12,
1170	12,
1171	32,
1172	12,
1173	36,
1174	12,
1175	44,
1176	44,
1177	44,
1178	44,
1179	44,
1180	44,
1181	44,
1182	44,
1183	44,
1184	44,
1185	32,
1186	32,
1187	24,
1188	40,
1189	28,
1190	12,
1191	12,
1192	48,
1193	52,
1194	52,
1195	52,
1196	48,
1197	52,
1198	52,
1199	52,
1200	48,
1201	52,
1202	52,
1203	52,
1204	52,
1205	52,
1206	48,
1207	52,
1208	52,
1209	52,
1210	52,
1211	52,
1212	48,
1213	52,
1214	52,
1215	52,
1216	52,
1217	52,
1218	24,
1219	12,
1220	28,
1221	12,
1222	12,
1223	12,
1224	56,
1225	60,
1226	60,
1227	60,
1228	56,
1229	60,
1230	60,
1231	60,
1232	56,
1233	60,
1234	60,
1235	60,
1236	60,
1237	60,
1238	56,
1239	60,
1240	60,
1241	60,
1242	60,
1243	60,
1244	56,
1245	60,
1246	60,
1247	60,
1248	60,
1249	60,
1250	24,
1251	12,
1252	28,
1253	12,
1254	0,
1255
1256	/* UTF8 continuation byte range. */
1257	0,
1258	1,
1259	0,
1260	1,
1261	0,
1262	1,
1263	0,
1264	1,
1265	0,
1266	1,
1267	0,
1268	1,
1269	0,
1270	1,
1271	0,
1272	1,
1273	0,
1274	1,
1275	0,
1276	1,
1277	0,
1278	1,
1279	0,
1280	1,
1281	0,
1282	1,
1283	0,
1284	1,
1285	0,
1286	1,
1287	0,
1288	1,
1289	0,
1290	1,
1291	0,
1292	1,
1293	0,
1294	1,
1295	0,
1296	1,
1297	0,
1298	1,
1299	0,
1300	1,
1301	0,
1302	1,
1303	0,
1304	1,
1305	0,
1306	1,
1307	0,
1308	1,
1309	0,
1310	1,
1311	0,
1312	1,
1313	0,
1314	1,
1315	0,
1316	1,
1317	0,
1318	1,
1319	0,
1320	1,
1321
1322	/* UTF8 lead byte range. */
1323	2,
1324	3,
1325	2,
1326	3,
1327	2,
1328	3,
1329	2,
1330	3,
1331	2,
1332	3,
1333	2,
1334	3,
1335	2,
1336	3,
1337	2,
1338	3,
1339	2,
1340	3,
1341	2,
1342	3,
1343	2,
1344	3,
1345	2,
1346	3,
1347	2,
1348	3,
1349	2,
1350	3,
1351	2,
1352	3,
1353	2,
1354	3,
1355	2,
1356	3,
1357	2,
1358	3,
1359	2,
1360	3,
1361	2,
1362	3,
1363	2,
1364	3,
1365	2,
1366	3,
1367	2,
1368	3,
1369	2,
1370	3,
1371	2,
1372	3,
1373	2,
1374	3,
1375	2,
1376	3,
1377	2,
1378	3,
1379	2,
1380	3,
1381	2,
1382	3,
1383	2,
1384	3,
1385	2,
1386	3,
1387
1388	/* CONTEXT_UTF8 second last byte. */
1389	/* ASCII range. */
1390	0,
1391	0,
1392	0,
1393	0,
1394	0,
1395	0,
1396	0,
1397	0,
1398	0,
1399	0,
1400	0,
1401	0,
1402	0,
1403	0,
1404	0,
1405	0,
1406	0,
1407	0,
1408	0,
1409	0,
1410	0,
1411	0,
1412	0,
1413	0,
1414	0,
1415	0,
1416	0,
1417	0,
1418	0,
1419	0,
1420	0,
1421	0,
1422	0,
1423	1,
1424	1,
1425	1,
1426	1,
1427	1,
1428	1,
1429	1,
1430	1,
1431	1,
1432	1,
1433	1,
1434	1,
1435	1,
1436	1,
1437	1,
1438	2,
1439	2,
1440	2,
1441	2,
1442	2,
1443	2,
1444	2,
1445	2,
1446	2,
1447	2,
1448	1,
1449	1,
1450	1,
1451	1,
1452	1,
1453	1,
1454	1,
1455	2,
1456	2,
1457	2,
1458	2,
1459	2,
1460	2,
1461	2,
1462	2,
1463	2,
1464	2,
1465	2,
1466	2,
1467	2,
1468	2,
1469	2,
1470	2,
1471	2,
1472	2,
1473	2,
1474	2,
1475	2,
1476	2,
1477	2,
1478	2,
1479	2,
1480	2,
1481	1,
1482	1,
1483	1,
1484	1,
1485	1,
1486	1,
1487	3,
1488	3,
1489	3,
1490	3,
1491	3,
1492	3,
1493	3,
1494	3,
1495	3,
1496	3,
1497	3,
1498	3,
1499	3,
1500	3,
1501	3,
1502	3,
1503	3,
1504	3,
1505	3,
1506	3,
1507	3,
1508	3,
1509	3,
1510	3,
1511	3,
1512	3,
1513	1,
1514	1,
1515	1,
1516	1,
1517	0,
1518
1519	/* UTF8 continuation byte range. */
1520	0,
1521	0,
1522	0,
1523	0,
1524	0,
1525	0,
1526	0,
1527	0,
1528	0,
1529	0,
1530	0,
1531	0,
1532	0,
1533	0,
1534	0,
1535	0,
1536	0,
1537	0,
1538	0,
1539	0,
1540	0,
1541	0,
1542	0,
1543	0,
1544	0,
1545	0,
1546	0,
1547	0,
1548	0,
1549	0,
1550	0,
1551	0,
1552	0,
1553	0,
1554	0,
1555	0,
1556	0,
1557	0,
1558	0,
1559	0,
1560	0,
1561	0,
1562	0,
1563	0,
1564	0,
1565	0,
1566	0,
1567	0,
1568	0,
1569	0,
1570	0,
1571	0,
1572	0,
1573	0,
1574	0,
1575	0,
1576	0,
1577	0,
1578	0,
1579	0,
1580	0,
1581	0,
1582	0,
1583	0,
1584	0,
1585	0,
1586	0,
1587	0,
1588	0,
1589	0,
1590	0,
1591	0,
1592	0,
1593	0,
1594	0,
1595	0,
1596	0,
1597	0,
1598	0,
1599	0,
1600
1601	/* UTF8 lead byte range. */
1602	0,
1603	0,
1604	0,
1605	0,
1606	0,
1607	0,
1608	0,
1609	0,
1610	0,
1611	0,
1612	0,
1613	0,
1614	0,
1615	0,
1616	0,
1617	0,
1618	2,
1619	2,
1620	2,
1621	2,
1622	2,
1623	2,
1624	2,
1625	2,
1626	2,
1627	2,
1628	2,
1629	2,
1630	2,
1631	2,
1632	2,
1633	2,
1634	2,
1635	2,
1636	2,
1637	2,
1638	2,
1639	2,
1640	2,
1641	2,
1642	2,
1643	2,
1644	2,
1645	2,
1646	2,
1647	2,
1648	2,
1649	2,
1650
1651	/* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */
1652	0,
1653	8,
1654	8,
1655	8,
1656	8,
1657	8,
1658	8,
1659	8,
1660	8,
1661	8,
1662	8,
1663	8,
1664	8,
1665	8,
1666	8,
1667	8,
1668	16,
1669	16,
1670	16,
1671	16,
1672	16,
1673	16,
1674	16,
1675	16,
1676	16,
1677	16,
1678	16,
1679	16,
1680	16,
1681	16,
1682	16,
1683	16,
1684	16,
1685	16,
1686	16,
1687	16,
1688	16,
1689	16,
1690	16,
1691	16,
1692	16,
1693	16,
1694	16,
1695	16,
1696	16,
1697	16,
1698	16,
1699	16,
1700	16,
1701	16,
1702	16,
1703	16,
1704	16,
1705	16,
1706	16,
1707	16,
1708	16,
1709	16,
1710	16,
1711	16,
1712	16,
1713	16,
1714	16,
1715	16,
1716	24,
1717	24,
1718	24,
1719	24,
1720	24,
1721	24,
1722	24,
1723	24,
1724	24,
1725	24,
1726	24,
1727	24,
1728	24,
1729	24,
1730	24,
1731	24,
1732	24,
1733	24,
1734	24,
1735	24,
1736	24,
1737	24,
1738	24,
1739	24,
1740	24,
1741	24,
1742	24,
1743	24,
1744	24,
1745	24,
1746	24,
1747	24,
1748	24,
1749	24,
1750	24,
1751	24,
1752	24,
1753	24,
1754	24,
1755	24,
1756	24,
1757	24,
1758	24,
1759	24,
1760	24,
1761	24,
1762	24,
1763	24,
1764	24,
1765	24,
1766	24,
1767	24,
1768	24,
1769	24,
1770	24,
1771	24,
1772	24,
1773	24,
1774	24,
1775	24,
1776	24,
1777	24,
1778	24,
1779	24,
1780	32,
1781	32,
1782	32,
1783	32,
1784	32,
1785	32,
1786	32,
1787	32,
1788	32,
1789	32,
1790	32,
1791	32,
1792	32,
1793	32,
1794	32,
1795	32,
1796	32,
1797	32,
1798	32,
1799	32,
1800	32,
1801	32,
1802	32,
1803	32,
1804	32,
1805	32,
1806	32,
1807	32,
1808	32,
1809	32,
1810	32,
1811	32,
1812	32,
1813	32,
1814	32,
1815	32,
1816	32,
1817	32,
1818	32,
1819	32,
1820	32,
1821	32,
1822	32,
1823	32,
1824	32,
1825	32,
1826	32,
1827	32,
1828	32,
1829	32,
1830	32,
1831	32,
1832	32,
1833	32,
1834	32,
1835	32,
1836	32,
1837	32,
1838	32,
1839	32,
1840	32,
1841	32,
1842	32,
1843	32,
1844	40,
1845	40,
1846	40,
1847	40,
1848	40,
1849	40,
1850	40,
1851	40,
1852	40,
1853	40,
1854	40,
1855	40,
1856	40,
1857	40,
1858	40,
1859	40,
1860	40,
1861	40,
1862	40,
1863	40,
1864	40,
1865	40,
1866	40,
1867	40,
1868	40,
1869	40,
1870	40,
1871	40,
1872	40,
1873	40,
1874	40,
1875	40,
1876	40,
1877	40,
1878	40,
1879	40,
1880	40,
1881	40,
1882	40,
1883	40,
1884	40,
1885	40,
1886	40,
1887	40,
1888	40,
1889	40,
1890	40,
1891	40,
1892	48,
1893	48,
1894	48,
1895	48,
1896	48,
1897	48,
1898	48,
1899	48,
1900	48,
1901	48,
1902	48,
1903	48,
1904	48,
1905	48,
1906	48,
1907	56,
1908
1909	/* CONTEXT_SIGNED, second last byte. */
1910	0,
1911	1,
1912	1,
1913	1,
1914	1,
1915	1,
1916	1,
1917	1,
1918	1,
1919	1,
1920	1,
1921	1,
1922	1,
1923	1,
1924	1,
1925	1,
1926	2,
1927	2,
1928	2,
1929	2,
1930	2,
1931	2,
1932	2,
1933	2,
1934	2,
1935	2,
1936	2,
1937	2,
1938	2,
1939	2,
1940	2,
1941	2,
1942	2,
1943	2,
1944	2,
1945	2,
1946	2,
1947	2,
1948	2,
1949	2,
1950	2,
1951	2,
1952	2,
1953	2,
1954	2,
1955	2,
1956	2,
1957	2,
1958	2,
1959	2,
1960	2,
1961	2,
1962	2,
1963	2,
1964	2,
1965	2,
1966	2,
1967	2,
1968	2,
1969	2,
1970	2,
1971	2,
1972	2,
1973	2,
1974	3,
1975	3,
1976	3,
1977	3,
1978	3,
1979	3,
1980	3,
1981	3,
1982	3,
1983	3,
1984	3,
1985	3,
1986	3,
1987	3,
1988	3,
1989	3,
1990	3,
1991	3,
1992	3,
1993	3,
1994	3,
1995	3,
1996	3,
1997	3,
1998	3,
1999	3,
2000	3,
2001	3,
2002	3,
2003	3,
2004	3,
2005	3,
2006	3,
2007	3,
2008	3,
2009	3,
2010	3,
2011	3,
2012	3,
2013	3,
2014	3,
2015	3,
2016	3,
2017	3,
2018	3,
2019	3,
2020	3,
2021	3,
2022	3,
2023	3,
2024	3,
2025	3,
2026	3,
2027	3,
2028	3,
2029	3,
2030	3,
2031	3,
2032	3,
2033	3,
2034	3,
2035	3,
2036	3,
2037	3,
2038	4,
2039	4,
2040	4,
2041	4,
2042	4,
2043	4,
2044	4,
2045	4,
2046	4,
2047	4,
2048	4,
2049	4,
2050	4,
2051	4,
2052	4,
2053	4,
2054	4,
2055	4,
2056	4,
2057	4,
2058	4,
2059	4,
2060	4,
2061	4,
2062	4,
2063	4,
2064	4,
2065	4,
2066	4,
2067	4,
2068	4,
2069	4,
2070	4,
2071	4,
2072	4,
2073	4,
2074	4,
2075	4,
2076	4,
2077	4,
2078	4,
2079	4,
2080	4,
2081	4,
2082	4,
2083	4,
2084	4,
2085	4,
2086	4,
2087	4,
2088	4,
2089	4,
2090	4,
2091	4,
2092	4,
2093	4,
2094	4,
2095	4,
2096	4,
2097	4,
2098	4,
2099	4,
2100	4,
2101	4,
2102	5,
2103	5,
2104	5,
2105	5,
2106	5,
2107	5,
2108	5,
2109	5,
2110	5,
2111	5,
2112	5,
2113	5,
2114	5,
2115	5,
2116	5,
2117	5,
2118	5,
2119	5,
2120	5,
2121	5,
2122	5,
2123	5,
2124	5,
2125	5,
2126	5,
2127	5,
2128	5,
2129	5,
2130	5,
2131	5,
2132	5,
2133	5,
2134	5,
2135	5,
2136	5,
2137	5,
2138	5,
2139	5,
2140	5,
2141	5,
2142	5,
2143	5,
2144	5,
2145	5,
2146	5,
2147	5,
2148	5,
2149	5,
2150	6,
2151	6,
2152	6,
2153	6,
2154	6,
2155	6,
2156	6,
2157	6,
2158	6,
2159	6,
2160	6,
2161	6,
2162	6,
2163	6,
2164	6,
2165	7,
2166}
2167
2168type contextLUT []byte
2169
2170func getContextLUT(mode int) contextLUT {
2171	return kContextLookup[mode<<9:]
2172}
2173
2174func getContext(p1 byte, p2 byte, lut contextLUT) byte {
2175	return lut[p1] | lut[256+int(p2)]
2176}
2177