Skip to content

Instantly share code, notes, and snippets.

@guest271314
Created November 2, 2024 18:54
Show Gist options
  • Save guest271314/a446ae5f2bb770e246351cb57c6efbc8 to your computer and use it in GitHub Desktop.
Save guest271314/a446ae5f2bb770e246351cb57c6efbc8 to your computer and use it in GitHub Desktop.
export class FACharacterClasses {
static unicodeCategories = [
[
65,
90,
192,
214,
216,
222,
256,
256,
258,
258,
260,
260,
262,
262,
264,
264,
266,
266,
268,
268,
270,
270,
272,
272,
274,
274,
276,
276,
278,
278,
280,
280,
282,
282,
284,
284,
286,
286,
288,
288,
290,
290,
292,
292,
294,
294,
296,
296,
298,
298,
300,
300,
302,
302,
304,
304,
306,
306,
308,
308,
310,
310,
313,
313,
315,
315,
317,
317,
319,
319,
321,
321,
323,
323,
325,
325,
327,
327,
330,
330,
332,
332,
334,
334,
336,
336,
338,
338,
340,
340,
342,
342,
344,
344,
346,
346,
348,
348,
350,
350,
352,
352,
354,
354,
356,
356,
358,
358,
360,
360,
362,
362,
364,
364,
366,
366,
368,
368,
370,
370,
372,
372,
374,
374,
376,
377,
379,
379,
381,
381,
385,
386,
388,
388,
390,
391,
393,
395,
398,
401,
403,
404,
406,
408,
412,
413,
415,
416,
418,
418,
420,
420,
422,
423,
425,
425,
428,
428,
430,
431,
433,
435,
437,
437,
439,
440,
444,
444,
452,
452,
455,
455,
458,
458,
461,
461,
463,
463,
465,
465,
467,
467,
469,
469,
471,
471,
473,
473,
475,
475,
478,
478,
480,
480,
482,
482,
484,
484,
486,
486,
488,
488,
490,
490,
492,
492,
494,
494,
497,
497,
500,
500,
502,
504,
506,
506,
508,
508,
510,
510,
512,
512,
514,
514,
516,
516,
518,
518,
520,
520,
522,
522,
524,
524,
526,
526,
528,
528,
530,
530,
532,
532,
534,
534,
536,
536,
538,
538,
540,
540,
542,
542,
544,
544,
546,
546,
548,
548,
550,
550,
552,
552,
554,
554,
556,
556,
558,
558,
560,
560,
562,
562,
570,
571,
573,
574,
577,
577,
579,
582,
584,
584,
586,
586,
588,
588,
590,
590,
880,
880,
882,
882,
886,
886,
895,
895,
902,
902,
904,
906,
908,
908,
910,
911,
913,
929,
931,
939,
975,
975,
978,
980,
984,
984,
986,
986,
988,
988,
990,
990,
992,
992,
994,
994,
996,
996,
998,
998,
1000,
1000,
1002,
1002,
1004,
1004,
1006,
1006,
1012,
1012,
1015,
1015,
1017,
1018,
1021,
1071,
1120,
1120,
1122,
1122,
1124,
1124,
1126,
1126,
1128,
1128,
1130,
1130,
1132,
1132,
1134,
1134,
1136,
1136,
1138,
1138,
1140,
1140,
1142,
1142,
1144,
1144,
1146,
1146,
1148,
1148,
1150,
1150,
1152,
1152,
1162,
1162,
1164,
1164,
1166,
1166,
1168,
1168,
1170,
1170,
1172,
1172,
1174,
1174,
1176,
1176,
1178,
1178,
1180,
1180,
1182,
1182,
1184,
1184,
1186,
1186,
1188,
1188,
1190,
1190,
1192,
1192,
1194,
1194,
1196,
1196,
1198,
1198,
1200,
1200,
1202,
1202,
1204,
1204,
1206,
1206,
1208,
1208,
1210,
1210,
1212,
1212,
1214,
1214,
1216,
1217,
1219,
1219,
1221,
1221,
1223,
1223,
1225,
1225,
1227,
1227,
1229,
1229,
1232,
1232,
1234,
1234,
1236,
1236,
1238,
1238,
1240,
1240,
1242,
1242,
1244,
1244,
1246,
1246,
1248,
1248,
1250,
1250,
1252,
1252,
1254,
1254,
1256,
1256,
1258,
1258,
1260,
1260,
1262,
1262,
1264,
1264,
1266,
1266,
1268,
1268,
1270,
1270,
1272,
1272,
1274,
1274,
1276,
1276,
1278,
1278,
1280,
1280,
1282,
1282,
1284,
1284,
1286,
1286,
1288,
1288,
1290,
1290,
1292,
1292,
1294,
1294,
1296,
1296,
1298,
1298,
1300,
1300,
1302,
1302,
1304,
1304,
1306,
1306,
1308,
1308,
1310,
1310,
1312,
1312,
1314,
1314,
1316,
1316,
1318,
1318,
1320,
1320,
1322,
1322,
1324,
1324,
1326,
1326,
1329,
1366,
4256,
4293,
4295,
4295,
4301,
4301,
5024,
5109,
7680,
7680,
7682,
7682,
7684,
7684,
7686,
7686,
7688,
7688,
7690,
7690,
7692,
7692,
7694,
7694,
7696,
7696,
7698,
7698,
7700,
7700,
7702,
7702,
7704,
7704,
7706,
7706,
7708,
7708,
7710,
7710,
7712,
7712,
7714,
7714,
7716,
7716,
7718,
7718,
7720,
7720,
7722,
7722,
7724,
7724,
7726,
7726,
7728,
7728,
7730,
7730,
7732,
7732,
7734,
7734,
7736,
7736,
7738,
7738,
7740,
7740,
7742,
7742,
7744,
7744,
7746,
7746,
7748,
7748,
7750,
7750,
7752,
7752,
7754,
7754,
7756,
7756,
7758,
7758,
7760,
7760,
7762,
7762,
7764,
7764,
7766,
7766,
7768,
7768,
7770,
7770,
7772,
7772,
7774,
7774,
7776,
7776,
7778,
7778,
7780,
7780,
7782,
7782,
7784,
7784,
7786,
7786,
7788,
7788,
7790,
7790,
7792,
7792,
7794,
7794,
7796,
7796,
7798,
7798,
7800,
7800,
7802,
7802,
7804,
7804,
7806,
7806,
7808,
7808,
7810,
7810,
7812,
7812,
7814,
7814,
7816,
7816,
7818,
7818,
7820,
7820,
7822,
7822,
7824,
7824,
7826,
7826,
7828,
7828,
7838,
7838,
7840,
7840,
7842,
7842,
7844,
7844,
7846,
7846,
7848,
7848,
7850,
7850,
7852,
7852,
7854,
7854,
7856,
7856,
7858,
7858,
7860,
7860,
7862,
7862,
7864,
7864,
7866,
7866,
7868,
7868,
7870,
7870,
7872,
7872,
7874,
7874,
7876,
7876,
7878,
7878,
7880,
7880,
7882,
7882,
7884,
7884,
7886,
7886,
7888,
7888,
7890,
7890,
7892,
7892,
7894,
7894,
7896,
7896,
7898,
7898,
7900,
7900,
7902,
7902,
7904,
7904,
7906,
7906,
7908,
7908,
7910,
7910,
7912,
7912,
7914,
7914,
7916,
7916,
7918,
7918,
7920,
7920,
7922,
7922,
7924,
7924,
7926,
7926,
7928,
7928,
7930,
7930,
7932,
7932,
7934,
7934,
7944,
7951,
7960,
7965,
7976,
7983,
7992,
7999,
8008,
8013,
8025,
8025,
8027,
8027,
8029,
8029,
8031,
8031,
8040,
8047,
8120,
8123,
8136,
8139,
8152,
8155,
8168,
8172,
8184,
8187,
8450,
8450,
8455,
8455,
8459,
8461,
8464,
8466,
8469,
8469,
8473,
8477,
8484,
8484,
8486,
8486,
8488,
8488,
8490,
8493,
8496,
8499,
8510,
8511,
8517,
8517,
8579,
8579,
11264,
11310,
11360,
11360,
11362,
11364,
11367,
11367,
11369,
11369,
11371,
11371,
11373,
11376,
11378,
11378,
11381,
11381,
11390,
11392,
11394,
11394,
11396,
11396,
11398,
11398,
11400,
11400,
11402,
11402,
11404,
11404,
11406,
11406,
11408,
11408,
11410,
11410,
11412,
11412,
11414,
11414,
11416,
11416,
11418,
11418,
11420,
11420,
11422,
11422,
11424,
11424,
11426,
11426,
11428,
11428,
11430,
11430,
11432,
11432,
11434,
11434,
11436,
11436,
11438,
11438,
11440,
11440,
11442,
11442,
11444,
11444,
11446,
11446,
11448,
11448,
11450,
11450,
11452,
11452,
11454,
11454,
11456,
11456,
11458,
11458,
11460,
11460,
11462,
11462,
11464,
11464,
11466,
11466,
11468,
11468,
11470,
11470,
11472,
11472,
11474,
11474,
11476,
11476,
11478,
11478,
11480,
11480,
11482,
11482,
11484,
11484,
11486,
11486,
11488,
11488,
11490,
11490,
11499,
11499,
11501,
11501,
11506,
11506,
42560,
42560,
42562,
42562,
42564,
42564,
42566,
42566,
42568,
42568,
42570,
42570,
42572,
42572,
42574,
42574,
42576,
42576,
42578,
42578,
42580,
42580,
42582,
42582,
42584,
42584,
42586,
42586,
42588,
42588,
42590,
42590,
42592,
42592,
42594,
42594,
42596,
42596,
42598,
42598,
42600,
42600,
42602,
42602,
42604,
42604,
42624,
42624,
42626,
42626,
42628,
42628,
42630,
42630,
42632,
42632,
42634,
42634,
42636,
42636,
42638,
42638,
42640,
42640,
42642,
42642,
42644,
42644,
42646,
42646,
42648,
42648,
42650,
42650,
42786,
42786,
42788,
42788,
42790,
42790,
42792,
42792,
42794,
42794,
42796,
42796,
42798,
42798,
42802,
42802,
42804,
42804,
42806,
42806,
42808,
42808,
42810,
42810,
42812,
42812,
42814,
42814,
42816,
42816,
42818,
42818,
42820,
42820,
42822,
42822,
42824,
42824,
42826,
42826,
42828,
42828,
42830,
42830,
42832,
42832,
42834,
42834,
42836,
42836,
42838,
42838,
42840,
42840,
42842,
42842,
42844,
42844,
42846,
42846,
42848,
42848,
42850,
42850,
42852,
42852,
42854,
42854,
42856,
42856,
42858,
42858,
42860,
42860,
42862,
42862,
42873,
42873,
42875,
42875,
42877,
42878,
42880,
42880,
42882,
42882,
42884,
42884,
42886,
42886,
42891,
42891,
42893,
42893,
42896,
42896,
42898,
42898,
42902,
42902,
42904,
42904,
42906,
42906,
42908,
42908,
42910,
42910,
42912,
42912,
42914,
42914,
42916,
42916,
42918,
42918,
42920,
42920,
42922,
42925,
42928,
42932,
42934,
42934,
65313,
65338,
66560,
66599,
68736,
68786,
71840,
71871,
119808,
119833,
119860,
119885,
119912,
119937,
119964,
119964,
119966,
119967,
119970,
119970,
119973,
119974,
119977,
119980,
119982,
119989,
120016,
120041,
120068,
120069,
120071,
120074,
120077,
120084,
120086,
120092,
120120,
120121,
120123,
120126,
120128,
120132,
120134,
120134,
120138,
120144,
120172,
120197,
120224,
120249,
120276,
120301,
120328,
120353,
120380,
120405,
120432,
120457,
120488,
120512,
120546,
120570,
120604,
120628,
120662,
120686,
120720,
120744,
120778,
120778
],
[
97,
122,
170,
170,
181,
181,
186,
186,
223,
246,
248,
255,
257,
257,
259,
259,
261,
261,
263,
263,
265,
265,
267,
267,
269,
269,
271,
271,
273,
273,
275,
275,
277,
277,
279,
279,
281,
281,
283,
283,
285,
285,
287,
287,
289,
289,
291,
291,
293,
293,
295,
295,
297,
297,
299,
299,
301,
301,
303,
303,
305,
305,
307,
307,
309,
309,
311,
312,
314,
314,
316,
316,
318,
318,
320,
320,
322,
322,
324,
324,
326,
326,
328,
329,
331,
331,
333,
333,
335,
335,
337,
337,
339,
339,
341,
341,
343,
343,
345,
345,
347,
347,
349,
349,
351,
351,
353,
353,
355,
355,
357,
357,
359,
359,
361,
361,
363,
363,
365,
365,
367,
367,
369,
369,
371,
371,
373,
373,
375,
375,
378,
378,
380,
380,
382,
384,
387,
387,
389,
389,
392,
392,
396,
397,
402,
402,
405,
405,
409,
411,
414,
414,
417,
417,
419,
419,
421,
421,
424,
424,
426,
427,
429,
429,
432,
432,
436,
436,
438,
438,
441,
442,
445,
447,
454,
454,
457,
457,
460,
460,
462,
462,
464,
464,
466,
466,
468,
468,
470,
470,
472,
472,
474,
474,
476,
477,
479,
479,
481,
481,
483,
483,
485,
485,
487,
487,
489,
489,
491,
491,
493,
493,
495,
496,
499,
499,
501,
501,
505,
505,
507,
507,
509,
509,
511,
511,
513,
513,
515,
515,
517,
517,
519,
519,
521,
521,
523,
523,
525,
525,
527,
527,
529,
529,
531,
531,
533,
533,
535,
535,
537,
537,
539,
539,
541,
541,
543,
543,
545,
545,
547,
547,
549,
549,
551,
551,
553,
553,
555,
555,
557,
557,
559,
559,
561,
561,
563,
569,
572,
572,
575,
576,
578,
578,
583,
583,
585,
585,
587,
587,
589,
589,
591,
659,
661,
687,
881,
881,
883,
883,
887,
887,
891,
893,
912,
912,
940,
974,
976,
977,
981,
983,
985,
985,
987,
987,
989,
989,
991,
991,
993,
993,
995,
995,
997,
997,
999,
999,
1001,
1001,
1003,
1003,
1005,
1005,
1007,
1011,
1013,
1013,
1016,
1016,
1019,
1020,
1072,
1119,
1121,
1121,
1123,
1123,
1125,
1125,
1127,
1127,
1129,
1129,
1131,
1131,
1133,
1133,
1135,
1135,
1137,
1137,
1139,
1139,
1141,
1141,
1143,
1143,
1145,
1145,
1147,
1147,
1149,
1149,
1151,
1151,
1153,
1153,
1163,
1163,
1165,
1165,
1167,
1167,
1169,
1169,
1171,
1171,
1173,
1173,
1175,
1175,
1177,
1177,
1179,
1179,
1181,
1181,
1183,
1183,
1185,
1185,
1187,
1187,
1189,
1189,
1191,
1191,
1193,
1193,
1195,
1195,
1197,
1197,
1199,
1199,
1201,
1201,
1203,
1203,
1205,
1205,
1207,
1207,
1209,
1209,
1211,
1211,
1213,
1213,
1215,
1215,
1218,
1218,
1220,
1220,
1222,
1222,
1224,
1224,
1226,
1226,
1228,
1228,
1230,
1231,
1233,
1233,
1235,
1235,
1237,
1237,
1239,
1239,
1241,
1241,
1243,
1243,
1245,
1245,
1247,
1247,
1249,
1249,
1251,
1251,
1253,
1253,
1255,
1255,
1257,
1257,
1259,
1259,
1261,
1261,
1263,
1263,
1265,
1265,
1267,
1267,
1269,
1269,
1271,
1271,
1273,
1273,
1275,
1275,
1277,
1277,
1279,
1279,
1281,
1281,
1283,
1283,
1285,
1285,
1287,
1287,
1289,
1289,
1291,
1291,
1293,
1293,
1295,
1295,
1297,
1297,
1299,
1299,
1301,
1301,
1303,
1303,
1305,
1305,
1307,
1307,
1309,
1309,
1311,
1311,
1313,
1313,
1315,
1315,
1317,
1317,
1319,
1319,
1321,
1321,
1323,
1323,
1325,
1325,
1327,
1327,
1377,
1415,
5112,
5117,
7424,
7467,
7531,
7543,
7545,
7578,
7681,
7681,
7683,
7683,
7685,
7685,
7687,
7687,
7689,
7689,
7691,
7691,
7693,
7693,
7695,
7695,
7697,
7697,
7699,
7699,
7701,
7701,
7703,
7703,
7705,
7705,
7707,
7707,
7709,
7709,
7711,
7711,
7713,
7713,
7715,
7715,
7717,
7717,
7719,
7719,
7721,
7721,
7723,
7723,
7725,
7725,
7727,
7727,
7729,
7729,
7731,
7731,
7733,
7733,
7735,
7735,
7737,
7737,
7739,
7739,
7741,
7741,
7743,
7743,
7745,
7745,
7747,
7747,
7749,
7749,
7751,
7751,
7753,
7753,
7755,
7755,
7757,
7757,
7759,
7759,
7761,
7761,
7763,
7763,
7765,
7765,
7767,
7767,
7769,
7769,
7771,
7771,
7773,
7773,
7775,
7775,
7777,
7777,
7779,
7779,
7781,
7781,
7783,
7783,
7785,
7785,
7787,
7787,
7789,
7789,
7791,
7791,
7793,
7793,
7795,
7795,
7797,
7797,
7799,
7799,
7801,
7801,
7803,
7803,
7805,
7805,
7807,
7807,
7809,
7809,
7811,
7811,
7813,
7813,
7815,
7815,
7817,
7817,
7819,
7819,
7821,
7821,
7823,
7823,
7825,
7825,
7827,
7827,
7829,
7837,
7839,
7839,
7841,
7841,
7843,
7843,
7845,
7845,
7847,
7847,
7849,
7849,
7851,
7851,
7853,
7853,
7855,
7855,
7857,
7857,
7859,
7859,
7861,
7861,
7863,
7863,
7865,
7865,
7867,
7867,
7869,
7869,
7871,
7871,
7873,
7873,
7875,
7875,
7877,
7877,
7879,
7879,
7881,
7881,
7883,
7883,
7885,
7885,
7887,
7887,
7889,
7889,
7891,
7891,
7893,
7893,
7895,
7895,
7897,
7897,
7899,
7899,
7901,
7901,
7903,
7903,
7905,
7905,
7907,
7907,
7909,
7909,
7911,
7911,
7913,
7913,
7915,
7915,
7917,
7917,
7919,
7919,
7921,
7921,
7923,
7923,
7925,
7925,
7927,
7927,
7929,
7929,
7931,
7931,
7933,
7933,
7935,
7943,
7952,
7957,
7968,
7975,
7984,
7991,
8000,
8005,
8016,
8023,
8032,
8039,
8048,
8061,
8064,
8071,
8080,
8087,
8096,
8103,
8112,
8116,
8118,
8119,
8126,
8126,
8130,
8132,
8134,
8135,
8144,
8147,
8150,
8151,
8160,
8167,
8178,
8180,
8182,
8183,
8458,
8458,
8462,
8463,
8467,
8467,
8495,
8495,
8500,
8500,
8505,
8505,
8508,
8509,
8518,
8521,
8526,
8526,
8580,
8580,
11312,
11358,
11361,
11361,
11365,
11366,
11368,
11368,
11370,
11370,
11372,
11372,
11377,
11377,
11379,
11380,
11382,
11387,
11393,
11393,
11395,
11395,
11397,
11397,
11399,
11399,
11401,
11401,
11403,
11403,
11405,
11405,
11407,
11407,
11409,
11409,
11411,
11411,
11413,
11413,
11415,
11415,
11417,
11417,
11419,
11419,
11421,
11421,
11423,
11423,
11425,
11425,
11427,
11427,
11429,
11429,
11431,
11431,
11433,
11433,
11435,
11435,
11437,
11437,
11439,
11439,
11441,
11441,
11443,
11443,
11445,
11445,
11447,
11447,
11449,
11449,
11451,
11451,
11453,
11453,
11455,
11455,
11457,
11457,
11459,
11459,
11461,
11461,
11463,
11463,
11465,
11465,
11467,
11467,
11469,
11469,
11471,
11471,
11473,
11473,
11475,
11475,
11477,
11477,
11479,
11479,
11481,
11481,
11483,
11483,
11485,
11485,
11487,
11487,
11489,
11489,
11491,
11492,
11500,
11500,
11502,
11502,
11507,
11507,
11520,
11557,
11559,
11559,
11565,
11565,
42561,
42561,
42563,
42563,
42565,
42565,
42567,
42567,
42569,
42569,
42571,
42571,
42573,
42573,
42575,
42575,
42577,
42577,
42579,
42579,
42581,
42581,
42583,
42583,
42585,
42585,
42587,
42587,
42589,
42589,
42591,
42591,
42593,
42593,
42595,
42595,
42597,
42597,
42599,
42599,
42601,
42601,
42603,
42603,
42605,
42605,
42625,
42625,
42627,
42627,
42629,
42629,
42631,
42631,
42633,
42633,
42635,
42635,
42637,
42637,
42639,
42639,
42641,
42641,
42643,
42643,
42645,
42645,
42647,
42647,
42649,
42649,
42651,
42651,
42787,
42787,
42789,
42789,
42791,
42791,
42793,
42793,
42795,
42795,
42797,
42797,
42799,
42801,
42803,
42803,
42805,
42805,
42807,
42807,
42809,
42809,
42811,
42811,
42813,
42813,
42815,
42815,
42817,
42817,
42819,
42819,
42821,
42821,
42823,
42823,
42825,
42825,
42827,
42827,
42829,
42829,
42831,
42831,
42833,
42833,
42835,
42835,
42837,
42837,
42839,
42839,
42841,
42841,
42843,
42843,
42845,
42845,
42847,
42847,
42849,
42849,
42851,
42851,
42853,
42853,
42855,
42855,
42857,
42857,
42859,
42859,
42861,
42861,
42863,
42863,
42865,
42872,
42874,
42874,
42876,
42876,
42879,
42879,
42881,
42881,
42883,
42883,
42885,
42885,
42887,
42887,
42892,
42892,
42894,
42894,
42897,
42897,
42899,
42901,
42903,
42903,
42905,
42905,
42907,
42907,
42909,
42909,
42911,
42911,
42913,
42913,
42915,
42915,
42917,
42917,
42919,
42919,
42921,
42921,
42933,
42933,
42935,
42935,
43002,
43002,
43824,
43866,
43872,
43877,
43888,
43967,
64256,
64262,
64275,
64279,
65345,
65370,
66600,
66639,
68800,
68850,
71872,
71903,
119834,
119859,
119886,
119892,
119894,
119911,
119938,
119963,
119990,
119993,
119995,
119995,
119997,
120003,
120005,
120015,
120042,
120067,
120094,
120119,
120146,
120171,
120198,
120223,
120250,
120275,
120302,
120327,
120354,
120379,
120406,
120431,
120458,
120485,
120514,
120538,
120540,
120545,
120572,
120596,
120598,
120603,
120630,
120654,
120656,
120661,
120688,
120712,
120714,
120719,
120746,
120770,
120772,
120777,
120779,
120779
],
[
453,
453,
456,
456,
459,
459,
498,
498,
8072,
8079,
8088,
8095,
8104,
8111,
8124,
8124,
8140,
8140,
8188,
8188
],
[
688,
705,
710,
721,
736,
740,
748,
748,
750,
750,
884,
884,
890,
890,
1369,
1369,
1600,
1600,
1765,
1766,
2036,
2037,
2042,
2042,
2074,
2074,
2084,
2084,
2088,
2088,
2417,
2417,
3654,
3654,
3782,
3782,
4348,
4348,
6103,
6103,
6211,
6211,
6823,
6823,
7288,
7293,
7468,
7530,
7544,
7544,
7579,
7615,
8305,
8305,
8319,
8319,
8336,
8348,
11388,
11389,
11631,
11631,
11823,
11823,
12293,
12293,
12337,
12341,
12347,
12347,
12445,
12446,
12540,
12542,
40981,
40981,
42232,
42237,
42508,
42508,
42623,
42623,
42652,
42653,
42775,
42783,
42864,
42864,
42888,
42888,
43000,
43001,
43471,
43471,
43494,
43494,
43632,
43632,
43741,
43741,
43763,
43764,
43868,
43871,
65392,
65392,
65438,
65439,
92992,
92995,
94099,
94111
],
[
443,
443,
448,
451,
660,
660,
1488,
1514,
1520,
1522,
1568,
1599,
1601,
1610,
1646,
1647,
1649,
1747,
1749,
1749,
1774,
1775,
1786,
1788,
1791,
1791,
1808,
1808,
1810,
1839,
1869,
1957,
1969,
1969,
1994,
2026,
2048,
2069,
2112,
2136,
2208,
2228,
2308,
2361,
2365,
2365,
2384,
2384,
2392,
2401,
2418,
2432,
2437,
2444,
2447,
2448,
2451,
2472,
2474,
2480,
2482,
2482,
2486,
2489,
2493,
2493,
2510,
2510,
2524,
2525,
2527,
2529,
2544,
2545,
2565,
2570,
2575,
2576,
2579,
2600,
2602,
2608,
2610,
2611,
2613,
2614,
2616,
2617,
2649,
2652,
2654,
2654,
2674,
2676,
2693,
2701,
2703,
2705,
2707,
2728,
2730,
2736,
2738,
2739,
2741,
2745,
2749,
2749,
2768,
2768,
2784,
2785,
2809,
2809,
2821,
2828,
2831,
2832,
2835,
2856,
2858,
2864,
2866,
2867,
2869,
2873,
2877,
2877,
2908,
2909,
2911,
2913,
2929,
2929,
2947,
2947,
2949,
2954,
2958,
2960,
2962,
2965,
2969,
2970,
2972,
2972,
2974,
2975,
2979,
2980,
2984,
2986,
2990,
3001,
3024,
3024,
3077,
3084,
3086,
3088,
3090,
3112,
3114,
3129,
3133,
3133,
3160,
3162,
3168,
3169,
3205,
3212,
3214,
3216,
3218,
3240,
3242,
3251,
3253,
3257,
3261,
3261,
3294,
3294,
3296,
3297,
3313,
3314,
3333,
3340,
3342,
3344,
3346,
3386,
3389,
3389,
3406,
3406,
3423,
3425,
3450,
3455,
3461,
3478,
3482,
3505,
3507,
3515,
3517,
3517,
3520,
3526,
3585,
3632,
3634,
3635,
3648,
3653,
3713,
3714,
3716,
3716,
3719,
3720,
3722,
3722,
3725,
3725,
3732,
3735,
3737,
3743,
3745,
3747,
3749,
3749,
3751,
3751,
3754,
3755,
3757,
3760,
3762,
3763,
3773,
3773,
3776,
3780,
3804,
3807,
3840,
3840,
3904,
3911,
3913,
3948,
3976,
3980,
4096,
4138,
4159,
4159,
4176,
4181,
4186,
4189,
4193,
4193,
4197,
4198,
4206,
4208,
4213,
4225,
4238,
4238,
4304,
4346,
4349,
4680,
4682,
4685,
4688,
4694,
4696,
4696,
4698,
4701,
4704,
4744,
4746,
4749,
4752,
4784,
4786,
4789,
4792,
4798,
4800,
4800,
4802,
4805,
4808,
4822,
4824,
4880,
4882,
4885,
4888,
4954,
4992,
5007,
5121,
5740,
5743,
5759,
5761,
5786,
5792,
5866,
5873,
5880,
5888,
5900,
5902,
5905,
5920,
5937,
5952,
5969,
5984,
5996,
5998,
6000,
6016,
6067,
6108,
6108,
6176,
6210,
6212,
6263,
6272,
6312,
6314,
6314,
6320,
6389,
6400,
6430,
6480,
6509,
6512,
6516,
6528,
6571,
6576,
6601,
6656,
6678,
6688,
6740,
6917,
6963,
6981,
6987,
7043,
7072,
7086,
7087,
7098,
7141,
7168,
7203,
7245,
7247,
7258,
7287,
7401,
7404,
7406,
7409,
7413,
7414,
8501,
8504,
11568,
11623,
11648,
11670,
11680,
11686,
11688,
11694,
11696,
11702,
11704,
11710,
11712,
11718,
11720,
11726,
11728,
11734,
11736,
11742,
12294,
12294,
12348,
12348,
12353,
12438,
12447,
12447,
12449,
12538,
12543,
12543,
12549,
12589,
12593,
12686,
12704,
12730,
12784,
12799,
13312,
19893,
19968,
40917,
40960,
40980,
40982,
42124,
42192,
42231,
42240,
42507,
42512,
42527,
42538,
42539,
42606,
42606,
42656,
42725,
42895,
42895,
42999,
42999,
43003,
43009,
43011,
43013,
43015,
43018,
43020,
43042,
43072,
43123,
43138,
43187,
43250,
43255,
43259,
43259,
43261,
43261,
43274,
43301,
43312,
43334,
43360,
43388,
43396,
43442,
43488,
43492,
43495,
43503,
43514,
43518,
43520,
43560,
43584,
43586,
43588,
43595,
43616,
43631,
43633,
43638,
43642,
43642,
43646,
43695,
43697,
43697,
43701,
43702,
43705,
43709,
43712,
43712,
43714,
43714,
43739,
43740,
43744,
43754,
43762,
43762,
43777,
43782,
43785,
43790,
43793,
43798,
43808,
43814,
43816,
43822,
43968,
44002,
44032,
55203,
55216,
55238,
55243,
55291,
63744,
64109,
64112,
64217,
64285,
64285,
64287,
64296,
64298,
64310,
64312,
64316,
64318,
64318,
64320,
64321,
64323,
64324,
64326,
64433,
64467,
64829,
64848,
64911,
64914,
64967,
65008,
65019,
65136,
65140,
65142,
65276,
65382,
65391,
65393,
65437,
65440,
65470,
65474,
65479,
65482,
65487,
65490,
65495,
65498,
65500,
65536,
65547,
65549,
65574,
65576,
65594,
65596,
65597,
65599,
65613,
65616,
65629,
65664,
65786,
66176,
66204,
66208,
66256,
66304,
66335,
66352,
66368,
66370,
66377,
66384,
66421,
66432,
66461,
66464,
66499,
66504,
66511,
66640,
66717,
66816,
66855,
66864,
66915,
67072,
67382,
67392,
67413,
67424,
67431,
67584,
67589,
67592,
67592,
67594,
67637,
67639,
67640,
67644,
67644,
67647,
67669,
67680,
67702,
67712,
67742,
67808,
67826,
67828,
67829,
67840,
67861,
67872,
67897,
67968,
68023,
68030,
68031,
68096,
68096,
68112,
68115,
68117,
68119,
68121,
68147,
68192,
68220,
68224,
68252,
68288,
68295,
68297,
68324,
68352,
68405,
68416,
68437,
68448,
68466,
68480,
68497,
68608,
68680,
69635,
69687,
69763,
69807,
69840,
69864,
69891,
69926,
69968,
70002,
70006,
70006,
70019,
70066,
70081,
70084,
70106,
70106,
70108,
70108,
70144,
70161,
70163,
70187,
70272,
70278,
70280,
70280,
70282,
70285,
70287,
70301,
70303,
70312,
70320,
70366,
70405,
70412,
70415,
70416,
70419,
70440,
70442,
70448,
70450,
70451,
70453,
70457,
70461,
70461,
70480,
70480,
70493,
70497,
70784,
70831,
70852,
70853,
70855,
70855,
71040,
71086,
71128,
71131,
71168,
71215,
71236,
71236,
71296,
71338,
71424,
71449,
71935,
71935,
72384,
72440,
73728,
74649,
74880,
75075,
77824,
78894,
82944,
83526,
92160,
92728,
92736,
92766,
92880,
92909,
92928,
92975,
93027,
93047,
93053,
93071,
93952,
94020,
94032,
94032,
110592,
110593,
113664,
113770,
113776,
113788,
113792,
113800,
113808,
113817,
124928,
125124,
126464,
126467,
126469,
126495,
126497,
126498,
126500,
126500,
126503,
126503,
126505,
126514,
126516,
126519,
126521,
126521,
126523,
126523,
126530,
126530,
126535,
126535,
126537,
126537,
126539,
126539,
126541,
126543,
126545,
126546,
126548,
126548,
126551,
126551,
126553,
126553,
126555,
126555,
126557,
126557,
126559,
126559,
126561,
126562,
126564,
126564,
126567,
126570,
126572,
126578,
126580,
126583,
126585,
126588,
126590,
126590,
126592,
126601,
126603,
126619,
126625,
126627,
126629,
126633,
126635,
126651,
131072,
173782,
173824,
177972,
177984,
178205,
178208,
183969,
194560,
195101
],
[
768,
879,
1155,
1159,
1425,
1469,
1471,
1471,
1473,
1474,
1476,
1477,
1479,
1479,
1552,
1562,
1611,
1631,
1648,
1648,
1750,
1756,
1759,
1764,
1767,
1768,
1770,
1773,
1809,
1809,
1840,
1866,
1958,
1968,
2027,
2035,
2070,
2073,
2075,
2083,
2085,
2087,
2089,
2093,
2137,
2139,
2275,
2306,
2362,
2362,
2364,
2364,
2369,
2376,
2381,
2381,
2385,
2391,
2402,
2403,
2433,
2433,
2492,
2492,
2497,
2500,
2509,
2509,
2530,
2531,
2561,
2562,
2620,
2620,
2625,
2626,
2631,
2632,
2635,
2637,
2641,
2641,
2672,
2673,
2677,
2677,
2689,
2690,
2748,
2748,
2753,
2757,
2759,
2760,
2765,
2765,
2786,
2787,
2817,
2817,
2876,
2876,
2879,
2879,
2881,
2884,
2893,
2893,
2902,
2902,
2914,
2915,
2946,
2946,
3008,
3008,
3021,
3021,
3072,
3072,
3134,
3136,
3142,
3144,
3146,
3149,
3157,
3158,
3170,
3171,
3201,
3201,
3260,
3260,
3263,
3263,
3270,
3270,
3276,
3277,
3298,
3299,
3329,
3329,
3393,
3396,
3405,
3405,
3426,
3427,
3530,
3530,
3538,
3540,
3542,
3542,
3633,
3633,
3636,
3642,
3655,
3662,
3761,
3761,
3764,
3769,
3771,
3772,
3784,
3789,
3864,
3865,
3893,
3893,
3895,
3895,
3897,
3897,
3953,
3966,
3968,
3972,
3974,
3975,
3981,
3991,
3993,
4028,
4038,
4038,
4141,
4144,
4146,
4151,
4153,
4154,
4157,
4158,
4184,
4185,
4190,
4192,
4209,
4212,
4226,
4226,
4229,
4230,
4237,
4237,
4253,
4253,
4957,
4959,
5906,
5908,
5938,
5940,
5970,
5971,
6002,
6003,
6068,
6069,
6071,
6077,
6086,
6086,
6089,
6099,
6109,
6109,
6155,
6157,
6313,
6313,
6432,
6434,
6439,
6440,
6450,
6450,
6457,
6459,
6679,
6680,
6683,
6683,
6742,
6742,
6744,
6750,
6752,
6752,
6754,
6754,
6757,
6764,
6771,
6780,
6783,
6783,
6832,
6845,
6912,
6915,
6964,
6964,
6966,
6970,
6972,
6972,
6978,
6978,
7019,
7027,
7040,
7041,
7074,
7077,
7080,
7081,
7083,
7085,
7142,
7142,
7144,
7145,
7149,
7149,
7151,
7153,
7212,
7219,
7222,
7223,
7376,
7378,
7380,
7392,
7394,
7400,
7405,
7405,
7412,
7412,
7416,
7417,
7616,
7669,
7676,
7679,
8400,
8412,
8417,
8417,
8421,
8432,
11503,
11505,
11647,
11647,
11744,
11775,
12330,
12333,
12441,
12442,
42607,
42607,
42612,
42621,
42654,
42655,
42736,
42737,
43010,
43010,
43014,
43014,
43019,
43019,
43045,
43046,
43204,
43204,
43232,
43249,
43302,
43309,
43335,
43345,
43392,
43394,
43443,
43443,
43446,
43449,
43452,
43452,
43493,
43493,
43561,
43566,
43569,
43570,
43573,
43574,
43587,
43587,
43596,
43596,
43644,
43644,
43696,
43696,
43698,
43700,
43703,
43704,
43710,
43711,
43713,
43713,
43756,
43757,
43766,
43766,
44005,
44005,
44008,
44008,
44013,
44013,
64286,
64286,
65024,
65039,
65056,
65071,
66045,
66045,
66272,
66272,
66422,
66426,
68097,
68099,
68101,
68102,
68108,
68111,
68152,
68154,
68159,
68159,
68325,
68326,
69633,
69633,
69688,
69702,
69759,
69761,
69811,
69814,
69817,
69818,
69888,
69890,
69927,
69931,
69933,
69940,
70003,
70003,
70016,
70017,
70070,
70078,
70090,
70092,
70191,
70193,
70196,
70196,
70198,
70199,
70367,
70367,
70371,
70378,
70400,
70401,
70460,
70460,
70464,
70464,
70502,
70508,
70512,
70516,
70835,
70840,
70842,
70842,
70847,
70848,
70850,
70851,
71090,
71093,
71100,
71101,
71103,
71104,
71132,
71133,
71219,
71226,
71229,
71229,
71231,
71232,
71339,
71339,
71341,
71341,
71344,
71349,
71351,
71351,
71453,
71455,
71458,
71461,
71463,
71467,
92912,
92916,
92976,
92982,
94095,
94098,
113821,
113822,
119143,
119145,
119163,
119170,
119173,
119179,
119210,
119213,
119362,
119364,
121344,
121398,
121403,
121452,
121461,
121461,
121476,
121476,
121499,
121503,
121505,
121519,
125136,
125142,
917760,
917999
],
[
2307,
2307,
2363,
2363,
2366,
2368,
2377,
2380,
2382,
2383,
2434,
2435,
2494,
2496,
2503,
2504,
2507,
2508,
2519,
2519,
2563,
2563,
2622,
2624,
2691,
2691,
2750,
2752,
2761,
2761,
2763,
2764,
2818,
2819,
2878,
2878,
2880,
2880,
2887,
2888,
2891,
2892,
2903,
2903,
3006,
3007,
3009,
3010,
3014,
3016,
3018,
3020,
3031,
3031,
3073,
3075,
3137,
3140,
3202,
3203,
3262,
3262,
3264,
3268,
3271,
3272,
3274,
3275,
3285,
3286,
3330,
3331,
3390,
3392,
3398,
3400,
3402,
3404,
3415,
3415,
3458,
3459,
3535,
3537,
3544,
3551,
3570,
3571,
3902,
3903,
3967,
3967,
4139,
4140,
4145,
4145,
4152,
4152,
4155,
4156,
4182,
4183,
4194,
4196,
4199,
4205,
4227,
4228,
4231,
4236,
4239,
4239,
4250,
4252,
6070,
6070,
6078,
6085,
6087,
6088,
6435,
6438,
6441,
6443,
6448,
6449,
6451,
6456,
6681,
6682,
6741,
6741,
6743,
6743,
6753,
6753,
6755,
6756,
6765,
6770,
6916,
6916,
6965,
6965,
6971,
6971,
6973,
6977,
6979,
6980,
7042,
7042,
7073,
7073,
7078,
7079,
7082,
7082,
7143,
7143,
7146,
7148,
7150,
7150,
7154,
7155,
7204,
7211,
7220,
7221,
7393,
7393,
7410,
7411,
12334,
12335,
43043,
43044,
43047,
43047,
43136,
43137,
43188,
43203,
43346,
43347,
43395,
43395,
43444,
43445,
43450,
43451,
43453,
43456,
43567,
43568,
43571,
43572,
43597,
43597,
43643,
43643,
43645,
43645,
43755,
43755,
43758,
43759,
43765,
43765,
44003,
44004,
44006,
44007,
44009,
44010,
44012,
44012,
69632,
69632,
69634,
69634,
69762,
69762,
69808,
69810,
69815,
69816,
69932,
69932,
70018,
70018,
70067,
70069,
70079,
70080,
70188,
70190,
70194,
70195,
70197,
70197,
70368,
70370,
70402,
70403,
70462,
70463,
70465,
70468,
70471,
70472,
70475,
70477,
70487,
70487,
70498,
70499,
70832,
70834,
70841,
70841,
70843,
70846,
70849,
70849,
71087,
71089,
71096,
71099,
71102,
71102,
71216,
71218,
71227,
71228,
71230,
71230,
71340,
71340,
71342,
71343,
71350,
71350,
71456,
71457,
71462,
71462,
94033,
94078,
119141,
119142,
119149,
119154
],
[
1160,
1161,
6846,
6846,
8413,
8416,
8418,
8420,
42608,
42610
],
[
48,
57,
1632,
1641,
1776,
1785,
1984,
1993,
2406,
2415,
2534,
2543,
2662,
2671,
2790,
2799,
2918,
2927,
3046,
3055,
3174,
3183,
3302,
3311,
3430,
3439,
3558,
3567,
3664,
3673,
3792,
3801,
3872,
3881,
4160,
4169,
4240,
4249,
6112,
6121,
6160,
6169,
6470,
6479,
6608,
6617,
6784,
6793,
6800,
6809,
6992,
7001,
7088,
7097,
7232,
7241,
7248,
7257,
42528,
42537,
43216,
43225,
43264,
43273,
43472,
43481,
43504,
43513,
43600,
43609,
44016,
44025,
65296,
65305,
66720,
66729,
69734,
69743,
69872,
69881,
69942,
69951,
70096,
70105,
70384,
70393,
70864,
70873,
71248,
71257,
71360,
71369,
71472,
71481,
71904,
71913,
92768,
92777,
93008,
93017,
120782,
120831
],
[
5870,
5872,
8544,
8578,
8581,
8584,
12295,
12295,
12321,
12329,
12344,
12346,
42726,
42735,
65856,
65908,
66369,
66369,
66378,
66378,
66513,
66517,
74752,
74862
],
[
178,
179,
185,
185,
188,
190,
2548,
2553,
2930,
2935,
3056,
3058,
3192,
3198,
3440,
3445,
3882,
3891,
4969,
4988,
6128,
6137,
6618,
6618,
8304,
8304,
8308,
8313,
8320,
8329,
8528,
8543,
8585,
8585,
9312,
9371,
9450,
9471,
10102,
10131,
11517,
11517,
12690,
12693,
12832,
12841,
12872,
12879,
12881,
12895,
12928,
12937,
12977,
12991,
43056,
43061,
65799,
65843,
65909,
65912,
65930,
65931,
66273,
66299,
66336,
66339,
67672,
67679,
67705,
67711,
67751,
67759,
67835,
67839,
67862,
67867,
68028,
68029,
68032,
68047,
68050,
68095,
68160,
68167,
68221,
68222,
68253,
68255,
68331,
68335,
68440,
68447,
68472,
68479,
68521,
68527,
68858,
68863,
69216,
69246,
69714,
69733,
70113,
70132,
71482,
71483,
71914,
71922,
93019,
93025,
119648,
119665,
125127,
125135,
127232,
127244
],
[
32,
32,
160,
160,
5760,
5760,
8192,
8202,
8239,
8239,
8287,
8287,
12288,
12288
],
[
8232,
8232
],
[
8233,
8233
],
[
0,
31,
127,
159
],
[
1536,
1541,
1564,
1564,
1757,
1757,
1807,
1807,
6158,
6158,
8203,
8207,
8234,
8238,
8288,
8292,
8294,
8303,
65279,
65279,
65529,
65531,
69821,
69821,
113824,
113827,
119155,
119162,
917505,
917505,
917536,
917631
],
[],
[
57344,
63743,
983040,
1048573,
1048576,
1114109
],
[
95,
95,
8255,
8256,
8276,
8276,
65075,
65076,
65101,
65103,
65343,
65343
],
[
45,
45,
173,
173,
1418,
1418,
1470,
1470,
5120,
5120,
6150,
6150,
8208,
8213,
11799,
11799,
11802,
11802,
11834,
11835,
11840,
11840,
12316,
12316,
12336,
12336,
12448,
12448,
65073,
65074,
65112,
65112,
65123,
65123,
65293,
65293
],
[
40,
40,
91,
91,
123,
123,
3898,
3898,
3900,
3900,
5787,
5787,
8218,
8218,
8222,
8222,
8261,
8261,
8317,
8317,
8333,
8333,
8968,
8968,
8970,
8970,
9001,
9001,
10088,
10088,
10090,
10090,
10092,
10092,
10094,
10094,
10096,
10096,
10098,
10098,
10100,
10100,
10181,
10181,
10214,
10214,
10216,
10216,
10218,
10218,
10220,
10220,
10222,
10222,
10627,
10627,
10629,
10629,
10631,
10631,
10633,
10633,
10635,
10635,
10637,
10637,
10639,
10639,
10641,
10641,
10643,
10643,
10645,
10645,
10647,
10647,
10712,
10712,
10714,
10714,
10748,
10748,
11810,
11810,
11812,
11812,
11814,
11814,
11816,
11816,
11842,
11842,
12296,
12296,
12298,
12298,
12300,
12300,
12302,
12302,
12304,
12304,
12308,
12308,
12310,
12310,
12312,
12312,
12314,
12314,
12317,
12317,
64831,
64831,
65047,
65047,
65077,
65077,
65079,
65079,
65081,
65081,
65083,
65083,
65085,
65085,
65087,
65087,
65089,
65089,
65091,
65091,
65095,
65095,
65113,
65113,
65115,
65115,
65117,
65117,
65288,
65288,
65339,
65339,
65371,
65371,
65375,
65375,
65378,
65378
],
[
41,
41,
93,
93,
125,
125,
3899,
3899,
3901,
3901,
5788,
5788,
8262,
8262,
8318,
8318,
8334,
8334,
8969,
8969,
8971,
8971,
9002,
9002,
10089,
10089,
10091,
10091,
10093,
10093,
10095,
10095,
10097,
10097,
10099,
10099,
10101,
10101,
10182,
10182,
10215,
10215,
10217,
10217,
10219,
10219,
10221,
10221,
10223,
10223,
10628,
10628,
10630,
10630,
10632,
10632,
10634,
10634,
10636,
10636,
10638,
10638,
10640,
10640,
10642,
10642,
10644,
10644,
10646,
10646,
10648,
10648,
10713,
10713,
10715,
10715,
10749,
10749,
11811,
11811,
11813,
11813,
11815,
11815,
11817,
11817,
12297,
12297,
12299,
12299,
12301,
12301,
12303,
12303,
12305,
12305,
12309,
12309,
12311,
12311,
12313,
12313,
12315,
12315,
12318,
12319,
64830,
64830,
65048,
65048,
65078,
65078,
65080,
65080,
65082,
65082,
65084,
65084,
65086,
65086,
65088,
65088,
65090,
65090,
65092,
65092,
65096,
65096,
65114,
65114,
65116,
65116,
65118,
65118,
65289,
65289,
65341,
65341,
65373,
65373,
65376,
65376,
65379,
65379
],
[
171,
171,
8216,
8216,
8219,
8220,
8223,
8223,
8249,
8249,
11778,
11778,
11780,
11780,
11785,
11785,
11788,
11788,
11804,
11804,
11808,
11808
],
[
187,
187,
8217,
8217,
8221,
8221,
8250,
8250,
11779,
11779,
11781,
11781,
11786,
11786,
11789,
11789,
11805,
11805,
11809,
11809
],
[
33,
35,
37,
39,
42,
42,
44,
44,
46,
47,
58,
59,
63,
64,
92,
92,
161,
161,
183,
183,
191,
191,
894,
894,
903,
903,
1370,
1375,
1417,
1417,
1472,
1472,
1475,
1475,
1478,
1478,
1523,
1524,
1545,
1546,
1548,
1549,
1563,
1563,
1566,
1567,
1642,
1645,
1748,
1748,
1792,
1805,
2039,
2041,
2096,
2110,
2142,
2142,
2404,
2405,
2416,
2416,
2800,
2800,
3572,
3572,
3663,
3663,
3674,
3675,
3844,
3858,
3860,
3860,
3973,
3973,
4048,
4052,
4057,
4058,
4170,
4175,
4347,
4347,
4960,
4968,
5741,
5742,
5867,
5869,
5941,
5942,
6100,
6102,
6104,
6106,
6144,
6149,
6151,
6154,
6468,
6469,
6686,
6687,
6816,
6822,
6824,
6829,
7002,
7008,
7164,
7167,
7227,
7231,
7294,
7295,
7360,
7367,
7379,
7379,
8214,
8215,
8224,
8231,
8240,
8248,
8251,
8254,
8257,
8259,
8263,
8273,
8275,
8275,
8277,
8286,
11513,
11516,
11518,
11519,
11632,
11632,
11776,
11777,
11782,
11784,
11787,
11787,
11790,
11798,
11800,
11801,
11803,
11803,
11806,
11807,
11818,
11822,
11824,
11833,
11836,
11839,
11841,
11841,
12289,
12291,
12349,
12349,
12539,
12539,
42238,
42239,
42509,
42511,
42611,
42611,
42622,
42622,
42738,
42743,
43124,
43127,
43214,
43215,
43256,
43258,
43260,
43260,
43310,
43311,
43359,
43359,
43457,
43469,
43486,
43487,
43612,
43615,
43742,
43743,
43760,
43761,
44011,
44011,
65040,
65046,
65049,
65049,
65072,
65072,
65093,
65094,
65097,
65100,
65104,
65106,
65108,
65111,
65119,
65121,
65128,
65128,
65130,
65131,
65281,
65283,
65285,
65287,
65290,
65290,
65292,
65292,
65294,
65295,
65306,
65307,
65311,
65312,
65340,
65340,
65377,
65377,
65380,
65381,
65792,
65794,
66463,
66463,
66512,
66512,
66927,
66927,
67671,
67671,
67871,
67871,
67903,
67903,
68176,
68184,
68223,
68223,
68336,
68342,
68409,
68415,
68505,
68508,
69703,
69709,
69819,
69820,
69822,
69825,
69952,
69955,
70004,
70005,
70085,
70089,
70093,
70093,
70107,
70107,
70109,
70111,
70200,
70205,
70313,
70313,
70854,
70854,
71105,
71127,
71233,
71235,
71484,
71486,
74864,
74868,
92782,
92783,
92917,
92917,
92983,
92987,
92996,
92996,
113823,
113823,
121479,
121483
],
[
43,
43,
60,
62,
124,
124,
126,
126,
172,
172,
177,
177,
215,
215,
247,
247,
1014,
1014,
1542,
1544,
8260,
8260,
8274,
8274,
8314,
8316,
8330,
8332,
8472,
8472,
8512,
8516,
8523,
8523,
8592,
8596,
8602,
8603,
8608,
8608,
8611,
8611,
8614,
8614,
8622,
8622,
8654,
8655,
8658,
8658,
8660,
8660,
8692,
8959,
8992,
8993,
9084,
9084,
9115,
9139,
9180,
9185,
9655,
9655,
9665,
9665,
9720,
9727,
9839,
9839,
10176,
10180,
10183,
10213,
10224,
10239,
10496,
10626,
10649,
10711,
10716,
10747,
10750,
11007,
11056,
11076,
11079,
11084,
64297,
64297,
65122,
65122,
65124,
65126,
65291,
65291,
65308,
65310,
65372,
65372,
65374,
65374,
65506,
65506,
65513,
65516,
120513,
120513,
120539,
120539,
120571,
120571,
120597,
120597,
120629,
120629,
120655,
120655,
120687,
120687,
120713,
120713,
120745,
120745,
120771,
120771,
126704,
126705
],
[
36,
36,
162,
165,
1423,
1423,
1547,
1547,
2546,
2547,
2555,
2555,
2801,
2801,
3065,
3065,
3647,
3647,
6107,
6107,
8352,
8382,
43064,
43064,
65020,
65020,
65129,
65129,
65284,
65284,
65504,
65505,
65509,
65510
],
[
94,
94,
96,
96,
168,
168,
175,
175,
180,
180,
184,
184,
706,
709,
722,
735,
741,
747,
749,
749,
751,
767,
885,
885,
900,
901,
8125,
8125,
8127,
8129,
8141,
8143,
8157,
8159,
8173,
8175,
8189,
8190,
12443,
12444,
42752,
42774,
42784,
42785,
42889,
42890,
43867,
43867,
64434,
64449,
65342,
65342,
65344,
65344,
65507,
65507,
127995,
127999
],
[
166,
167,
169,
169,
174,
174,
176,
176,
182,
182,
1154,
1154,
1421,
1422,
1550,
1551,
1758,
1758,
1769,
1769,
1789,
1790,
2038,
2038,
2554,
2554,
2928,
2928,
3059,
3064,
3066,
3066,
3199,
3199,
3449,
3449,
3841,
3843,
3859,
3859,
3861,
3863,
3866,
3871,
3892,
3892,
3894,
3894,
3896,
3896,
4030,
4037,
4039,
4044,
4046,
4047,
4053,
4056,
4254,
4255,
5008,
5017,
6464,
6464,
6622,
6655,
7009,
7018,
7028,
7036,
8448,
8449,
8451,
8454,
8456,
8457,
8468,
8468,
8470,
8471,
8478,
8483,
8485,
8485,
8487,
8487,
8489,
8489,
8494,
8494,
8506,
8507,
8522,
8522,
8524,
8525,
8527,
8527,
8586,
8587,
8597,
8601,
8604,
8607,
8609,
8610,
8612,
8613,
8615,
8621,
8623,
8653,
8656,
8657,
8659,
8659,
8661,
8691,
8960,
8967,
8972,
8991,
8994,
9000,
9003,
9083,
9085,
9114,
9140,
9179,
9186,
9210,
9216,
9254,
9280,
9290,
9372,
9449,
9472,
9654,
9656,
9664,
9666,
9719,
9728,
9838,
9840,
10087,
10132,
10175,
10240,
10495,
11008,
11055,
11077,
11078,
11085,
11123,
11126,
11157,
11160,
11193,
11197,
11208,
11210,
11217,
11244,
11247,
11493,
11498,
11904,
11929,
11931,
12019,
12032,
12245,
12272,
12283,
12292,
12292,
12306,
12307,
12320,
12320,
12342,
12343,
12350,
12351,
12688,
12689,
12694,
12703,
12736,
12771,
12800,
12830,
12842,
12871,
12880,
12880,
12896,
12927,
12938,
12976,
12992,
13054,
13056,
13311,
19904,
19967,
42128,
42182,
43048,
43051,
43062,
43063,
43065,
43065,
43639,
43641,
65021,
65021,
65508,
65508,
65512,
65512,
65517,
65518,
65532,
65533,
65847,
65855,
65913,
65929,
65932,
65932,
65936,
65947,
65952,
65952,
66000,
66044,
67703,
67704,
68296,
68296,
71487,
71487,
92988,
92991,
92997,
92997,
113820,
113820,
118784,
119029,
119040,
119078,
119081,
119140,
119146,
119148,
119171,
119172,
119180,
119209,
119214,
119272,
119296,
119361,
119365,
119365,
119552,
119638,
120832,
121343,
121399,
121402,
121453,
121460,
121462,
121475,
121477,
121478,
126976,
127019,
127024,
127123,
127136,
127150,
127153,
127167,
127169,
127183,
127185,
127221,
127248,
127278,
127280,
127339,
127344,
127386,
127462,
127490,
127504,
127546,
127552,
127560,
127568,
127569,
127744,
127994,
128000,
128377,
128379,
128419,
128421,
128720,
128736,
128748,
128752,
128755,
128768,
128883,
128896,
128980,
129024,
129035,
129040,
129095,
129104,
129113,
129120,
129159,
129168,
129197,
129296,
129304,
129408,
129412,
129472,
129472
],
[
888,
889,
896,
899,
907,
907,
909,
909,
930,
930,
1328,
1328,
1367,
1368,
1376,
1376,
1416,
1416,
1419,
1420,
1424,
1424,
1480,
1487,
1515,
1519,
1525,
1535,
1565,
1565,
1806,
1806,
1867,
1868,
1970,
1983,
2043,
2047,
2094,
2095,
2111,
2111,
2140,
2141,
2143,
2207,
2229,
2274,
2436,
2436,
2445,
2446,
2449,
2450,
2473,
2473,
2481,
2481,
2483,
2485,
2490,
2491,
2501,
2502,
2505,
2506,
2511,
2518,
2520,
2523,
2526,
2526,
2532,
2533,
2556,
2560,
2564,
2564,
2571,
2574,
2577,
2578,
2601,
2601,
2609,
2609,
2612,
2612,
2615,
2615,
2618,
2619,
2621,
2621,
2627,
2630,
2633,
2634,
2638,
2640,
2642,
2648,
2653,
2653,
2655,
2661,
2678,
2688,
2692,
2692,
2702,
2702,
2706,
2706,
2729,
2729,
2737,
2737,
2740,
2740,
2746,
2747,
2758,
2758,
2762,
2762,
2766,
2767,
2769,
2783,
2788,
2789,
2802,
2808,
2810,
2816,
2820,
2820,
2829,
2830,
2833,
2834,
2857,
2857,
2865,
2865,
2868,
2868,
2874,
2875,
2885,
2886,
2889,
2890,
2894,
2901,
2904,
2907,
2910,
2910,
2916,
2917,
2936,
2945,
2948,
2948,
2955,
2957,
2961,
2961,
2966,
2968,
2971,
2971,
2973,
2973,
2976,
2978,
2981,
2983,
2987,
2989,
3002,
3005,
3011,
3013,
3017,
3017,
3022,
3023,
3025,
3030,
3032,
3045,
3067,
3071,
3076,
3076,
3085,
3085,
3089,
3089,
3113,
3113,
3130,
3132,
3141,
3141,
3145,
3145,
3150,
3156,
3159,
3159,
3163,
3167,
3172,
3173,
3184,
3191,
3200,
3200,
3204,
3204,
3213,
3213,
3217,
3217,
3241,
3241,
3252,
3252,
3258,
3259,
3269,
3269,
3273,
3273,
3278,
3284,
3287,
3293,
3295,
3295,
3300,
3301,
3312,
3312,
3315,
3328,
3332,
3332,
3341,
3341,
3345,
3345,
3387,
3388,
3397,
3397,
3401,
3401,
3407,
3414,
3416,
3422,
3428,
3429,
3446,
3448,
3456,
3457,
3460,
3460,
3479,
3481,
3506,
3506,
3516,
3516,
3518,
3519,
3527,
3529,
3531,
3534,
3541,
3541,
3543,
3543,
3552,
3557,
3568,
3569,
3573,
3584,
3643,
3646,
3676,
3712,
3715,
3715,
3717,
3718,
3721,
3721,
3723,
3724,
3726,
3731,
3736,
3736,
3744,
3744,
3748,
3748,
3750,
3750,
3752,
3753,
3756,
3756,
3770,
3770,
3774,
3775,
3781,
3781,
3783,
3783,
3790,
3791,
3802,
3803,
3808,
3839,
3912,
3912,
3949,
3952,
3992,
3992,
4029,
4029,
4045,
4045,
4059,
4095,
4294,
4294,
4296,
4300,
4302,
4303,
4681,
4681,
4686,
4687,
4695,
4695,
4697,
4697,
4702,
4703,
4745,
4745,
4750,
4751,
4785,
4785,
4790,
4791,
4799,
4799,
4801,
4801,
4806,
4807,
4823,
4823,
4881,
4881,
4886,
4887,
4955,
4956,
4989,
4991,
5018,
5023,
5110,
5111,
5118,
5119,
5789,
5791,
5881,
5887,
5901,
5901,
5909,
5919,
5943,
5951,
5972,
5983,
5997,
5997,
6001,
6001,
6004,
6015,
6110,
6111,
6122,
6127,
6138,
6143,
6159,
6159,
6170,
6175,
6264,
6271,
6315,
6319,
6390,
6399,
6431,
6431,
6444,
6447,
6460,
6463,
6465,
6467,
6510,
6511,
6517,
6527,
6572,
6575,
6602,
6607,
6619,
6621,
6684,
6685,
6751,
6751,
6781,
6782,
6794,
6799,
6810,
6815,
6830,
6831,
6847,
6911,
6988,
6991,
7037,
7039,
7156,
7163,
7224,
7226,
7242,
7244,
7296,
7359,
7368,
7375,
7415,
7415,
7418,
7423,
7670,
7675,
7958,
7959,
7966,
7967,
8006,
8007,
8014,
8015,
8024,
8024,
8026,
8026,
8028,
8028,
8030,
8030,
8062,
8063,
8117,
8117,
8133,
8133,
8148,
8149,
8156,
8156,
8176,
8177,
8181,
8181,
8191,
8191,
8293,
8293,
8306,
8307,
8335,
8335,
8349,
8351,
8383,
8399,
8433,
8447,
8588,
8591,
9211,
9215,
9255,
9279,
9291,
9311,
11124,
11125,
11158,
11159,
11194,
11196,
11209,
11209,
11218,
11243,
11248,
11263,
11311,
11311,
11359,
11359,
11508,
11512,
11558,
11558,
11560,
11564,
11566,
11567,
11624,
11630,
11633,
11646,
11671,
11679,
11687,
11687,
11695,
11695,
11703,
11703,
11711,
11711,
11719,
11719,
11727,
11727,
11735,
11735,
11743,
11743,
11843,
11903,
11930,
11930,
12020,
12031,
12246,
12271,
12284,
12287,
12352,
12352,
12439,
12440,
12544,
12548,
12590,
12592,
12687,
12687,
12731,
12735,
12772,
12783,
12831,
12831,
13055,
13055,
19894,
19903,
40918,
40959,
42125,
42127,
42183,
42191,
42540,
42559,
42744,
42751,
42926,
42927,
42936,
42998,
43052,
43055,
43066,
43071,
43128,
43135,
43205,
43213,
43226,
43231,
43262,
43263,
43348,
43358,
43389,
43391,
43470,
43470,
43482,
43485,
43519,
43519,
43575,
43583,
43598,
43599,
43610,
43611,
43715,
43738,
43767,
43776,
43783,
43784,
43791,
43792,
43799,
43807,
43815,
43815,
43823,
43823,
43878,
43887,
44014,
44015,
44026,
44031,
55204,
55215,
55239,
55242,
55292,
55295,
64110,
64111,
64218,
64255,
64263,
64274,
64280,
64284,
64311,
64311,
64317,
64317,
64319,
64319,
64322,
64322,
64325,
64325,
64450,
64466,
64832,
64847,
64912,
64913,
64968,
65007,
65022,
65023,
65050,
65055,
65107,
65107,
65127,
65127,
65132,
65135,
65141,
65141,
65277,
65278,
65280,
65280,
65471,
65473,
65480,
65481,
65488,
65489,
65496,
65497,
65501,
65503,
65511,
65511,
65519,
65528,
65534,
65535,
65548,
65548,
65575,
65575,
65595,
65595,
65598,
65598,
65614,
65615,
65630,
65663,
65787,
65791,
65795,
65798,
65844,
65846,
65933,
65935,
65948,
65951,
65953,
65999,
66046,
66175,
66205,
66207,
66257,
66271,
66300,
66303,
66340,
66351,
66379,
66383,
66427,
66431,
66462,
66462,
66500,
66503,
66518,
66559,
66718,
66719,
66730,
66815,
66856,
66863,
66916,
66926,
66928,
67071,
67383,
67391,
67414,
67423,
67432,
67583,
67590,
67591,
67593,
67593,
67638,
67638,
67641,
67643,
67645,
67646,
67670,
67670,
67743,
67750,
67760,
67807,
67827,
67827,
67830,
67834,
67868,
67870,
67898,
67902,
67904,
67967,
68024,
68027,
68048,
68049,
68100,
68100,
68103,
68107,
68116,
68116,
68120,
68120,
68148,
68151,
68155,
68158,
68168,
68175,
68185,
68191,
68256,
68287,
68327,
68330,
68343,
68351,
68406,
68408,
68438,
68439,
68467,
68471,
68498,
68504,
68509,
68520,
68528,
68607,
68681,
68735,
68787,
68799,
68851,
68857,
68864,
69215,
69247,
69631,
69710,
69713,
69744,
69758,
69826,
69839,
69865,
69871,
69882,
69887,
69941,
69941,
69956,
69967,
70007,
70015,
70094,
70095,
70112,
70112,
70133,
70143,
70162,
70162,
70206,
70271,
70279,
70279,
70281,
70281,
70286,
70286,
70302,
70302,
70314,
70319,
70379,
70383,
70394,
70399,
70404,
70404,
70413,
70414,
70417,
70418,
70441,
70441,
70449,
70449,
70452,
70452,
70458,
70459,
70469,
70470,
70473,
70474,
70478,
70479,
70481,
70486,
70488,
70492,
70500,
70501,
70509,
70511,
70517,
70783,
70856,
70863,
70874,
71039,
71094,
71095,
71134,
71167,
71237,
71247,
71258,
71295,
71352,
71359,
71370,
71423,
71450,
71452,
71468,
71471,
71488,
71839,
71923,
71934,
71936,
72383,
72441,
73727,
74650,
74751,
74863,
74863,
74869,
74879,
75076,
77823,
78895,
82943,
83527,
92159,
92729,
92735,
92767,
92767,
92778,
92781,
92784,
92879,
92910,
92911,
92918,
92927,
92998,
93007,
93018,
93018,
93026,
93026,
93048,
93052,
93072,
93951,
94021,
94031,
94079,
94094,
94112,
110591,
110594,
113663,
113771,
113775,
113789,
113791,
113801,
113807,
113818,
113819,
113828,
118783,
119030,
119039,
119079,
119080,
119273,
119295,
119366,
119551,
119639,
119647,
119666,
119807,
119893,
119893,
119965,
119965,
119968,
119969,
119971,
119972,
119975,
119976,
119981,
119981,
119994,
119994,
119996,
119996,
120004,
120004,
120070,
120070,
120075,
120076,
120085,
120085,
120093,
120093,
120122,
120122,
120127,
120127,
120133,
120133,
120135,
120137,
120145,
120145,
120486,
120487,
120780,
120781,
121484,
121498,
121504,
121504,
121520,
124927,
125125,
125126,
125143,
126463,
126468,
126468,
126496,
126496,
126499,
126499,
126501,
126502,
126504,
126504,
126515,
126515,
126520,
126520,
126522,
126522,
126524,
126529,
126531,
126534,
126536,
126536,
126538,
126538,
126540,
126540,
126544,
126544,
126547,
126547,
126549,
126550,
126552,
126552,
126554,
126554,
126556,
126556,
126558,
126558,
126560,
126560,
126563,
126563,
126565,
126566,
126571,
126571,
126579,
126579,
126584,
126584,
126589,
126589,
126591,
126591,
126602,
126602,
126620,
126624,
126628,
126628,
126634,
126634,
126652,
126703,
126706,
126975,
127020,
127023,
127124,
127135,
127151,
127152,
127168,
127168,
127184,
127184,
127222,
127231,
127245,
127247,
127279,
127279,
127340,
127343,
127387,
127461,
127491,
127503,
127547,
127551,
127561,
127567,
127570,
127743,
128378,
128378,
128420,
128420,
128721,
128735,
128749,
128751,
128756,
128767,
128884,
128895,
128981,
129023,
129036,
129039,
129096,
129103,
129114,
129119,
129160,
129167,
129198,
129295,
129305,
129407,
129413,
129471,
129473,
131071,
173783,
173823,
177973,
177983,
178206,
178207,
183970,
194559,
195102,
917504,
917506,
917535,
917632,
917759,
918000,
983039,
1048574,
1048575,
1114110,
1114111
]
];
static notUnicodeCategories = [
[
0,
64,
91,
191,
215,
215,
223,
255,
257,
257,
259,
259,
261,
261,
263,
263,
265,
265,
267,
267,
269,
269,
271,
271,
273,
273,
275,
275,
277,
277,
279,
279,
281,
281,
283,
283,
285,
285,
287,
287,
289,
289,
291,
291,
293,
293,
295,
295,
297,
297,
299,
299,
301,
301,
303,
303,
305,
305,
307,
307,
309,
309,
311,
312,
314,
314,
316,
316,
318,
318,
320,
320,
322,
322,
324,
324,
326,
326,
328,
329,
331,
331,
333,
333,
335,
335,
337,
337,
339,
339,
341,
341,
343,
343,
345,
345,
347,
347,
349,
349,
351,
351,
353,
353,
355,
355,
357,
357,
359,
359,
361,
361,
363,
363,
365,
365,
367,
367,
369,
369,
371,
371,
373,
373,
375,
375,
378,
378,
380,
380,
382,
384,
387,
387,
389,
389,
392,
392,
396,
397,
402,
402,
405,
405,
409,
411,
414,
414,
417,
417,
419,
419,
421,
421,
424,
424,
426,
427,
429,
429,
432,
432,
436,
436,
438,
438,
441,
443,
445,
451,
453,
454,
456,
457,
459,
460,
462,
462,
464,
464,
466,
466,
468,
468,
470,
470,
472,
472,
474,
474,
476,
477,
479,
479,
481,
481,
483,
483,
485,
485,
487,
487,
489,
489,
491,
491,
493,
493,
495,
496,
498,
499,
501,
501,
505,
505,
507,
507,
509,
509,
511,
511,
513,
513,
515,
515,
517,
517,
519,
519,
521,
521,
523,
523,
525,
525,
527,
527,
529,
529,
531,
531,
533,
533,
535,
535,
537,
537,
539,
539,
541,
541,
543,
543,
545,
545,
547,
547,
549,
549,
551,
551,
553,
553,
555,
555,
557,
557,
559,
559,
561,
561,
563,
569,
572,
572,
575,
576,
578,
578,
583,
583,
585,
585,
587,
587,
589,
589,
591,
879,
881,
881,
883,
885,
887,
894,
896,
901,
903,
903,
907,
907,
909,
909,
912,
912,
930,
930,
940,
974,
976,
977,
981,
983,
985,
985,
987,
987,
989,
989,
991,
991,
993,
993,
995,
995,
997,
997,
999,
999,
1001,
1001,
1003,
1003,
1005,
1005,
1007,
1011,
1013,
1014,
1016,
1016,
1019,
1020,
1072,
1119,
1121,
1121,
1123,
1123,
1125,
1125,
1127,
1127,
1129,
1129,
1131,
1131,
1133,
1133,
1135,
1135,
1137,
1137,
1139,
1139,
1141,
1141,
1143,
1143,
1145,
1145,
1147,
1147,
1149,
1149,
1151,
1151,
1153,
1161,
1163,
1163,
1165,
1165,
1167,
1167,
1169,
1169,
1171,
1171,
1173,
1173,
1175,
1175,
1177,
1177,
1179,
1179,
1181,
1181,
1183,
1183,
1185,
1185,
1187,
1187,
1189,
1189,
1191,
1191,
1193,
1193,
1195,
1195,
1197,
1197,
1199,
1199,
1201,
1201,
1203,
1203,
1205,
1205,
1207,
1207,
1209,
1209,
1211,
1211,
1213,
1213,
1215,
1215,
1218,
1218,
1220,
1220,
1222,
1222,
1224,
1224,
1226,
1226,
1228,
1228,
1230,
1231,
1233,
1233,
1235,
1235,
1237,
1237,
1239,
1239,
1241,
1241,
1243,
1243,
1245,
1245,
1247,
1247,
1249,
1249,
1251,
1251,
1253,
1253,
1255,
1255,
1257,
1257,
1259,
1259,
1261,
1261,
1263,
1263,
1265,
1265,
1267,
1267,
1269,
1269,
1271,
1271,
1273,
1273,
1275,
1275,
1277,
1277,
1279,
1279,
1281,
1281,
1283,
1283,
1285,
1285,
1287,
1287,
1289,
1289,
1291,
1291,
1293,
1293,
1295,
1295,
1297,
1297,
1299,
1299,
1301,
1301,
1303,
1303,
1305,
1305,
1307,
1307,
1309,
1309,
1311,
1311,
1313,
1313,
1315,
1315,
1317,
1317,
1319,
1319,
1321,
1321,
1323,
1323,
1325,
1325,
1327,
1328,
1367,
4255,
4294,
4294,
4296,
4300,
4302,
5023,
5110,
7679,
7681,
7681,
7683,
7683,
7685,
7685,
7687,
7687,
7689,
7689,
7691,
7691,
7693,
7693,
7695,
7695,
7697,
7697,
7699,
7699,
7701,
7701,
7703,
7703,
7705,
7705,
7707,
7707,
7709,
7709,
7711,
7711,
7713,
7713,
7715,
7715,
7717,
7717,
7719,
7719,
7721,
7721,
7723,
7723,
7725,
7725,
7727,
7727,
7729,
7729,
7731,
7731,
7733,
7733,
7735,
7735,
7737,
7737,
7739,
7739,
7741,
7741,
7743,
7743,
7745,
7745,
7747,
7747,
7749,
7749,
7751,
7751,
7753,
7753,
7755,
7755,
7757,
7757,
7759,
7759,
7761,
7761,
7763,
7763,
7765,
7765,
7767,
7767,
7769,
7769,
7771,
7771,
7773,
7773,
7775,
7775,
7777,
7777,
7779,
7779,
7781,
7781,
7783,
7783,
7785,
7785,
7787,
7787,
7789,
7789,
7791,
7791,
7793,
7793,
7795,
7795,
7797,
7797,
7799,
7799,
7801,
7801,
7803,
7803,
7805,
7805,
7807,
7807,
7809,
7809,
7811,
7811,
7813,
7813,
7815,
7815,
7817,
7817,
7819,
7819,
7821,
7821,
7823,
7823,
7825,
7825,
7827,
7827,
7829,
7837,
7839,
7839,
7841,
7841,
7843,
7843,
7845,
7845,
7847,
7847,
7849,
7849,
7851,
7851,
7853,
7853,
7855,
7855,
7857,
7857,
7859,
7859,
7861,
7861,
7863,
7863,
7865,
7865,
7867,
7867,
7869,
7869,
7871,
7871,
7873,
7873,
7875,
7875,
7877,
7877,
7879,
7879,
7881,
7881,
7883,
7883,
7885,
7885,
7887,
7887,
7889,
7889,
7891,
7891,
7893,
7893,
7895,
7895,
7897,
7897,
7899,
7899,
7901,
7901,
7903,
7903,
7905,
7905,
7907,
7907,
7909,
7909,
7911,
7911,
7913,
7913,
7915,
7915,
7917,
7917,
7919,
7919,
7921,
7921,
7923,
7923,
7925,
7925,
7927,
7927,
7929,
7929,
7931,
7931,
7933,
7933,
7935,
7943,
7952,
7959,
7966,
7975,
7984,
7991,
8000,
8007,
8014,
8024,
8026,
8026,
8028,
8028,
8030,
8030,
8032,
8039,
8048,
8119,
8124,
8135,
8140,
8151,
8156,
8167,
8173,
8183,
8188,
8449,
8451,
8454,
8456,
8458,
8462,
8463,
8467,
8468,
8470,
8472,
8478,
8483,
8485,
8485,
8487,
8487,
8489,
8489,
8494,
8495,
8500,
8509,
8512,
8516,
8518,
8578,
8580,
11263,
11311,
11359,
11361,
11361,
11365,
11366,
11368,
11368,
11370,
11370,
11372,
11372,
11377,
11377,
11379,
11380,
11382,
11389,
11393,
11393,
11395,
11395,
11397,
11397,
11399,
11399,
11401,
11401,
11403,
11403,
11405,
11405,
11407,
11407,
11409,
11409,
11411,
11411,
11413,
11413,
11415,
11415,
11417,
11417,
11419,
11419,
11421,
11421,
11423,
11423,
11425,
11425,
11427,
11427,
11429,
11429,
11431,
11431,
11433,
11433,
11435,
11435,
11437,
11437,
11439,
11439,
11441,
11441,
11443,
11443,
11445,
11445,
11447,
11447,
11449,
11449,
11451,
11451,
11453,
11453,
11455,
11455,
11457,
11457,
11459,
11459,
11461,
11461,
11463,
11463,
11465,
11465,
11467,
11467,
11469,
11469,
11471,
11471,
11473,
11473,
11475,
11475,
11477,
11477,
11479,
11479,
11481,
11481,
11483,
11483,
11485,
11485,
11487,
11487,
11489,
11489,
11491,
11498,
11500,
11500,
11502,
11505,
11507,
42559,
42561,
42561,
42563,
42563,
42565,
42565,
42567,
42567,
42569,
42569,
42571,
42571,
42573,
42573,
42575,
42575,
42577,
42577,
42579,
42579,
42581,
42581,
42583,
42583,
42585,
42585,
42587,
42587,
42589,
42589,
42591,
42591,
42593,
42593,
42595,
42595,
42597,
42597,
42599,
42599,
42601,
42601,
42603,
42603,
42605,
42623,
42625,
42625,
42627,
42627,
42629,
42629,
42631,
42631,
42633,
42633,
42635,
42635,
42637,
42637,
42639,
42639,
42641,
42641,
42643,
42643,
42645,
42645,
42647,
42647,
42649,
42649,
42651,
42785,
42787,
42787,
42789,
42789,
42791,
42791,
42793,
42793,
42795,
42795,
42797,
42797,
42799,
42801,
42803,
42803,
42805,
42805,
42807,
42807,
42809,
42809,
42811,
42811,
42813,
42813,
42815,
42815,
42817,
42817,
42819,
42819,
42821,
42821,
42823,
42823,
42825,
42825,
42827,
42827,
42829,
42829,
42831,
42831,
42833,
42833,
42835,
42835,
42837,
42837,
42839,
42839,
42841,
42841,
42843,
42843,
42845,
42845,
42847,
42847,
42849,
42849,
42851,
42851,
42853,
42853,
42855,
42855,
42857,
42857,
42859,
42859,
42861,
42861,
42863,
42872,
42874,
42874,
42876,
42876,
42879,
42879,
42881,
42881,
42883,
42883,
42885,
42885,
42887,
42890,
42892,
42892,
42894,
42895,
42897,
42897,
42899,
42901,
42903,
42903,
42905,
42905,
42907,
42907,
42909,
42909,
42911,
42911,
42913,
42913,
42915,
42915,
42917,
42917,
42919,
42919,
42921,
42921,
42926,
42927,
42933,
42933,
42935,
55295,
57344,
65312,
65339,
66559,
66600,
68735,
68787,
71839,
71872,
119807,
119834,
119859,
119886,
119911,
119938,
119963,
119965,
119965,
119968,
119969,
119971,
119972,
119975,
119976,
119981,
119981,
119990,
120015,
120042,
120067,
120070,
120070,
120075,
120076,
120085,
120085,
120093,
120119,
120122,
120122,
120127,
120127,
120133,
120133,
120135,
120137,
120145,
120171,
120198,
120223,
120250,
120275,
120302,
120327,
120354,
120379,
120406,
120431,
120458,
120487,
120513,
120545,
120571,
120603,
120629,
120661,
120687,
120719,
120745,
120777,
120779,
1114111
],
[
0,
96,
123,
169,
171,
180,
182,
185,
187,
222,
247,
247,
256,
256,
258,
258,
260,
260,
262,
262,
264,
264,
266,
266,
268,
268,
270,
270,
272,
272,
274,
274,
276,
276,
278,
278,
280,
280,
282,
282,
284,
284,
286,
286,
288,
288,
290,
290,
292,
292,
294,
294,
296,
296,
298,
298,
300,
300,
302,
302,
304,
304,
306,
306,
308,
308,
310,
310,
313,
313,
315,
315,
317,
317,
319,
319,
321,
321,
323,
323,
325,
325,
327,
327,
330,
330,
332,
332,
334,
334,
336,
336,
338,
338,
340,
340,
342,
342,
344,
344,
346,
346,
348,
348,
350,
350,
352,
352,
354,
354,
356,
356,
358,
358,
360,
360,
362,
362,
364,
364,
366,
366,
368,
368,
370,
370,
372,
372,
374,
374,
376,
377,
379,
379,
381,
381,
385,
386,
388,
388,
390,
391,
393,
395,
398,
401,
403,
404,
406,
408,
412,
413,
415,
416,
418,
418,
420,
420,
422,
423,
425,
425,
428,
428,
430,
431,
433,
435,
437,
437,
439,
440,
443,
444,
448,
453,
455,
456,
458,
459,
461,
461,
463,
463,
465,
465,
467,
467,
469,
469,
471,
471,
473,
473,
475,
475,
478,
478,
480,
480,
482,
482,
484,
484,
486,
486,
488,
488,
490,
490,
492,
492,
494,
494,
497,
498,
500,
500,
502,
504,
506,
506,
508,
508,
510,
510,
512,
512,
514,
514,
516,
516,
518,
518,
520,
520,
522,
522,
524,
524,
526,
526,
528,
528,
530,
530,
532,
532,
534,
534,
536,
536,
538,
538,
540,
540,
542,
542,
544,
544,
546,
546,
548,
548,
550,
550,
552,
552,
554,
554,
556,
556,
558,
558,
560,
560,
562,
562,
570,
571,
573,
574,
577,
577,
579,
582,
584,
584,
586,
586,
588,
588,
590,
590,
660,
660,
688,
880,
882,
882,
884,
886,
888,
890,
894,
911,
913,
939,
975,
975,
978,
980,
984,
984,
986,
986,
988,
988,
990,
990,
992,
992,
994,
994,
996,
996,
998,
998,
1000,
1000,
1002,
1002,
1004,
1004,
1006,
1006,
1012,
1012,
1014,
1015,
1017,
1018,
1021,
1071,
1120,
1120,
1122,
1122,
1124,
1124,
1126,
1126,
1128,
1128,
1130,
1130,
1132,
1132,
1134,
1134,
1136,
1136,
1138,
1138,
1140,
1140,
1142,
1142,
1144,
1144,
1146,
1146,
1148,
1148,
1150,
1150,
1152,
1152,
1154,
1162,
1164,
1164,
1166,
1166,
1168,
1168,
1170,
1170,
1172,
1172,
1174,
1174,
1176,
1176,
1178,
1178,
1180,
1180,
1182,
1182,
1184,
1184,
1186,
1186,
1188,
1188,
1190,
1190,
1192,
1192,
1194,
1194,
1196,
1196,
1198,
1198,
1200,
1200,
1202,
1202,
1204,
1204,
1206,
1206,
1208,
1208,
1210,
1210,
1212,
1212,
1214,
1214,
1216,
1217,
1219,
1219,
1221,
1221,
1223,
1223,
1225,
1225,
1227,
1227,
1229,
1229,
1232,
1232,
1234,
1234,
1236,
1236,
1238,
1238,
1240,
1240,
1242,
1242,
1244,
1244,
1246,
1246,
1248,
1248,
1250,
1250,
1252,
1252,
1254,
1254,
1256,
1256,
1258,
1258,
1260,
1260,
1262,
1262,
1264,
1264,
1266,
1266,
1268,
1268,
1270,
1270,
1272,
1272,
1274,
1274,
1276,
1276,
1278,
1278,
1280,
1280,
1282,
1282,
1284,
1284,
1286,
1286,
1288,
1288,
1290,
1290,
1292,
1292,
1294,
1294,
1296,
1296,
1298,
1298,
1300,
1300,
1302,
1302,
1304,
1304,
1306,
1306,
1308,
1308,
1310,
1310,
1312,
1312,
1314,
1314,
1316,
1316,
1318,
1318,
1320,
1320,
1322,
1322,
1324,
1324,
1326,
1326,
1328,
1376,
1416,
5111,
5118,
7423,
7468,
7530,
7544,
7544,
7579,
7680,
7682,
7682,
7684,
7684,
7686,
7686,
7688,
7688,
7690,
7690,
7692,
7692,
7694,
7694,
7696,
7696,
7698,
7698,
7700,
7700,
7702,
7702,
7704,
7704,
7706,
7706,
7708,
7708,
7710,
7710,
7712,
7712,
7714,
7714,
7716,
7716,
7718,
7718,
7720,
7720,
7722,
7722,
7724,
7724,
7726,
7726,
7728,
7728,
7730,
7730,
7732,
7732,
7734,
7734,
7736,
7736,
7738,
7738,
7740,
7740,
7742,
7742,
7744,
7744,
7746,
7746,
7748,
7748,
7750,
7750,
7752,
7752,
7754,
7754,
7756,
7756,
7758,
7758,
7760,
7760,
7762,
7762,
7764,
7764,
7766,
7766,
7768,
7768,
7770,
7770,
7772,
7772,
7774,
7774,
7776,
7776,
7778,
7778,
7780,
7780,
7782,
7782,
7784,
7784,
7786,
7786,
7788,
7788,
7790,
7790,
7792,
7792,
7794,
7794,
7796,
7796,
7798,
7798,
7800,
7800,
7802,
7802,
7804,
7804,
7806,
7806,
7808,
7808,
7810,
7810,
7812,
7812,
7814,
7814,
7816,
7816,
7818,
7818,
7820,
7820,
7822,
7822,
7824,
7824,
7826,
7826,
7828,
7828,
7838,
7838,
7840,
7840,
7842,
7842,
7844,
7844,
7846,
7846,
7848,
7848,
7850,
7850,
7852,
7852,
7854,
7854,
7856,
7856,
7858,
7858,
7860,
7860,
7862,
7862,
7864,
7864,
7866,
7866,
7868,
7868,
7870,
7870,
7872,
7872,
7874,
7874,
7876,
7876,
7878,
7878,
7880,
7880,
7882,
7882,
7884,
7884,
7886,
7886,
7888,
7888,
7890,
7890,
7892,
7892,
7894,
7894,
7896,
7896,
7898,
7898,
7900,
7900,
7902,
7902,
7904,
7904,
7906,
7906,
7908,
7908,
7910,
7910,
7912,
7912,
7914,
7914,
7916,
7916,
7918,
7918,
7920,
7920,
7922,
7922,
7924,
7924,
7926,
7926,
7928,
7928,
7930,
7930,
7932,
7932,
7934,
7934,
7944,
7951,
7958,
7967,
7976,
7983,
7992,
7999,
8006,
8015,
8024,
8031,
8040,
8047,
8062,
8063,
8072,
8079,
8088,
8095,
8104,
8111,
8117,
8117,
8120,
8125,
8127,
8129,
8133,
8133,
8136,
8143,
8148,
8149,
8152,
8159,
8168,
8177,
8181,
8181,
8184,
8457,
8459,
8461,
8464,
8466,
8468,
8494,
8496,
8499,
8501,
8504,
8506,
8507,
8510,
8517,
8522,
8525,
8527,
8579,
8581,
11311,
11359,
11360,
11362,
11364,
11367,
11367,
11369,
11369,
11371,
11371,
11373,
11376,
11378,
11378,
11381,
11381,
11388,
11392,
11394,
11394,
11396,
11396,
11398,
11398,
11400,
11400,
11402,
11402,
11404,
11404,
11406,
11406,
11408,
11408,
11410,
11410,
11412,
11412,
11414,
11414,
11416,
11416,
11418,
11418,
11420,
11420,
11422,
11422,
11424,
11424,
11426,
11426,
11428,
11428,
11430,
11430,
11432,
11432,
11434,
11434,
11436,
11436,
11438,
11438,
11440,
11440,
11442,
11442,
11444,
11444,
11446,
11446,
11448,
11448,
11450,
11450,
11452,
11452,
11454,
11454,
11456,
11456,
11458,
11458,
11460,
11460,
11462,
11462,
11464,
11464,
11466,
11466,
11468,
11468,
11470,
11470,
11472,
11472,
11474,
11474,
11476,
11476,
11478,
11478,
11480,
11480,
11482,
11482,
11484,
11484,
11486,
11486,
11488,
11488,
11490,
11490,
11493,
11499,
11501,
11501,
11503,
11506,
11508,
11519,
11558,
11558,
11560,
11564,
11566,
42560,
42562,
42562,
42564,
42564,
42566,
42566,
42568,
42568,
42570,
42570,
42572,
42572,
42574,
42574,
42576,
42576,
42578,
42578,
42580,
42580,
42582,
42582,
42584,
42584,
42586,
42586,
42588,
42588,
42590,
42590,
42592,
42592,
42594,
42594,
42596,
42596,
42598,
42598,
42600,
42600,
42602,
42602,
42604,
42604,
42606,
42624,
42626,
42626,
42628,
42628,
42630,
42630,
42632,
42632,
42634,
42634,
42636,
42636,
42638,
42638,
42640,
42640,
42642,
42642,
42644,
42644,
42646,
42646,
42648,
42648,
42650,
42650,
42652,
42786,
42788,
42788,
42790,
42790,
42792,
42792,
42794,
42794,
42796,
42796,
42798,
42798,
42802,
42802,
42804,
42804,
42806,
42806,
42808,
42808,
42810,
42810,
42812,
42812,
42814,
42814,
42816,
42816,
42818,
42818,
42820,
42820,
42822,
42822,
42824,
42824,
42826,
42826,
42828,
42828,
42830,
42830,
42832,
42832,
42834,
42834,
42836,
42836,
42838,
42838,
42840,
42840,
42842,
42842,
42844,
42844,
42846,
42846,
42848,
42848,
42850,
42850,
42852,
42852,
42854,
42854,
42856,
42856,
42858,
42858,
42860,
42860,
42862,
42862,
42864,
42864,
42873,
42873,
42875,
42875,
42877,
42878,
42880,
42880,
42882,
42882,
42884,
42884,
42886,
42886,
42888,
42891,
42893,
42893,
42895,
42896,
42898,
42898,
42902,
42902,
42904,
42904,
42906,
42906,
42908,
42908,
42910,
42910,
42912,
42912,
42914,
42914,
42916,
42916,
42918,
42918,
42920,
42920,
42922,
42932,
42934,
42934,
42936,
43001,
43003,
43823,
43867,
43871,
43878,
43887,
43968,
55295,
57344,
64255,
64263,
64274,
64280,
65344,
65371,
66599,
66640,
68799,
68851,
71871,
71904,
119833,
119860,
119885,
119893,
119893,
119912,
119937,
119964,
119989,
119994,
119994,
119996,
119996,
120004,
120004,
120016,
120041,
120068,
120093,
120120,
120145,
120172,
120197,
120224,
120249,
120276,
120301,
120328,
120353,
120380,
120405,
120432,
120457,
120486,
120513,
120539,
120539,
120546,
120571,
120597,
120597,
120604,
120629,
120655,
120655,
120662,
120687,
120713,
120713,
120720,
120745,
120771,
120771,
120778,
120778,
120780,
1114111
],
[
0,
452,
454,
455,
457,
458,
460,
497,
499,
8071,
8080,
8087,
8096,
8103,
8112,
8123,
8125,
8139,
8141,
8187,
8189,
55295,
57344,
1114111
],
[
0,
687,
706,
709,
722,
735,
741,
747,
749,
749,
751,
883,
885,
889,
891,
1368,
1370,
1599,
1601,
1764,
1767,
2035,
2038,
2041,
2043,
2073,
2075,
2083,
2085,
2087,
2089,
2416,
2418,
3653,
3655,
3781,
3783,
4347,
4349,
6102,
6104,
6210,
6212,
6822,
6824,
7287,
7294,
7467,
7531,
7543,
7545,
7578,
7616,
8304,
8306,
8318,
8320,
8335,
8349,
11387,
11390,
11630,
11632,
11822,
11824,
12292,
12294,
12336,
12342,
12346,
12348,
12444,
12447,
12539,
12543,
40980,
40982,
42231,
42238,
42507,
42509,
42622,
42624,
42651,
42654,
42774,
42784,
42863,
42865,
42887,
42889,
42999,
43002,
43470,
43472,
43493,
43495,
43631,
43633,
43740,
43742,
43762,
43765,
43867,
43872,
55295,
57344,
65391,
65393,
65437,
65440,
92991,
92996,
94098,
94112,
1114111
],
[
0,
442,
444,
447,
452,
659,
661,
1487,
1515,
1519,
1523,
1567,
1600,
1600,
1611,
1645,
1648,
1648,
1748,
1748,
1750,
1773,
1776,
1785,
1789,
1790,
1792,
1807,
1809,
1809,
1840,
1868,
1958,
1968,
1970,
1993,
2027,
2047,
2070,
2111,
2137,
2207,
2229,
2307,
2362,
2364,
2366,
2383,
2385,
2391,
2402,
2417,
2433,
2436,
2445,
2446,
2449,
2450,
2473,
2473,
2481,
2481,
2483,
2485,
2490,
2492,
2494,
2509,
2511,
2523,
2526,
2526,
2530,
2543,
2546,
2564,
2571,
2574,
2577,
2578,
2601,
2601,
2609,
2609,
2612,
2612,
2615,
2615,
2618,
2648,
2653,
2653,
2655,
2673,
2677,
2692,
2702,
2702,
2706,
2706,
2729,
2729,
2737,
2737,
2740,
2740,
2746,
2748,
2750,
2767,
2769,
2783,
2786,
2808,
2810,
2820,
2829,
2830,
2833,
2834,
2857,
2857,
2865,
2865,
2868,
2868,
2874,
2876,
2878,
2907,
2910,
2910,
2914,
2928,
2930,
2946,
2948,
2948,
2955,
2957,
2961,
2961,
2966,
2968,
2971,
2971,
2973,
2973,
2976,
2978,
2981,
2983,
2987,
2989,
3002,
3023,
3025,
3076,
3085,
3085,
3089,
3089,
3113,
3113,
3130,
3132,
3134,
3159,
3163,
3167,
3170,
3204,
3213,
3213,
3217,
3217,
3241,
3241,
3252,
3252,
3258,
3260,
3262,
3293,
3295,
3295,
3298,
3312,
3315,
3332,
3341,
3341,
3345,
3345,
3387,
3388,
3390,
3405,
3407,
3422,
3426,
3449,
3456,
3460,
3479,
3481,
3506,
3506,
3516,
3516,
3518,
3519,
3527,
3584,
3633,
3633,
3636,
3647,
3654,
3712,
3715,
3715,
3717,
3718,
3721,
3721,
3723,
3724,
3726,
3731,
3736,
3736,
3744,
3744,
3748,
3748,
3750,
3750,
3752,
3753,
3756,
3756,
3761,
3761,
3764,
3772,
3774,
3775,
3781,
3803,
3808,
3839,
3841,
3903,
3912,
3912,
3949,
3975,
3981,
4095,
4139,
4158,
4160,
4175,
4182,
4185,
4190,
4192,
4194,
4196,
4199,
4205,
4209,
4212,
4226,
4237,
4239,
4303,
4347,
4348,
4681,
4681,
4686,
4687,
4695,
4695,
4697,
4697,
4702,
4703,
4745,
4745,
4750,
4751,
4785,
4785,
4790,
4791,
4799,
4799,
4801,
4801,
4806,
4807,
4823,
4823,
4881,
4881,
4886,
4887,
4955,
4991,
5008,
5120,
5741,
5742,
5760,
5760,
5787,
5791,
5867,
5872,
5881,
5887,
5901,
5901,
5906,
5919,
5938,
5951,
5970,
5983,
5997,
5997,
6001,
6015,
6068,
6107,
6109,
6175,
6211,
6211,
6264,
6271,
6313,
6313,
6315,
6319,
6390,
6399,
6431,
6479,
6510,
6511,
6517,
6527,
6572,
6575,
6602,
6655,
6679,
6687,
6741,
6916,
6964,
6980,
6988,
7042,
7073,
7085,
7088,
7097,
7142,
7167,
7204,
7244,
7248,
7257,
7288,
7400,
7405,
7405,
7410,
7412,
7415,
8500,
8505,
11567,
11624,
11647,
11671,
11679,
11687,
11687,
11695,
11695,
11703,
11703,
11711,
11711,
11719,
11719,
11727,
11727,
11735,
11735,
11743,
12293,
12295,
12347,
12349,
12352,
12439,
12446,
12448,
12448,
12539,
12542,
12544,
12548,
12590,
12592,
12687,
12703,
12731,
12783,
12800,
13311,
19894,
19967,
40918,
40959,
40981,
40981,
42125,
42191,
42232,
42239,
42508,
42511,
42528,
42537,
42540,
42605,
42607,
42655,
42726,
42894,
42896,
42998,
43000,
43002,
43010,
43010,
43014,
43014,
43019,
43019,
43043,
43071,
43124,
43137,
43188,
43249,
43256,
43258,
43260,
43260,
43262,
43273,
43302,
43311,
43335,
43359,
43389,
43395,
43443,
43487,
43493,
43494,
43504,
43513,
43519,
43519,
43561,
43583,
43587,
43587,
43596,
43615,
43632,
43632,
43639,
43641,
43643,
43645,
43696,
43696,
43698,
43700,
43703,
43704,
43710,
43711,
43713,
43713,
43715,
43738,
43741,
43743,
43755,
43761,
43763,
43776,
43783,
43784,
43791,
43792,
43799,
43807,
43815,
43815,
43823,
43967,
44003,
44031,
55204,
55215,
55239,
55242,
55292,
55295,
57344,
63743,
64110,
64111,
64218,
64284,
64286,
64286,
64297,
64297,
64311,
64311,
64317,
64317,
64319,
64319,
64322,
64322,
64325,
64325,
64434,
64466,
64830,
64847,
64912,
64913,
64968,
65007,
65020,
65135,
65141,
65141,
65277,
65381,
65392,
65392,
65438,
65439,
65471,
65473,
65480,
65481,
65488,
65489,
65496,
65497,
65501,
65535,
65548,
65548,
65575,
65575,
65595,
65595,
65598,
65598,
65614,
65615,
65630,
65663,
65787,
66175,
66205,
66207,
66257,
66303,
66336,
66351,
66369,
66369,
66378,
66383,
66422,
66431,
66462,
66463,
66500,
66503,
66512,
66639,
66718,
66815,
66856,
66863,
66916,
67071,
67383,
67391,
67414,
67423,
67432,
67583,
67590,
67591,
67593,
67593,
67638,
67638,
67641,
67643,
67645,
67646,
67670,
67679,
67703,
67711,
67743,
67807,
67827,
67827,
67830,
67839,
67862,
67871,
67898,
67967,
68024,
68029,
68032,
68095,
68097,
68111,
68116,
68116,
68120,
68120,
68148,
68191,
68221,
68223,
68253,
68287,
68296,
68296,
68325,
68351,
68406,
68415,
68438,
68447,
68467,
68479,
68498,
68607,
68681,
69634,
69688,
69762,
69808,
69839,
69865,
69890,
69927,
69967,
70003,
70005,
70007,
70018,
70067,
70080,
70085,
70105,
70107,
70107,
70109,
70143,
70162,
70162,
70188,
70271,
70279,
70279,
70281,
70281,
70286,
70286,
70302,
70302,
70313,
70319,
70367,
70404,
70413,
70414,
70417,
70418,
70441,
70441,
70449,
70449,
70452,
70452,
70458,
70460,
70462,
70479,
70481,
70492,
70498,
70783,
70832,
70851,
70854,
70854,
70856,
71039,
71087,
71127,
71132,
71167,
71216,
71235,
71237,
71295,
71339,
71423,
71450,
71934,
71936,
72383,
72441,
73727,
74650,
74879,
75076,
77823,
78895,
82943,
83527,
92159,
92729,
92735,
92767,
92879,
92910,
92927,
92976,
93026,
93048,
93052,
93072,
93951,
94021,
94031,
94033,
110591,
110594,
113663,
113771,
113775,
113789,
113791,
113801,
113807,
113818,
124927,
125125,
126463,
126468,
126468,
126496,
126496,
126499,
126499,
126501,
126502,
126504,
126504,
126515,
126515,
126520,
126520,
126522,
126522,
126524,
126529,
126531,
126534,
126536,
126536,
126538,
126538,
126540,
126540,
126544,
126544,
126547,
126547,
126549,
126550,
126552,
126552,
126554,
126554,
126556,
126556,
126558,
126558,
126560,
126560,
126563,
126563,
126565,
126566,
126571,
126571,
126579,
126579,
126584,
126584,
126589,
126589,
126591,
126591,
126602,
126602,
126620,
126624,
126628,
126628,
126634,
126634,
126652,
131071,
173783,
173823,
177973,
177983,
178206,
178207,
183970,
194559,
195102,
1114111
],
[
0,
767,
880,
1154,
1160,
1424,
1470,
1470,
1472,
1472,
1475,
1475,
1478,
1478,
1480,
1551,
1563,
1610,
1632,
1647,
1649,
1749,
1757,
1758,
1765,
1766,
1769,
1769,
1774,
1808,
1810,
1839,
1867,
1957,
1969,
2026,
2036,
2069,
2074,
2074,
2084,
2084,
2088,
2088,
2094,
2136,
2140,
2274,
2307,
2361,
2363,
2363,
2365,
2368,
2377,
2380,
2382,
2384,
2392,
2401,
2404,
2432,
2434,
2491,
2493,
2496,
2501,
2508,
2510,
2529,
2532,
2560,
2563,
2619,
2621,
2624,
2627,
2630,
2633,
2634,
2638,
2640,
2642,
2671,
2674,
2676,
2678,
2688,
2691,
2747,
2749,
2752,
2758,
2758,
2761,
2764,
2766,
2785,
2788,
2816,
2818,
2875,
2877,
2878,
2880,
2880,
2885,
2892,
2894,
2901,
2903,
2913,
2916,
2945,
2947,
3007,
3009,
3020,
3022,
3071,
3073,
3133,
3137,
3141,
3145,
3145,
3150,
3156,
3159,
3169,
3172,
3200,
3202,
3259,
3261,
3262,
3264,
3269,
3271,
3275,
3278,
3297,
3300,
3328,
3330,
3392,
3397,
3404,
3406,
3425,
3428,
3529,
3531,
3537,
3541,
3541,
3543,
3632,
3634,
3635,
3643,
3654,
3663,
3760,
3762,
3763,
3770,
3770,
3773,
3783,
3790,
3863,
3866,
3892,
3894,
3894,
3896,
3896,
3898,
3952,
3967,
3967,
3973,
3973,
3976,
3980,
3992,
3992,
4029,
4037,
4039,
4140,
4145,
4145,
4152,
4152,
4155,
4156,
4159,
4183,
4186,
4189,
4193,
4208,
4213,
4225,
4227,
4228,
4231,
4236,
4238,
4252,
4254,
4956,
4960,
5905,
5909,
5937,
5941,
5969,
5972,
6001,
6004,
6067,
6070,
6070,
6078,
6085,
6087,
6088,
6100,
6108,
6110,
6154,
6158,
6312,
6314,
6431,
6435,
6438,
6441,
6449,
6451,
6456,
6460,
6678,
6681,
6682,
6684,
6741,
6743,
6743,
6751,
6751,
6753,
6753,
6755,
6756,
6765,
6770,
6781,
6782,
6784,
6831,
6846,
6911,
6916,
6963,
6965,
6965,
6971,
6971,
6973,
6977,
6979,
7018,
7028,
7039,
7042,
7073,
7078,
7079,
7082,
7082,
7086,
7141,
7143,
7143,
7146,
7148,
7150,
7150,
7154,
7211,
7220,
7221,
7224,
7375,
7379,
7379,
7393,
7393,
7401,
7404,
7406,
7411,
7413,
7415,
7418,
7615,
7670,
7675,
7680,
8399,
8413,
8416,
8418,
8420,
8433,
11502,
11506,
11646,
11648,
11743,
11776,
12329,
12334,
12440,
12443,
42606,
42608,
42611,
42622,
42653,
42656,
42735,
42738,
43009,
43011,
43013,
43015,
43018,
43020,
43044,
43047,
43203,
43205,
43231,
43250,
43301,
43310,
43334,
43346,
43391,
43395,
43442,
43444,
43445,
43450,
43451,
43453,
43492,
43494,
43560,
43567,
43568,
43571,
43572,
43575,
43586,
43588,
43595,
43597,
43643,
43645,
43695,
43697,
43697,
43701,
43702,
43705,
43709,
43712,
43712,
43714,
43755,
43758,
43765,
43767,
44004,
44006,
44007,
44009,
44012,
44014,
55295,
57344,
64285,
64287,
65023,
65040,
65055,
65072,
66044,
66046,
66271,
66273,
66421,
66427,
68096,
68100,
68100,
68103,
68107,
68112,
68151,
68155,
68158,
68160,
68324,
68327,
69632,
69634,
69687,
69703,
69758,
69762,
69810,
69815,
69816,
69819,
69887,
69891,
69926,
69932,
69932,
69941,
70002,
70004,
70015,
70018,
70069,
70079,
70089,
70093,
70190,
70194,
70195,
70197,
70197,
70200,
70366,
70368,
70370,
70379,
70399,
70402,
70459,
70461,
70463,
70465,
70501,
70509,
70511,
70517,
70834,
70841,
70841,
70843,
70846,
70849,
70849,
70852,
71089,
71094,
71099,
71102,
71102,
71105,
71131,
71134,
71218,
71227,
71228,
71230,
71230,
71233,
71338,
71340,
71340,
71342,
71343,
71350,
71350,
71352,
71452,
71456,
71457,
71462,
71462,
71468,
92911,
92917,
92975,
92983,
94094,
94099,
113820,
113823,
119142,
119146,
119162,
119171,
119172,
119180,
119209,
119214,
119361,
119365,
121343,
121399,
121402,
121453,
121460,
121462,
121475,
121477,
121498,
121504,
121504,
121520,
125135,
125143,
917759,
918000,
1114111
],
[
0,
2306,
2308,
2362,
2364,
2365,
2369,
2376,
2381,
2381,
2384,
2433,
2436,
2493,
2497,
2502,
2505,
2506,
2509,
2518,
2520,
2562,
2564,
2621,
2625,
2690,
2692,
2749,
2753,
2760,
2762,
2762,
2765,
2817,
2820,
2877,
2879,
2879,
2881,
2886,
2889,
2890,
2893,
2902,
2904,
3005,
3008,
3008,
3011,
3013,
3017,
3017,
3021,
3030,
3032,
3072,
3076,
3136,
3141,
3201,
3204,
3261,
3263,
3263,
3269,
3270,
3273,
3273,
3276,
3284,
3287,
3329,
3332,
3389,
3393,
3397,
3401,
3401,
3405,
3414,
3416,
3457,
3460,
3534,
3538,
3543,
3552,
3569,
3572,
3901,
3904,
3966,
3968,
4138,
4141,
4144,
4146,
4151,
4153,
4154,
4157,
4181,
4184,
4193,
4197,
4198,
4206,
4226,
4229,
4230,
4237,
4238,
4240,
4249,
4253,
6069,
6071,
6077,
6086,
6086,
6089,
6434,
6439,
6440,
6444,
6447,
6450,
6450,
6457,
6680,
6683,
6740,
6742,
6742,
6744,
6752,
6754,
6754,
6757,
6764,
6771,
6915,
6917,
6964,
6966,
6970,
6972,
6972,
6978,
6978,
6981,
7041,
7043,
7072,
7074,
7077,
7080,
7081,
7083,
7142,
7144,
7145,
7149,
7149,
7151,
7153,
7156,
7203,
7212,
7219,
7222,
7392,
7394,
7409,
7412,
12333,
12336,
43042,
43045,
43046,
43048,
43135,
43138,
43187,
43204,
43345,
43348,
43394,
43396,
43443,
43446,
43449,
43452,
43452,
43457,
43566,
43569,
43570,
43573,
43596,
43598,
43642,
43644,
43644,
43646,
43754,
43756,
43757,
43760,
43764,
43766,
44002,
44005,
44005,
44008,
44008,
44011,
44011,
44013,
55295,
57344,
69631,
69633,
69633,
69635,
69761,
69763,
69807,
69811,
69814,
69817,
69931,
69933,
70017,
70019,
70066,
70070,
70078,
70081,
70187,
70191,
70193,
70196,
70196,
70198,
70367,
70371,
70401,
70404,
70461,
70464,
70464,
70469,
70470,
70473,
70474,
70478,
70486,
70488,
70497,
70500,
70831,
70835,
70840,
70842,
70842,
70847,
70848,
70850,
71086,
71090,
71095,
71100,
71101,
71103,
71215,
71219,
71226,
71229,
71229,
71231,
71339,
71341,
71341,
71344,
71349,
71351,
71455,
71458,
71461,
71463,
94032,
94079,
119140,
119143,
119148,
119155,
1114111
],
[
0,
1159,
1162,
6845,
6847,
8412,
8417,
8417,
8421,
42607,
42611,
55295,
57344,
1114111
],
[
0,
47,
58,
1631,
1642,
1775,
1786,
1983,
1994,
2405,
2416,
2533,
2544,
2661,
2672,
2789,
2800,
2917,
2928,
3045,
3056,
3173,
3184,
3301,
3312,
3429,
3440,
3557,
3568,
3663,
3674,
3791,
3802,
3871,
3882,
4159,
4170,
4239,
4250,
6111,
6122,
6159,
6170,
6469,
6480,
6607,
6618,
6783,
6794,
6799,
6810,
6991,
7002,
7087,
7098,
7231,
7242,
7247,
7258,
42527,
42538,
43215,
43226,
43263,
43274,
43471,
43482,
43503,
43514,
43599,
43610,
44015,
44026,
55295,
57344,
65295,
65306,
66719,
66730,
69733,
69744,
69871,
69882,
69941,
69952,
70095,
70106,
70383,
70394,
70863,
70874,
71247,
71258,
71359,
71370,
71471,
71482,
71903,
71914,
92767,
92778,
93007,
93018,
120781,
120832,
1114111
],
[
0,
5869,
5873,
8543,
8579,
8580,
8585,
12294,
12296,
12320,
12330,
12343,
12347,
42725,
42736,
55295,
57344,
65855,
65909,
66368,
66370,
66377,
66379,
66512,
66518,
74751,
74863,
1114111
],
[
0,
177,
180,
184,
186,
187,
191,
2547,
2554,
2929,
2936,
3055,
3059,
3191,
3199,
3439,
3446,
3881,
3892,
4968,
4989,
6127,
6138,
6617,
6619,
8303,
8305,
8307,
8314,
8319,
8330,
8527,
8544,
8584,
8586,
9311,
9372,
9449,
9472,
10101,
10132,
11516,
11518,
12689,
12694,
12831,
12842,
12871,
12880,
12880,
12896,
12927,
12938,
12976,
12992,
43055,
43062,
55295,
57344,
65798,
65844,
65908,
65913,
65929,
65932,
66272,
66300,
66335,
66340,
67671,
67680,
67704,
67712,
67750,
67760,
67834,
67840,
67861,
67868,
68027,
68030,
68031,
68048,
68049,
68096,
68159,
68168,
68220,
68223,
68252,
68256,
68330,
68336,
68439,
68448,
68471,
68480,
68520,
68528,
68857,
68864,
69215,
69247,
69713,
69734,
70112,
70133,
71481,
71484,
71913,
71923,
93018,
93026,
119647,
119666,
125126,
125136,
127231,
127245,
1114111
],
[
0,
31,
33,
159,
161,
5759,
5761,
8191,
8203,
8238,
8240,
8286,
8288,
12287,
12289,
55295,
57344,
1114111
],
[
0,
8231,
8233,
55295,
57344,
1114111
],
[
0,
8232,
8234,
55295,
57344,
1114111
],
[
32,
126,
160,
55295,
57344,
1114111
],
[
0,
1535,
1542,
1563,
1565,
1756,
1758,
1806,
1808,
6157,
6159,
8202,
8208,
8233,
8239,
8287,
8293,
8293,
8304,
55295,
57344,
65278,
65280,
65528,
65532,
69820,
69822,
113823,
113828,
119154,
119163,
917504,
917506,
917535,
917632,
1114111
],
[
0,
55295,
57344,
1114111
],
[
0,
55295,
63744,
983039,
1048574,
1048575,
1114110,
1114111
],
[
0,
94,
96,
8254,
8257,
8275,
8277,
55295,
57344,
65074,
65077,
65100,
65104,
65342,
65344,
1114111
],
[
0,
44,
46,
172,
174,
1417,
1419,
1469,
1471,
5119,
5121,
6149,
6151,
8207,
8214,
11798,
11800,
11801,
11803,
11833,
11836,
11839,
11841,
12315,
12317,
12335,
12337,
12447,
12449,
55295,
57344,
65072,
65075,
65111,
65113,
65122,
65124,
65292,
65294,
1114111
],
[
0,
39,
41,
90,
92,
122,
124,
3897,
3899,
3899,
3901,
5786,
5788,
8217,
8219,
8221,
8223,
8260,
8262,
8316,
8318,
8332,
8334,
8967,
8969,
8969,
8971,
9000,
9002,
10087,
10089,
10089,
10091,
10091,
10093,
10093,
10095,
10095,
10097,
10097,
10099,
10099,
10101,
10180,
10182,
10213,
10215,
10215,
10217,
10217,
10219,
10219,
10221,
10221,
10223,
10626,
10628,
10628,
10630,
10630,
10632,
10632,
10634,
10634,
10636,
10636,
10638,
10638,
10640,
10640,
10642,
10642,
10644,
10644,
10646,
10646,
10648,
10711,
10713,
10713,
10715,
10747,
10749,
11809,
11811,
11811,
11813,
11813,
11815,
11815,
11817,
11841,
11843,
12295,
12297,
12297,
12299,
12299,
12301,
12301,
12303,
12303,
12305,
12307,
12309,
12309,
12311,
12311,
12313,
12313,
12315,
12316,
12318,
55295,
57344,
64830,
64832,
65046,
65048,
65076,
65078,
65078,
65080,
65080,
65082,
65082,
65084,
65084,
65086,
65086,
65088,
65088,
65090,
65090,
65092,
65094,
65096,
65112,
65114,
65114,
65116,
65116,
65118,
65287,
65289,
65338,
65340,
65370,
65372,
65374,
65376,
65377,
65379,
1114111
],
[
0,
40,
42,
92,
94,
124,
126,
3898,
3900,
3900,
3902,
5787,
5789,
8261,
8263,
8317,
8319,
8333,
8335,
8968,
8970,
8970,
8972,
9001,
9003,
10088,
10090,
10090,
10092,
10092,
10094,
10094,
10096,
10096,
10098,
10098,
10100,
10100,
10102,
10181,
10183,
10214,
10216,
10216,
10218,
10218,
10220,
10220,
10222,
10222,
10224,
10627,
10629,
10629,
10631,
10631,
10633,
10633,
10635,
10635,
10637,
10637,
10639,
10639,
10641,
10641,
10643,
10643,
10645,
10645,
10647,
10647,
10649,
10712,
10714,
10714,
10716,
10748,
10750,
11810,
11812,
11812,
11814,
11814,
11816,
11816,
11818,
12296,
12298,
12298,
12300,
12300,
12302,
12302,
12304,
12304,
12306,
12308,
12310,
12310,
12312,
12312,
12314,
12314,
12316,
12317,
12320,
55295,
57344,
64829,
64831,
65047,
65049,
65077,
65079,
65079,
65081,
65081,
65083,
65083,
65085,
65085,
65087,
65087,
65089,
65089,
65091,
65091,
65093,
65095,
65097,
65113,
65115,
65115,
65117,
65117,
65119,
65288,
65290,
65340,
65342,
65372,
65374,
65375,
65377,
65378,
65380,
1114111
],
[
0,
170,
172,
8215,
8217,
8218,
8221,
8222,
8224,
8248,
8250,
11777,
11779,
11779,
11781,
11784,
11786,
11787,
11789,
11803,
11805,
11807,
11809,
55295,
57344,
1114111
],
[
0,
186,
188,
8216,
8218,
8220,
8222,
8249,
8251,
11778,
11780,
11780,
11782,
11785,
11787,
11788,
11790,
11804,
11806,
11808,
11810,
55295,
57344,
1114111
],
[
0,
32,
36,
36,
40,
41,
43,
43,
45,
45,
48,
57,
60,
62,
65,
91,
93,
160,
162,
182,
184,
190,
192,
893,
895,
902,
904,
1369,
1376,
1416,
1418,
1471,
1473,
1474,
1476,
1477,
1479,
1522,
1525,
1544,
1547,
1547,
1550,
1562,
1564,
1565,
1568,
1641,
1646,
1747,
1749,
1791,
1806,
2038,
2042,
2095,
2111,
2141,
2143,
2403,
2406,
2415,
2417,
2799,
2801,
3571,
3573,
3662,
3664,
3673,
3676,
3843,
3859,
3859,
3861,
3972,
3974,
4047,
4053,
4056,
4059,
4169,
4176,
4346,
4348,
4959,
4969,
5740,
5743,
5866,
5870,
5940,
5943,
6099,
6103,
6103,
6107,
6143,
6150,
6150,
6155,
6467,
6470,
6685,
6688,
6815,
6823,
6823,
6830,
7001,
7009,
7163,
7168,
7226,
7232,
7293,
7296,
7359,
7368,
7378,
7380,
8213,
8216,
8223,
8232,
8239,
8249,
8250,
8255,
8256,
8260,
8262,
8274,
8274,
8276,
8276,
8287,
11512,
11517,
11517,
11520,
11631,
11633,
11775,
11778,
11781,
11785,
11786,
11788,
11789,
11799,
11799,
11802,
11802,
11804,
11805,
11808,
11817,
11823,
11823,
11834,
11835,
11840,
11840,
11842,
12288,
12292,
12348,
12350,
12538,
12540,
42237,
42240,
42508,
42512,
42610,
42612,
42621,
42623,
42737,
42744,
43123,
43128,
43213,
43216,
43255,
43259,
43259,
43261,
43309,
43312,
43358,
43360,
43456,
43470,
43485,
43488,
43611,
43616,
43741,
43744,
43759,
43762,
44010,
44012,
55295,
57344,
65039,
65047,
65048,
65050,
65071,
65073,
65092,
65095,
65096,
65101,
65103,
65107,
65107,
65112,
65118,
65122,
65127,
65129,
65129,
65132,
65280,
65284,
65284,
65288,
65289,
65291,
65291,
65293,
65293,
65296,
65305,
65308,
65310,
65313,
65339,
65341,
65376,
65378,
65379,
65382,
65791,
65795,
66462,
66464,
66511,
66513,
66926,
66928,
67670,
67672,
67870,
67872,
67902,
67904,
68175,
68185,
68222,
68224,
68335,
68343,
68408,
68416,
68504,
68509,
69702,
69710,
69818,
69821,
69821,
69826,
69951,
69956,
70003,
70006,
70084,
70090,
70092,
70094,
70106,
70108,
70108,
70112,
70199,
70206,
70312,
70314,
70853,
70855,
71104,
71128,
71232,
71236,
71483,
71487,
74863,
74869,
92781,
92784,
92916,
92918,
92982,
92988,
92995,
92997,
113822,
113824,
121478,
121484,
1114111
],
[
0,
42,
44,
59,
63,
123,
125,
125,
127,
171,
173,
176,
178,
214,
216,
246,
248,
1013,
1015,
1541,
1545,
8259,
8261,
8273,
8275,
8313,
8317,
8329,
8333,
8471,
8473,
8511,
8517,
8522,
8524,
8591,
8597,
8601,
8604,
8607,
8609,
8610,
8612,
8613,
8615,
8621,
8623,
8653,
8656,
8657,
8659,
8659,
8661,
8691,
8960,
8991,
8994,
9083,
9085,
9114,
9140,
9179,
9186,
9654,
9656,
9664,
9666,
9719,
9728,
9838,
9840,
10175,
10181,
10182,
10214,
10223,
10240,
10495,
10627,
10648,
10712,
10715,
10748,
10749,
11008,
11055,
11077,
11078,
11085,
55295,
57344,
64296,
64298,
65121,
65123,
65123,
65127,
65290,
65292,
65307,
65311,
65371,
65373,
65373,
65375,
65505,
65507,
65512,
65517,
120512,
120514,
120538,
120540,
120570,
120572,
120596,
120598,
120628,
120630,
120654,
120656,
120686,
120688,
120712,
120714,
120744,
120746,
120770,
120772,
126703,
126706,
1114111
],
[
0,
35,
37,
161,
166,
1422,
1424,
1546,
1548,
2545,
2548,
2554,
2556,
2800,
2802,
3064,
3066,
3646,
3648,
6106,
6108,
8351,
8383,
43063,
43065,
55295,
57344,
65019,
65021,
65128,
65130,
65283,
65285,
65503,
65506,
65508,
65511,
1114111
],
[
0,
93,
95,
95,
97,
167,
169,
174,
176,
179,
181,
183,
185,
705,
710,
721,
736,
740,
748,
748,
750,
750,
768,
884,
886,
899,
902,
8124,
8126,
8126,
8130,
8140,
8144,
8156,
8160,
8172,
8176,
8188,
8191,
12442,
12445,
42751,
42775,
42783,
42786,
42888,
42891,
43866,
43868,
55295,
57344,
64433,
64450,
65341,
65343,
65343,
65345,
65506,
65508,
127994,
128000,
1114111
],
[
0,
165,
168,
168,
170,
173,
175,
175,
177,
181,
183,
1153,
1155,
1420,
1423,
1549,
1552,
1757,
1759,
1768,
1770,
1788,
1791,
2037,
2039,
2553,
2555,
2927,
2929,
3058,
3065,
3065,
3067,
3198,
3200,
3448,
3450,
3840,
3844,
3858,
3860,
3860,
3864,
3865,
3872,
3891,
3893,
3893,
3895,
3895,
3897,
4029,
4038,
4038,
4045,
4045,
4048,
4052,
4057,
4253,
4256,
5007,
5018,
6463,
6465,
6621,
6656,
7008,
7019,
7027,
7037,
8447,
8450,
8450,
8455,
8455,
8458,
8467,
8469,
8469,
8472,
8477,
8484,
8484,
8486,
8486,
8488,
8488,
8490,
8493,
8495,
8505,
8508,
8521,
8523,
8523,
8526,
8526,
8528,
8585,
8588,
8596,
8602,
8603,
8608,
8608,
8611,
8611,
8614,
8614,
8622,
8622,
8654,
8655,
8658,
8658,
8660,
8660,
8692,
8959,
8968,
8971,
8992,
8993,
9001,
9002,
9084,
9084,
9115,
9139,
9180,
9185,
9211,
9215,
9255,
9279,
9291,
9371,
9450,
9471,
9655,
9655,
9665,
9665,
9720,
9727,
9839,
9839,
10088,
10131,
10176,
10239,
10496,
11007,
11056,
11076,
11079,
11084,
11124,
11125,
11158,
11159,
11194,
11196,
11209,
11209,
11218,
11243,
11248,
11492,
11499,
11903,
11930,
11930,
12020,
12031,
12246,
12271,
12284,
12291,
12293,
12305,
12308,
12319,
12321,
12341,
12344,
12349,
12352,
12687,
12690,
12693,
12704,
12735,
12772,
12799,
12831,
12841,
12872,
12879,
12881,
12895,
12928,
12937,
12977,
12991,
13055,
13055,
13312,
19903,
19968,
42127,
42183,
43047,
43052,
43061,
43064,
43064,
43066,
43638,
43642,
55295,
57344,
65020,
65022,
65507,
65509,
65511,
65513,
65516,
65519,
65531,
65534,
65846,
65856,
65912,
65930,
65931,
65933,
65935,
65948,
65951,
65953,
65999,
66045,
67702,
67705,
68295,
68297,
71486,
71488,
92987,
92992,
92996,
92998,
113819,
113821,
118783,
119030,
119039,
119079,
119080,
119141,
119145,
119149,
119170,
119173,
119179,
119210,
119213,
119273,
119295,
119362,
119364,
119366,
119551,
119639,
120831,
121344,
121398,
121403,
121452,
121461,
121461,
121476,
121476,
121479,
126975,
127020,
127023,
127124,
127135,
127151,
127152,
127168,
127168,
127184,
127184,
127222,
127247,
127279,
127279,
127340,
127343,
127387,
127461,
127491,
127503,
127547,
127551,
127561,
127567,
127570,
127743,
127995,
127999,
128378,
128378,
128420,
128420,
128721,
128735,
128749,
128751,
128756,
128767,
128884,
128895,
128981,
129023,
129036,
129039,
129096,
129103,
129114,
129119,
129160,
129167,
129198,
129295,
129305,
129407,
129413,
129471,
129473,
1114111
],
[
0,
887,
890,
895,
900,
906,
908,
908,
910,
929,
931,
1327,
1329,
1366,
1369,
1375,
1377,
1415,
1417,
1418,
1421,
1423,
1425,
1479,
1488,
1514,
1520,
1524,
1536,
1564,
1566,
1805,
1807,
1866,
1869,
1969,
1984,
2042,
2048,
2093,
2096,
2110,
2112,
2139,
2142,
2142,
2208,
2228,
2275,
2435,
2437,
2444,
2447,
2448,
2451,
2472,
2474,
2480,
2482,
2482,
2486,
2489,
2492,
2500,
2503,
2504,
2507,
2510,
2519,
2519,
2524,
2525,
2527,
2531,
2534,
2555,
2561,
2563,
2565,
2570,
2575,
2576,
2579,
2600,
2602,
2608,
2610,
2611,
2613,
2614,
2616,
2617,
2620,
2620,
2622,
2626,
2631,
2632,
2635,
2637,
2641,
2641,
2649,
2652,
2654,
2654,
2662,
2677,
2689,
2691,
2693,
2701,
2703,
2705,
2707,
2728,
2730,
2736,
2738,
2739,
2741,
2745,
2748,
2757,
2759,
2761,
2763,
2765,
2768,
2768,
2784,
2787,
2790,
2801,
2809,
2809,
2817,
2819,
2821,
2828,
2831,
2832,
2835,
2856,
2858,
2864,
2866,
2867,
2869,
2873,
2876,
2884,
2887,
2888,
2891,
2893,
2902,
2903,
2908,
2909,
2911,
2915,
2918,
2935,
2946,
2947,
2949,
2954,
2958,
2960,
2962,
2965,
2969,
2970,
2972,
2972,
2974,
2975,
2979,
2980,
2984,
2986,
2990,
3001,
3006,
3010,
3014,
3016,
3018,
3021,
3024,
3024,
3031,
3031,
3046,
3066,
3072,
3075,
3077,
3084,
3086,
3088,
3090,
3112,
3114,
3129,
3133,
3140,
3142,
3144,
3146,
3149,
3157,
3158,
3160,
3162,
3168,
3171,
3174,
3183,
3192,
3199,
3201,
3203,
3205,
3212,
3214,
3216,
3218,
3240,
3242,
3251,
3253,
3257,
3260,
3268,
3270,
3272,
3274,
3277,
3285,
3286,
3294,
3294,
3296,
3299,
3302,
3311,
3313,
3314,
3329,
3331,
3333,
3340,
3342,
3344,
3346,
3386,
3389,
3396,
3398,
3400,
3402,
3406,
3415,
3415,
3423,
3427,
3430,
3445,
3449,
3455,
3458,
3459,
3461,
3478,
3482,
3505,
3507,
3515,
3517,
3517,
3520,
3526,
3530,
3530,
3535,
3540,
3542,
3542,
3544,
3551,
3558,
3567,
3570,
3572,
3585,
3642,
3647,
3675,
3713,
3714,
3716,
3716,
3719,
3720,
3722,
3722,
3725,
3725,
3732,
3735,
3737,
3743,
3745,
3747,
3749,
3749,
3751,
3751,
3754,
3755,
3757,
3769,
3771,
3773,
3776,
3780,
3782,
3782,
3784,
3789,
3792,
3801,
3804,
3807,
3840,
3911,
3913,
3948,
3953,
3991,
3993,
4028,
4030,
4044,
4046,
4058,
4096,
4293,
4295,
4295,
4301,
4301,
4304,
4680,
4682,
4685,
4688,
4694,
4696,
4696,
4698,
4701,
4704,
4744,
4746,
4749,
4752,
4784,
4786,
4789,
4792,
4798,
4800,
4800,
4802,
4805,
4808,
4822,
4824,
4880,
4882,
4885,
4888,
4954,
4957,
4988,
4992,
5017,
5024,
5109,
5112,
5117,
5120,
5788,
5792,
5880,
5888,
5900,
5902,
5908,
5920,
5942,
5952,
5971,
5984,
5996,
5998,
6000,
6002,
6003,
6016,
6109,
6112,
6121,
6128,
6137,
6144,
6158,
6160,
6169,
6176,
6263,
6272,
6314,
6320,
6389,
6400,
6430,
6432,
6443,
6448,
6459,
6464,
6464,
6468,
6509,
6512,
6516,
6528,
6571,
6576,
6601,
6608,
6618,
6622,
6683,
6686,
6750,
6752,
6780,
6783,
6793,
6800,
6809,
6816,
6829,
6832,
6846,
6912,
6987,
6992,
7036,
7040,
7155,
7164,
7223,
7227,
7241,
7245,
7295,
7360,
7367,
7376,
7414,
7416,
7417,
7424,
7669,
7676,
7957,
7960,
7965,
7968,
8005,
8008,
8013,
8016,
8023,
8025,
8025,
8027,
8027,
8029,
8029,
8031,
8061,
8064,
8116,
8118,
8132,
8134,
8147,
8150,
8155,
8157,
8175,
8178,
8180,
8182,
8190,
8192,
8292,
8294,
8305,
8308,
8334,
8336,
8348,
8352,
8382,
8400,
8432,
8448,
8587,
8592,
9210,
9216,
9254,
9280,
9290,
9312,
11123,
11126,
11157,
11160,
11193,
11197,
11208,
11210,
11217,
11244,
11247,
11264,
11310,
11312,
11358,
11360,
11507,
11513,
11557,
11559,
11559,
11565,
11565,
11568,
11623,
11631,
11632,
11647,
11670,
11680,
11686,
11688,
11694,
11696,
11702,
11704,
11710,
11712,
11718,
11720,
11726,
11728,
11734,
11736,
11742,
11744,
11842,
11904,
11929,
11931,
12019,
12032,
12245,
12272,
12283,
12288,
12351,
12353,
12438,
12441,
12543,
12549,
12589,
12593,
12686,
12688,
12730,
12736,
12771,
12784,
12830,
12832,
13054,
13056,
19893,
19904,
40917,
40960,
42124,
42128,
42182,
42192,
42539,
42560,
42743,
42752,
42925,
42928,
42935,
42999,
43051,
43056,
43065,
43072,
43127,
43136,
43204,
43214,
43225,
43232,
43261,
43264,
43347,
43359,
43388,
43392,
43469,
43471,
43481,
43486,
43518,
43520,
43574,
43584,
43597,
43600,
43609,
43612,
43714,
43739,
43766,
43777,
43782,
43785,
43790,
43793,
43798,
43808,
43814,
43816,
43822,
43824,
43877,
43888,
44013,
44016,
44025,
44032,
55203,
55216,
55238,
55243,
55291,
57344,
64109,
64112,
64217,
64256,
64262,
64275,
64279,
64285,
64310,
64312,
64316,
64318,
64318,
64320,
64321,
64323,
64324,
64326,
64449,
64467,
64831,
64848,
64911,
64914,
64967,
65008,
65021,
65024,
65049,
65056,
65106,
65108,
65126,
65128,
65131,
65136,
65140,
65142,
65276,
65279,
65279,
65281,
65470,
65474,
65479,
65482,
65487,
65490,
65495,
65498,
65500,
65504,
65510,
65512,
65518,
65529,
65533,
65536,
65547,
65549,
65574,
65576,
65594,
65596,
65597,
65599,
65613,
65616,
65629,
65664,
65786,
65792,
65794,
65799,
65843,
65847,
65932,
65936,
65947,
65952,
65952,
66000,
66045,
66176,
66204,
66208,
66256,
66272,
66299,
66304,
66339,
66352,
66378,
66384,
66426,
66432,
66461,
66463,
66499,
66504,
66517,
66560,
66717,
66720,
66729,
66816,
66855,
66864,
66915,
66927,
66927,
67072,
67382,
67392,
67413,
67424,
67431,
67584,
67589,
67592,
67592,
67594,
67637,
67639,
67640,
67644,
67644,
67647,
67669,
67671,
67742,
67751,
67759,
67808,
67826,
67828,
67829,
67835,
67867,
67871,
67897,
67903,
67903,
67968,
68023,
68028,
68047,
68050,
68099,
68101,
68102,
68108,
68115,
68117,
68119,
68121,
68147,
68152,
68154,
68159,
68167,
68176,
68184,
68192,
68255,
68288,
68326,
68331,
68342,
68352,
68405,
68409,
68437,
68440,
68466,
68472,
68497,
68505,
68508,
68521,
68527,
68608,
68680,
68736,
68786,
68800,
68850,
68858,
68863,
69216,
69246,
69632,
69709,
69714,
69743,
69759,
69825,
69840,
69864,
69872,
69881,
69888,
69940,
69942,
69955,
69968,
70006,
70016,
70093,
70096,
70111,
70113,
70132,
70144,
70161,
70163,
70205,
70272,
70278,
70280,
70280,
70282,
70285,
70287,
70301,
70303,
70313,
70320,
70378,
70384,
70393,
70400,
70403,
70405,
70412,
70415,
70416,
70419,
70440,
70442,
70448,
70450,
70451,
70453,
70457,
70460,
70468,
70471,
70472,
70475,
70477,
70480,
70480,
70487,
70487,
70493,
70499,
70502,
70508,
70512,
70516,
70784,
70855,
70864,
70873,
71040,
71093,
71096,
71133,
71168,
71236,
71248,
71257,
71296,
71351,
71360,
71369,
71424,
71449,
71453,
71467,
71472,
71487,
71840,
71922,
71935,
71935,
72384,
72440,
73728,
74649,
74752,
74862,
74864,
74868,
74880,
75075,
77824,
78894,
82944,
83526,
92160,
92728,
92736,
92766,
92768,
92777,
92782,
92783,
92880,
92909,
92912,
92917,
92928,
92997,
93008,
93017,
93019,
93025,
93027,
93047,
93053,
93071,
93952,
94020,
94032,
94078,
94095,
94111,
110592,
110593,
113664,
113770,
113776,
113788,
113792,
113800,
113808,
113817,
113820,
113827,
118784,
119029,
119040,
119078,
119081,
119272,
119296,
119365,
119552,
119638,
119648,
119665,
119808,
119892,
119894,
119964,
119966,
119967,
119970,
119970,
119973,
119974,
119977,
119980,
119982,
119993,
119995,
119995,
119997,
120003,
120005,
120069,
120071,
120074,
120077,
120084,
120086,
120092,
120094,
120121,
120123,
120126,
120128,
120132,
120134,
120134,
120138,
120144,
120146,
120485,
120488,
120779,
120782,
121483,
121499,
121503,
121505,
121519,
124928,
125124,
125127,
125142,
126464,
126467,
126469,
126495,
126497,
126498,
126500,
126500,
126503,
126503,
126505,
126514,
126516,
126519,
126521,
126521,
126523,
126523,
126530,
126530,
126535,
126535,
126537,
126537,
126539,
126539,
126541,
126543,
126545,
126546,
126548,
126548,
126551,
126551,
126553,
126553,
126555,
126555,
126557,
126557,
126559,
126559,
126561,
126562,
126564,
126564,
126567,
126570,
126572,
126578,
126580,
126583,
126585,
126588,
126590,
126590,
126592,
126601,
126603,
126619,
126625,
126627,
126629,
126633,
126635,
126651,
126704,
126705,
126976,
127019,
127024,
127123,
127136,
127150,
127153,
127167,
127169,
127183,
127185,
127221,
127232,
127244,
127248,
127278,
127280,
127339,
127344,
127386,
127462,
127490,
127504,
127546,
127552,
127560,
127568,
127569,
127744,
128377,
128379,
128419,
128421,
128720,
128736,
128748,
128752,
128755,
128768,
128883,
128896,
128980,
129024,
129035,
129040,
129095,
129104,
129113,
129120,
129159,
129168,
129197,
129296,
129304,
129408,
129412,
129472,
129472,
131072,
173782,
173824,
177972,
177984,
178205,
178208,
183969,
194560,
195101,
917505,
917505,
917536,
917631,
917760,
917999,
983040,
1048573,
1048576,
1114109
]
];
static isLetter = [
65,
90,
97,
122,
170,
170,
181,
181,
186,
186,
192,
214,
216,
246,
248,
705,
710,
721,
736,
740,
748,
748,
750,
750,
880,
884,
886,
887,
890,
893,
895,
895,
902,
902,
904,
906,
908,
908,
910,
929,
931,
1013,
1015,
1153,
1162,
1327,
1329,
1366,
1369,
1369,
1377,
1415,
1488,
1514,
1520,
1522,
1568,
1610,
1646,
1647,
1649,
1747,
1749,
1749,
1765,
1766,
1774,
1775,
1786,
1788,
1791,
1791,
1808,
1808,
1810,
1839,
1869,
1957,
1969,
1969,
1994,
2026,
2036,
2037,
2042,
2042,
2048,
2069,
2074,
2074,
2084,
2084,
2088,
2088,
2112,
2136,
2208,
2228,
2308,
2361,
2365,
2365,
2384,
2384,
2392,
2401,
2417,
2432,
2437,
2444,
2447,
2448,
2451,
2472,
2474,
2480,
2482,
2482,
2486,
2489,
2493,
2493,
2510,
2510,
2524,
2525,
2527,
2529,
2544,
2545,
2565,
2570,
2575,
2576,
2579,
2600,
2602,
2608,
2610,
2611,
2613,
2614,
2616,
2617,
2649,
2652,
2654,
2654,
2674,
2676,
2693,
2701,
2703,
2705,
2707,
2728,
2730,
2736,
2738,
2739,
2741,
2745,
2749,
2749,
2768,
2768,
2784,
2785,
2809,
2809,
2821,
2828,
2831,
2832,
2835,
2856,
2858,
2864,
2866,
2867,
2869,
2873,
2877,
2877,
2908,
2909,
2911,
2913,
2929,
2929,
2947,
2947,
2949,
2954,
2958,
2960,
2962,
2965,
2969,
2970,
2972,
2972,
2974,
2975,
2979,
2980,
2984,
2986,
2990,
3001,
3024,
3024,
3077,
3084,
3086,
3088,
3090,
3112,
3114,
3129,
3133,
3133,
3160,
3162,
3168,
3169,
3205,
3212,
3214,
3216,
3218,
3240,
3242,
3251,
3253,
3257,
3261,
3261,
3294,
3294,
3296,
3297,
3313,
3314,
3333,
3340,
3342,
3344,
3346,
3386,
3389,
3389,
3406,
3406,
3423,
3425,
3450,
3455,
3461,
3478,
3482,
3505,
3507,
3515,
3517,
3517,
3520,
3526,
3585,
3632,
3634,
3635,
3648,
3654,
3713,
3714,
3716,
3716,
3719,
3720,
3722,
3722,
3725,
3725,
3732,
3735,
3737,
3743,
3745,
3747,
3749,
3749,
3751,
3751,
3754,
3755,
3757,
3760,
3762,
3763,
3773,
3773,
3776,
3780,
3782,
3782,
3804,
3807,
3840,
3840,
3904,
3911,
3913,
3948,
3976,
3980,
4096,
4138,
4159,
4159,
4176,
4181,
4186,
4189,
4193,
4193,
4197,
4198,
4206,
4208,
4213,
4225,
4238,
4238,
4256,
4293,
4295,
4295,
4301,
4301,
4304,
4346,
4348,
4680,
4682,
4685,
4688,
4694,
4696,
4696,
4698,
4701,
4704,
4744,
4746,
4749,
4752,
4784,
4786,
4789,
4792,
4798,
4800,
4800,
4802,
4805,
4808,
4822,
4824,
4880,
4882,
4885,
4888,
4954,
4992,
5007,
5024,
5109,
5112,
5117,
5121,
5740,
5743,
5759,
5761,
5786,
5792,
5866,
5873,
5880,
5888,
5900,
5902,
5905,
5920,
5937,
5952,
5969,
5984,
5996,
5998,
6000,
6016,
6067,
6103,
6103,
6108,
6108,
6176,
6263,
6272,
6312,
6314,
6314,
6320,
6389,
6400,
6430,
6480,
6509,
6512,
6516,
6528,
6571,
6576,
6601,
6656,
6678,
6688,
6740,
6823,
6823,
6917,
6963,
6981,
6987,
7043,
7072,
7086,
7087,
7098,
7141,
7168,
7203,
7245,
7247,
7258,
7293,
7401,
7404,
7406,
7409,
7413,
7414,
7424,
7615,
7680,
7957,
7960,
7965,
7968,
8005,
8008,
8013,
8016,
8023,
8025,
8025,
8027,
8027,
8029,
8029,
8031,
8061,
8064,
8116,
8118,
8124,
8126,
8126,
8130,
8132,
8134,
8140,
8144,
8147,
8150,
8155,
8160,
8172,
8178,
8180,
8182,
8188,
8305,
8305,
8319,
8319,
8336,
8348,
8450,
8450,
8455,
8455,
8458,
8467,
8469,
8469,
8473,
8477,
8484,
8484,
8486,
8486,
8488,
8488,
8490,
8493,
8495,
8505,
8508,
8511,
8517,
8521,
8526,
8526,
8579,
8580,
11264,
11310,
11312,
11358,
11360,
11492,
11499,
11502,
11506,
11507,
11520,
11557,
11559,
11559,
11565,
11565,
11568,
11623,
11631,
11631,
11648,
11670,
11680,
11686,
11688,
11694,
11696,
11702,
11704,
11710,
11712,
11718,
11720,
11726,
11728,
11734,
11736,
11742,
11823,
11823,
12293,
12294,
12337,
12341,
12347,
12348,
12353,
12438,
12445,
12447,
12449,
12538,
12540,
12543,
12549,
12589,
12593,
12686,
12704,
12730,
12784,
12799,
13312,
19893,
19968,
40917,
40960,
42124,
42192,
42237,
42240,
42508,
42512,
42527,
42538,
42539,
42560,
42606,
42623,
42653,
42656,
42725,
42775,
42783,
42786,
42888,
42891,
42925,
42928,
42935,
42999,
43009,
43011,
43013,
43015,
43018,
43020,
43042,
43072,
43123,
43138,
43187,
43250,
43255,
43259,
43259,
43261,
43261,
43274,
43301,
43312,
43334,
43360,
43388,
43396,
43442,
43471,
43471,
43488,
43492,
43494,
43503,
43514,
43518,
43520,
43560,
43584,
43586,
43588,
43595,
43616,
43638,
43642,
43642,
43646,
43695,
43697,
43697,
43701,
43702,
43705,
43709,
43712,
43712,
43714,
43714,
43739,
43741,
43744,
43754,
43762,
43764,
43777,
43782,
43785,
43790,
43793,
43798,
43808,
43814,
43816,
43822,
43824,
43866,
43868,
43877,
43888,
44002,
44032,
55203,
55216,
55238,
55243,
55291,
63744,
64109,
64112,
64217,
64256,
64262,
64275,
64279,
64285,
64285,
64287,
64296,
64298,
64310,
64312,
64316,
64318,
64318,
64320,
64321,
64323,
64324,
64326,
64433,
64467,
64829,
64848,
64911,
64914,
64967,
65008,
65019,
65136,
65140,
65142,
65276,
65313,
65338,
65345,
65370,
65382,
65470,
65474,
65479,
65482,
65487,
65490,
65495,
65498,
65500,
65536,
65547,
65549,
65574,
65576,
65594,
65596,
65597,
65599,
65613,
65616,
65629,
65664,
65786,
66176,
66204,
66208,
66256,
66304,
66335,
66352,
66368,
66370,
66377,
66384,
66421,
66432,
66461,
66464,
66499,
66504,
66511,
66560,
66717,
66816,
66855,
66864,
66915,
67072,
67382,
67392,
67413,
67424,
67431,
67584,
67589,
67592,
67592,
67594,
67637,
67639,
67640,
67644,
67644,
67647,
67669,
67680,
67702,
67712,
67742,
67808,
67826,
67828,
67829,
67840,
67861,
67872,
67897,
67968,
68023,
68030,
68031,
68096,
68096,
68112,
68115,
68117,
68119,
68121,
68147,
68192,
68220,
68224,
68252,
68288,
68295,
68297,
68324,
68352,
68405,
68416,
68437,
68448,
68466,
68480,
68497,
68608,
68680,
68736,
68786,
68800,
68850,
69635,
69687,
69763,
69807,
69840,
69864,
69891,
69926,
69968,
70002,
70006,
70006,
70019,
70066,
70081,
70084,
70106,
70106,
70108,
70108,
70144,
70161,
70163,
70187,
70272,
70278,
70280,
70280,
70282,
70285,
70287,
70301,
70303,
70312,
70320,
70366,
70405,
70412,
70415,
70416,
70419,
70440,
70442,
70448,
70450,
70451,
70453,
70457,
70461,
70461,
70480,
70480,
70493,
70497,
70784,
70831,
70852,
70853,
70855,
70855,
71040,
71086,
71128,
71131,
71168,
71215,
71236,
71236,
71296,
71338,
71424,
71449,
71840,
71903,
71935,
71935,
72384,
72440,
73728,
74649,
74880,
75075,
77824,
78894,
82944,
83526,
92160,
92728,
92736,
92766,
92880,
92909,
92928,
92975,
92992,
92995,
93027,
93047,
93053,
93071,
93952,
94020,
94032,
94032,
94099,
94111,
110592,
110593,
113664,
113770,
113776,
113788,
113792,
113800,
113808,
113817,
119808,
119892,
119894,
119964,
119966,
119967,
119970,
119970,
119973,
119974,
119977,
119980,
119982,
119993,
119995,
119995,
119997,
120003,
120005,
120069,
120071,
120074,
120077,
120084,
120086,
120092,
120094,
120121,
120123,
120126,
120128,
120132,
120134,
120134,
120138,
120144,
120146,
120485,
120488,
120512,
120514,
120538,
120540,
120570,
120572,
120596,
120598,
120628,
120630,
120654,
120656,
120686,
120688,
120712,
120714,
120744,
120746,
120770,
120772,
120779,
124928,
125124,
126464,
126467,
126469,
126495,
126497,
126498,
126500,
126500,
126503,
126503,
126505,
126514,
126516,
126519,
126521,
126521,
126523,
126523,
126530,
126530,
126535,
126535,
126537,
126537,
126539,
126539,
126541,
126543,
126545,
126546,
126548,
126548,
126551,
126551,
126553,
126553,
126555,
126555,
126557,
126557,
126559,
126559,
126561,
126562,
126564,
126564,
126567,
126570,
126572,
126578,
126580,
126583,
126585,
126588,
126590,
126590,
126592,
126601,
126603,
126619,
126625,
126627,
126629,
126633,
126635,
126651,
131072,
173782,
173824,
177972,
177984,
178205,
178208,
183969,
194560,
195101
];
static isDigit = [
48,
57,
1632,
1641,
1776,
1785,
1984,
1993,
2406,
2415,
2534,
2543,
2662,
2671,
2790,
2799,
2918,
2927,
3046,
3055,
3174,
3183,
3302,
3311,
3430,
3439,
3558,
3567,
3664,
3673,
3792,
3801,
3872,
3881,
4160,
4169,
4240,
4249,
6112,
6121,
6160,
6169,
6470,
6479,
6608,
6617,
6784,
6793,
6800,
6809,
6992,
7001,
7088,
7097,
7232,
7241,
7248,
7257,
42528,
42537,
43216,
43225,
43264,
43273,
43472,
43481,
43504,
43513,
43600,
43609,
44016,
44025,
65296,
65305,
66720,
66729,
69734,
69743,
69872,
69881,
69942,
69951,
70096,
70105,
70384,
70393,
70864,
70873,
71248,
71257,
71360,
71369,
71472,
71481,
71904,
71913,
92768,
92777,
93008,
93017,
120782,
120831
];
static isLetterOrDigit = [
48,
57,
1632,
1641,
1776,
1785,
1984,
1993,
2406,
2415,
2534,
2543,
2662,
2671,
2790,
2799,
2918,
2927,
3046,
3055,
3174,
3183,
3302,
3311,
3430,
3439,
3558,
3567,
3664,
3673,
3792,
3801,
3872,
3881,
4160,
4169,
4240,
4249,
6112,
6121,
6160,
6169,
6470,
6479,
6608,
6617,
6784,
6793,
6800,
6809,
6992,
7001,
7088,
7097,
7232,
7241,
7248,
7257,
42528,
42537,
43216,
43225,
43264,
43273,
43472,
43481,
43504,
43513,
43600,
43609,
44016,
44025,
65296,
65305,
66720,
66729,
69734,
69743,
69872,
69881,
69942,
69951,
70096,
70105,
70384,
70393,
70864,
70873,
71248,
71257,
71360,
71369,
71472,
71481,
71904,
71913,
92768,
92777,
93008,
93017,
120782,
120831
];
static isWhiteSpace = [
9,
13,
32,
32,
133,
133,
160,
160,
5760,
5760,
8192,
8202,
8232,
8233,
8239,
8239,
8287,
8287,
12288,
12288
];
static alnum = [
48,
57,
65,
90,
97,
122,
170,
170,
181,
181,
186,
186,
192,
214,
216,
246,
248,
705,
710,
721,
736,
740,
748,
748,
750,
750,
880,
884,
886,
887,
890,
893,
895,
895,
902,
902,
904,
906,
908,
908,
910,
929,
931,
1013,
1015,
1153,
1162,
1327,
1329,
1366,
1369,
1369,
1377,
1415,
1488,
1514,
1520,
1522,
1568,
1610,
1632,
1641,
1646,
1647,
1649,
1747,
1749,
1749,
1765,
1766,
1774,
1788,
1791,
1791,
1808,
1808,
1810,
1839,
1869,
1957,
1969,
1969,
1984,
2026,
2036,
2037,
2042,
2042,
2048,
2069,
2074,
2074,
2084,
2084,
2088,
2088,
2112,
2136,
2208,
2228,
2308,
2361,
2365,
2365,
2384,
2384,
2392,
2401,
2406,
2415,
2417,
2432,
2437,
2444,
2447,
2448,
2451,
2472,
2474,
2480,
2482,
2482,
2486,
2489,
2493,
2493,
2510,
2510,
2524,
2525,
2527,
2529,
2534,
2545,
2565,
2570,
2575,
2576,
2579,
2600,
2602,
2608,
2610,
2611,
2613,
2614,
2616,
2617,
2649,
2652,
2654,
2654,
2662,
2671,
2674,
2676,
2693,
2701,
2703,
2705,
2707,
2728,
2730,
2736,
2738,
2739,
2741,
2745,
2749,
2749,
2768,
2768,
2784,
2785,
2790,
2799,
2809,
2809,
2821,
2828,
2831,
2832,
2835,
2856,
2858,
2864,
2866,
2867,
2869,
2873,
2877,
2877,
2908,
2909,
2911,
2913,
2918,
2927,
2929,
2929,
2947,
2947,
2949,
2954,
2958,
2960,
2962,
2965,
2969,
2970,
2972,
2972,
2974,
2975,
2979,
2980,
2984,
2986,
2990,
3001,
3024,
3024,
3046,
3055,
3077,
3084,
3086,
3088,
3090,
3112,
3114,
3129,
3133,
3133,
3160,
3162,
3168,
3169,
3174,
3183,
3205,
3212,
3214,
3216,
3218,
3240,
3242,
3251,
3253,
3257,
3261,
3261,
3294,
3294,
3296,
3297,
3302,
3311,
3313,
3314,
3333,
3340,
3342,
3344,
3346,
3386,
3389,
3389,
3406,
3406,
3423,
3425,
3430,
3439,
3450,
3455,
3461,
3478,
3482,
3505,
3507,
3515,
3517,
3517,
3520,
3526,
3558,
3567,
3585,
3632,
3634,
3635,
3648,
3654,
3664,
3673,
3713,
3714,
3716,
3716,
3719,
3720,
3722,
3722,
3725,
3725,
3732,
3735,
3737,
3743,
3745,
3747,
3749,
3749,
3751,
3751,
3754,
3755,
3757,
3760,
3762,
3763,
3773,
3773,
3776,
3780,
3782,
3782,
3792,
3801,
3804,
3807,
3840,
3840,
3872,
3881,
3904,
3911,
3913,
3948,
3976,
3980,
4096,
4138,
4159,
4169,
4176,
4181,
4186,
4189,
4193,
4193,
4197,
4198,
4206,
4208,
4213,
4225,
4238,
4238,
4240,
4249,
4256,
4293,
4295,
4295,
4301,
4301,
4304,
4346,
4348,
4680,
4682,
4685,
4688,
4694,
4696,
4696,
4698,
4701,
4704,
4744,
4746,
4749,
4752,
4784,
4786,
4789,
4792,
4798,
4800,
4800,
4802,
4805,
4808,
4822,
4824,
4880,
4882,
4885,
4888,
4954,
4992,
5007,
5024,
5109,
5112,
5117,
5121,
5740,
5743,
5759,
5761,
5786,
5792,
5866,
5870,
5880,
5888,
5900,
5902,
5905,
5920,
5937,
5952,
5969,
5984,
5996,
5998,
6000,
6016,
6067,
6103,
6103,
6108,
6108,
6112,
6121,
6160,
6169,
6176,
6263,
6272,
6312,
6314,
6314,
6320,
6389,
6400,
6430,
6470,
6509,
6512,
6516,
6528,
6571,
6576,
6601,
6608,
6617,
6656,
6678,
6688,
6740,
6784,
6793,
6800,
6809,
6823,
6823,
6917,
6963,
6981,
6987,
6992,
7001,
7043,
7072,
7086,
7141,
7168,
7203,
7232,
7241,
7245,
7293,
7401,
7404,
7406,
7409,
7413,
7414,
7424,
7615,
7680,
7957,
7960,
7965,
7968,
8005,
8008,
8013,
8016,
8023,
8025,
8025,
8027,
8027,
8029,
8029,
8031,
8061,
8064,
8116,
8118,
8124,
8126,
8126,
8130,
8132,
8134,
8140,
8144,
8147,
8150,
8155,
8160,
8172,
8178,
8180,
8182,
8188,
8305,
8305,
8319,
8319,
8336,
8348,
8450,
8450,
8455,
8455,
8458,
8467,
8469,
8469,
8473,
8477,
8484,
8484,
8486,
8486,
8488,
8488,
8490,
8493,
8495,
8505,
8508,
8511,
8517,
8521,
8526,
8526,
8544,
8584,
11264,
11310,
11312,
11358,
11360,
11492,
11499,
11502,
11506,
11507,
11520,
11557,
11559,
11559,
11565,
11565,
11568,
11623,
11631,
11631,
11648,
11670,
11680,
11686,
11688,
11694,
11696,
11702,
11704,
11710,
11712,
11718,
11720,
11726,
11728,
11734,
11736,
11742,
11823,
11823,
12293,
12295,
12321,
12329,
12337,
12341,
12344,
12348,
12353,
12438,
12445,
12447,
12449,
12538,
12540,
12543,
12549,
12589,
12593,
12686,
12704,
12730,
12784,
12799,
13312,
19893,
19968,
40917,
40960,
42124,
42192,
42237,
42240,
42508,
42512,
42539,
42560,
42606,
42623,
42653,
42656,
42735,
42775,
42783,
42786,
42888,
42891,
42925,
42928,
42935,
42999,
43009,
43011,
43013,
43015,
43018,
43020,
43042,
43072,
43123,
43138,
43187,
43216,
43225,
43250,
43255,
43259,
43259,
43261,
43261,
43264,
43301,
43312,
43334,
43360,
43388,
43396,
43442,
43471,
43481,
43488,
43492,
43494,
43518,
43520,
43560,
43584,
43586,
43588,
43595,
43600,
43609,
43616,
43638,
43642,
43642,
43646,
43695,
43697,
43697,
43701,
43702,
43705,
43709,
43712,
43712,
43714,
43714,
43739,
43741,
43744,
43754,
43762,
43764,
43777,
43782,
43785,
43790,
43793,
43798,
43808,
43814,
43816,
43822,
43824,
43866,
43868,
43877,
43888,
44002,
44016,
44025,
44032,
55203,
55216,
55238,
55243,
55291,
63744,
64109,
64112,
64217,
64256,
64262,
64275,
64279,
64285,
64285,
64287,
64296,
64298,
64310,
64312,
64316,
64318,
64318,
64320,
64321,
64323,
64324,
64326,
64433,
64467,
64829,
64848,
64911,
64914,
64967,
65008,
65019,
65136,
65140,
65142,
65276,
65296,
65305,
65313,
65338,
65345,
65370,
65382,
65470,
65474,
65479,
65482,
65487,
65490,
65495,
65498,
65500,
65536,
65547,
65549,
65574,
65576,
65594,
65596,
65597,
65599,
65613,
65616,
65629,
65664,
65786,
65856,
65908,
66176,
66204,
66208,
66256,
66304,
66335,
66352,
66378,
66384,
66421,
66432,
66461,
66464,
66499,
66504,
66511,
66513,
66517,
66560,
66717,
66720,
66729,
66816,
66855,
66864,
66915,
67072,
67382,
67392,
67413,
67424,
67431,
67584,
67589,
67592,
67592,
67594,
67637,
67639,
67640,
67644,
67644,
67647,
67669,
67680,
67702,
67712,
67742,
67808,
67826,
67828,
67829,
67840,
67861,
67872,
67897,
67968,
68023,
68030,
68031,
68096,
68096,
68112,
68115,
68117,
68119,
68121,
68147,
68192,
68220,
68224,
68252,
68288,
68295,
68297,
68324,
68352,
68405,
68416,
68437,
68448,
68466,
68480,
68497,
68608,
68680,
68736,
68786,
68800,
68850,
69635,
69687,
69734,
69743,
69763,
69807,
69840,
69864,
69872,
69881,
69891,
69926,
69942,
69951,
69968,
70002,
70006,
70006,
70019,
70066,
70081,
70084,
70096,
70106,
70108,
70108,
70144,
70161,
70163,
70187,
70272,
70278,
70280,
70280,
70282,
70285,
70287,
70301,
70303,
70312,
70320,
70366,
70384,
70393,
70405,
70412,
70415,
70416,
70419,
70440,
70442,
70448,
70450,
70451,
70453,
70457,
70461,
70461,
70480,
70480,
70493,
70497,
70784,
70831,
70852,
70853,
70855,
70855,
70864,
70873,
71040,
71086,
71128,
71131,
71168,
71215,
71236,
71236,
71248,
71257,
71296,
71338,
71360,
71369,
71424,
71449,
71472,
71481,
71840,
71913,
71935,
71935,
72384,
72440,
73728,
74649,
74752,
74862,
74880,
75075,
77824,
78894,
82944,
83526,
92160,
92728,
92736,
92766,
92768,
92777,
92880,
92909,
92928,
92975,
92992,
92995,
93008,
93017,
93027,
93047,
93053,
93071,
93952,
94020,
94032,
94032,
94099,
94111,
110592,
110593,
113664,
113770,
113776,
113788,
113792,
113800,
113808,
113817,
119808,
119892,
119894,
119964,
119966,
119967,
119970,
119970,
119973,
119974,
119977,
119980,
119982,
119993,
119995,
119995,
119997,
120003,
120005,
120069,
120071,
120074,
120077,
120084,
120086,
120092,
120094,
120121,
120123,
120126,
120128,
120132,
120134,
120134,
120138,
120144,
120146,
120485,
120488,
120512,
120514,
120538,
120540,
120570,
120572,
120596,
120598,
120628,
120630,
120654,
120656,
120686,
120688,
120712,
120714,
120744,
120746,
120770,
120772,
120779,
120782,
120831,
124928,
125124,
126464,
126467,
126469,
126495,
126497,
126498,
126500,
126500,
126503,
126503,
126505,
126514,
126516,
126519,
126521,
126521,
126523,
126523,
126530,
126530,
126535,
126535,
126537,
126537,
126539,
126539,
126541,
126543,
126545,
126546,
126548,
126548,
126551,
126551,
126553,
126553,
126555,
126555,
126557,
126557,
126559,
126559,
126561,
126562,
126564,
126564,
126567,
126570,
126572,
126578,
126580,
126583,
126585,
126588,
126590,
126590,
126592,
126601,
126603,
126619,
126625,
126627,
126629,
126633,
126635,
126651,
131072,
173782,
173824,
177972,
177984,
178205,
178208,
183969,
194560,
195101
];
static alpha = [
65,
90,
97,
122,
170,
170,
181,
181,
186,
186,
192,
214,
216,
246,
248,
705,
710,
721,
736,
740,
748,
748,
750,
750,
880,
884,
886,
887,
890,
893,
895,
895,
902,
902,
904,
906,
908,
908,
910,
929,
931,
1013,
1015,
1153,
1162,
1327,
1329,
1366,
1369,
1369,
1377,
1415,
1488,
1514,
1520,
1522,
1568,
1610,
1646,
1647,
1649,
1747,
1749,
1749,
1765,
1766,
1774,
1775,
1786,
1788,
1791,
1791,
1808,
1808,
1810,
1839,
1869,
1957,
1969,
1969,
1994,
2026,
2036,
2037,
2042,
2042,
2048,
2069,
2074,
2074,
2084,
2084,
2088,
2088,
2112,
2136,
2208,
2228,
2308,
2361,
2365,
2365,
2384,
2384,
2392,
2401,
2417,
2432,
2437,
2444,
2447,
2448,
2451,
2472,
2474,
2480,
2482,
2482,
2486,
2489,
2493,
2493,
2510,
2510,
2524,
2525,
2527,
2529,
2544,
2545,
2565,
2570,
2575,
2576,
2579,
2600,
2602,
2608,
2610,
2611,
2613,
2614,
2616,
2617,
2649,
2652,
2654,
2654,
2674,
2676,
2693,
2701,
2703,
2705,
2707,
2728,
2730,
2736,
2738,
2739,
2741,
2745,
2749,
2749,
2768,
2768,
2784,
2785,
2809,
2809,
2821,
2828,
2831,
2832,
2835,
2856,
2858,
2864,
2866,
2867,
2869,
2873,
2877,
2877,
2908,
2909,
2911,
2913,
2929,
2929,
2947,
2947,
2949,
2954,
2958,
2960,
2962,
2965,
2969,
2970,
2972,
2972,
2974,
2975,
2979,
2980,
2984,
2986,
2990,
3001,
3024,
3024,
3077,
3084,
3086,
3088,
3090,
3112,
3114,
3129,
3133,
3133,
3160,
3162,
3168,
3169,
3205,
3212,
3214,
3216,
3218,
3240,
3242,
3251,
3253,
3257,
3261,
3261,
3294,
3294,
3296,
3297,
3313,
3314,
3333,
3340,
3342,
3344,
3346,
3386,
3389,
3389,
3406,
3406,
3423,
3425,
3450,
3455,
3461,
3478,
3482,
3505,
3507,
3515,
3517,
3517,
3520,
3526,
3585,
3632,
3634,
3635,
3648,
3654,
3713,
3714,
3716,
3716,
3719,
3720,
3722,
3722,
3725,
3725,
3732,
3735,
3737,
3743,
3745,
3747,
3749,
3749,
3751,
3751,
3754,
3755,
3757,
3760,
3762,
3763,
3773,
3773,
3776,
3780,
3782,
3782,
3804,
3807,
3840,
3840,
3904,
3911,
3913,
3948,
3976,
3980,
4096,
4138,
4159,
4159,
4176,
4181,
4186,
4189,
4193,
4193,
4197,
4198,
4206,
4208,
4213,
4225,
4238,
4238,
4256,
4293,
4295,
4295,
4301,
4301,
4304,
4346,
4348,
4680,
4682,
4685,
4688,
4694,
4696,
4696,
4698,
4701,
4704,
4744,
4746,
4749,
4752,
4784,
4786,
4789,
4792,
4798,
4800,
4800,
4802,
4805,
4808,
4822,
4824,
4880,
4882,
4885,
4888,
4954,
4992,
5007,
5024,
5109,
5112,
5117,
5121,
5740,
5743,
5759,
5761,
5786,
5792,
5866,
5870,
5880,
5888,
5900,
5902,
5905,
5920,
5937,
5952,
5969,
5984,
5996,
5998,
6000,
6016,
6067,
6103,
6103,
6108,
6108,
6176,
6263,
6272,
6312,
6314,
6314,
6320,
6389,
6400,
6430,
6480,
6509,
6512,
6516,
6528,
6571,
6576,
6601,
6656,
6678,
6688,
6740,
6823,
6823,
6917,
6963,
6981,
6987,
7043,
7072,
7086,
7087,
7098,
7141,
7168,
7203,
7245,
7247,
7258,
7293,
7401,
7404,
7406,
7409,
7413,
7414,
7424,
7615,
7680,
7957,
7960,
7965,
7968,
8005,
8008,
8013,
8016,
8023,
8025,
8025,
8027,
8027,
8029,
8029,
8031,
8061,
8064,
8116,
8118,
8124,
8126,
8126,
8130,
8132,
8134,
8140,
8144,
8147,
8150,
8155,
8160,
8172,
8178,
8180,
8182,
8188,
8305,
8305,
8319,
8319,
8336,
8348,
8450,
8450,
8455,
8455,
8458,
8467,
8469,
8469,
8473,
8477,
8484,
8484,
8486,
8486,
8488,
8488,
8490,
8493,
8495,
8505,
8508,
8511,
8517,
8521,
8526,
8526,
8544,
8584,
11264,
11310,
11312,
11358,
11360,
11492,
11499,
11502,
11506,
11507,
11520,
11557,
11559,
11559,
11565,
11565,
11568,
11623,
11631,
11631,
11648,
11670,
11680,
11686,
11688,
11694,
11696,
11702,
11704,
11710,
11712,
11718,
11720,
11726,
11728,
11734,
11736,
11742,
11823,
11823,
12293,
12295,
12321,
12329,
12337,
12341,
12344,
12348,
12353,
12438,
12445,
12447,
12449,
12538,
12540,
12543,
12549,
12589,
12593,
12686,
12704,
12730,
12784,
12799,
13312,
19893,
19968,
40917,
40960,
42124,
42192,
42237,
42240,
42508,
42512,
42527,
42538,
42539,
42560,
42606,
42623,
42653,
42656,
42735,
42775,
42783,
42786,
42888,
42891,
42925,
42928,
42935,
42999,
43009,
43011,
43013,
43015,
43018,
43020,
43042,
43072,
43123,
43138,
43187,
43250,
43255,
43259,
43259,
43261,
43261,
43274,
43301,
43312,
43334,
43360,
43388,
43396,
43442,
43471,
43471,
43488,
43492,
43494,
43503,
43514,
43518,
43520,
43560,
43584,
43586,
43588,
43595,
43616,
43638,
43642,
43642,
43646,
43695,
43697,
43697,
43701,
43702,
43705,
43709,
43712,
43712,
43714,
43714,
43739,
43741,
43744,
43754,
43762,
43764,
43777,
43782,
43785,
43790,
43793,
43798,
43808,
43814,
43816,
43822,
43824,
43866,
43868,
43877,
43888,
44002,
44032,
55203,
55216,
55238,
55243,
55291,
63744,
64109,
64112,
64217,
64256,
64262,
64275,
64279,
64285,
64285,
64287,
64296,
64298,
64310,
64312,
64316,
64318,
64318,
64320,
64321,
64323,
64324,
64326,
64433,
64467,
64829,
64848,
64911,
64914,
64967,
65008,
65019,
65136,
65140,
65142,
65276,
65313,
65338,
65345,
65370,
65382,
65470,
65474,
65479,
65482,
65487,
65490,
65495,
65498,
65500,
65536,
65547,
65549,
65574,
65576,
65594,
65596,
65597,
65599,
65613,
65616,
65629,
65664,
65786,
65856,
65908,
66176,
66204,
66208,
66256,
66304,
66335,
66352,
66378,
66384,
66421,
66432,
66461,
66464,
66499,
66504,
66511,
66513,
66517,
66560,
66717,
66816,
66855,
66864,
66915,
67072,
67382,
67392,
67413,
67424,
67431,
67584,
67589,
67592,
67592,
67594,
67637,
67639,
67640,
67644,
67644,
67647,
67669,
67680,
67702,
67712,
67742,
67808,
67826,
67828,
67829,
67840,
67861,
67872,
67897,
67968,
68023,
68030,
68031,
68096,
68096,
68112,
68115,
68117,
68119,
68121,
68147,
68192,
68220,
68224,
68252,
68288,
68295,
68297,
68324,
68352,
68405,
68416,
68437,
68448,
68466,
68480,
68497,
68608,
68680,
68736,
68786,
68800,
68850,
69635,
69687,
69763,
69807,
69840,
69864,
69891,
69926,
69968,
70002,
70006,
70006,
70019,
70066,
70081,
70084,
70106,
70106,
70108,
70108,
70144,
70161,
70163,
70187,
70272,
70278,
70280,
70280,
70282,
70285,
70287,
70301,
70303,
70312,
70320,
70366,
70405,
70412,
70415,
70416,
70419,
70440,
70442,
70448,
70450,
70451,
70453,
70457,
70461,
70461,
70480,
70480,
70493,
70497,
70784,
70831,
70852,
70853,
70855,
70855,
71040,
71086,
71128,
71131,
71168,
71215,
71236,
71236,
71296,
71338,
71424,
71449,
71840,
71903,
71935,
71935,
72384,
72440,
73728,
74649,
74752,
74862,
74880,
75075,
77824,
78894,
82944,
83526,
92160,
92728,
92736,
92766,
92880,
92909,
92928,
92975,
92992,
92995,
93027,
93047,
93053,
93071,
93952,
94020,
94032,
94032,
94099,
94111,
110592,
110593,
113664,
113770,
113776,
113788,
113792,
113800,
113808,
113817,
119808,
119892,
119894,
119964,
119966,
119967,
119970,
119970,
119973,
119974,
119977,
119980,
119982,
119993,
119995,
119995,
119997,
120003,
120005,
120069,
120071,
120074,
120077,
120084,
120086,
120092,
120094,
120121,
120123,
120126,
120128,
120132,
120134,
120134,
120138,
120144,
120146,
120485,
120488,
120512,
120514,
120538,
120540,
120570,
120572,
120596,
120598,
120628,
120630,
120654,
120656,
120686,
120688,
120712,
120714,
120744,
120746,
120770,
120772,
120779,
124928,
125124,
126464,
126467,
126469,
126495,
126497,
126498,
126500,
126500,
126503,
126503,
126505,
126514,
126516,
126519,
126521,
126521,
126523,
126523,
126530,
126530,
126535,
126535,
126537,
126537,
126539,
126539,
126541,
126543,
126545,
126546,
126548,
126548,
126551,
126551,
126553,
126553,
126555,
126555,
126557,
126557,
126559,
126559,
126561,
126562,
126564,
126564,
126567,
126570,
126572,
126578,
126580,
126583,
126585,
126588,
126590,
126590,
126592,
126601,
126603,
126619,
126625,
126627,
126629,
126633,
126635,
126651,
131072,
173782,
173824,
177972,
177984,
178205,
178208,
183969,
194560,
195101
];
static cntrl = FACharacterClasses.unicodeCategories[14];
static digit = FACharacterClasses.unicodeCategories[8];
static graph = [
33,
126,
161,
5759,
5761,
8191,
8203,
8231,
8234,
8238,
8240,
8286,
8288,
12287,
12289,
55295,
57344,
1114111
];
static ascii = [
0,
127
];
static blank = [
9,
9,
32,
32,
160,
160,
5760,
5760,
8192,
8202,
8239,
8239,
8287,
8287,
12288,
12288
];
static lower = FACharacterClasses.unicodeCategories[1];
static print = FACharacterClasses.notUnicodeCategories[14];
static punct = [
41,
41,
93,
93,
125,
125,
3899,
3899,
3901,
3901,
5788,
5788,
8262,
8262,
8318,
8318,
8334,
8334,
8969,
8969,
8971,
8971,
9002,
9002,
10089,
10089,
10091,
10091,
10093,
10093,
10095,
10095,
10097,
10097,
10099,
10099,
10101,
10101,
10182,
10182,
10215,
10215,
10217,
10217,
10219,
10219,
10221,
10221,
10223,
10223,
10628,
10628,
10630,
10630,
10632,
10632,
10634,
10634,
10636,
10636,
10638,
10638,
10640,
10640,
10642,
10642,
10644,
10644,
10646,
10646,
10648,
10648,
10713,
10713,
10715,
10715,
10749,
10749,
11811,
11811,
11813,
11813,
11815,
11815,
11817,
11817,
12297,
12297,
12299,
12299,
12301,
12301,
12303,
12303,
12305,
12305,
12309,
12309,
12311,
12311,
12313,
12313,
12315,
12315,
12318,
12319,
64830,
64830,
65048,
65048,
65078,
65078,
65080,
65080,
65082,
65082,
65084,
65084,
65086,
65086,
65088,
65088,
65090,
65090,
65092,
65092,
65096,
65096,
65114,
65114,
65116,
65116,
65118,
65118,
65289,
65289,
65341,
65341,
65373,
65373,
65376,
65376,
65379,
65379,
95,
95,
8255,
8256,
8276,
8276,
65075,
65076,
65101,
65101,
65103,
65103,
65343,
65343,
45,
45,
173,
173,
1418,
1418,
1470,
1470,
5120,
5120,
6150,
6150,
8208,
8208,
8213,
8213,
11799,
11799,
11802,
11802,
11834,
11835,
11840,
11840,
12316,
12316,
12336,
12336,
12448,
12448,
65073,
65074,
65112,
65112,
65123,
65123,
65293,
65293,
187,
187,
8217,
8217,
8221,
8221,
8250,
8250,
11779,
11779,
11781,
11781,
11786,
11786,
11789,
11789,
11805,
11805,
11809,
11809,
171,
171,
8216,
8216,
8219,
8220,
8223,
8223,
8249,
8249,
11778,
11778,
11780,
11780,
11785,
11785,
11788,
11788,
11804,
11804,
11808,
11808,
40,
40,
91,
91,
123,
123,
3898,
3898,
3900,
3900,
5787,
5787,
8218,
8218,
8222,
8222,
8261,
8261,
8317,
8317,
8333,
8333,
8968,
8968,
8970,
8970,
9001,
9001,
10088,
10088,
10090,
10090,
10092,
10092,
10094,
10094,
10096,
10096,
10098,
10098,
10100,
10100,
10181,
10181,
10214,
10214,
10216,
10216,
10218,
10218,
10220,
10220,
10222,
10222,
10627,
10627,
10629,
10629,
10631,
10631,
10633,
10633,
10635,
10635,
10637,
10637,
10639,
10639,
10641,
10641,
10643,
10643,
10645,
10645,
10647,
10647,
10712,
10712,
10714,
10714,
10748,
10748,
11810,
11810,
11812,
11812,
11814,
11814,
11816,
11816,
11842,
11842,
12296,
12296,
12298,
12298,
12300,
12300,
12302,
12302,
12304,
12304,
12308,
12308,
12310,
12310,
12312,
12312,
12314,
12314,
12317,
12317,
64831,
64831,
65047,
65047,
65077,
65077,
65079,
65079,
65081,
65081,
65083,
65083,
65085,
65085,
65087,
65087,
65089,
65089,
65091,
65091,
65095,
65095,
65113,
65113,
65115,
65115,
65117,
65117,
65288,
65288,
65339,
65339,
65371,
65371,
65375,
65375,
65378,
65378,
33,
33,
35,
35,
37,
37,
39,
39,
42,
42,
44,
44,
46,
47,
58,
59,
63,
64,
92,
92,
161,
161,
183,
183,
191,
191,
894,
894,
903,
903,
1370,
1370,
1375,
1375,
1417,
1417,
1472,
1472,
1475,
1475,
1478,
1478,
1523,
1524,
1545,
1546,
1548,
1549,
1563,
1563,
1566,
1567,
1642,
1642,
1645,
1645,
1748,
1748,
1792,
1792,
1805,
1805,
2039,
2039,
2041,
2041,
2096,
2096,
2110,
2110,
2142,
2142,
2404,
2405,
2416,
2416,
2800,
2800,
3572,
3572,
3663,
3663,
3674,
3675,
3844,
3844,
3858,
3858,
3860,
3860,
3973,
3973,
4048,
4048,
4052,
4052,
4057,
4058,
4170,
4170,
4175,
4175,
4347,
4347,
4960,
4960,
4968,
4968,
5741,
5742,
5867,
5867,
5869,
5869,
5941,
5942,
6100,
6100,
6102,
6102,
6104,
6104,
6106,
6106,
6144,
6144,
6149,
6149,
6151,
6151,
6154,
6154,
6468,
6469,
6686,
6687,
6816,
6816,
6822,
6822,
6824,
6824,
6829,
6829,
7002,
7002,
7008,
7008,
7164,
7164,
7167,
7167,
7227,
7227,
7231,
7231,
7294,
7295,
7360,
7360,
7367,
7367,
7379,
7379,
8214,
8215,
8224,
8224,
8231,
8231,
8240,
8240,
8248,
8248,
8251,
8251,
8254,
8254,
8257,
8257,
8259,
8259,
8263,
8263,
8273,
8273,
8275,
8275,
8277,
8277,
8286,
8286,
11513,
11513,
11516,
11516,
11518,
11519,
11632,
11632,
11776,
11777,
11782,
11782,
11784,
11784,
11787,
11787,
11790,
11790,
11798,
11798,
11800,
11801,
11803,
11803,
11806,
11807,
11818,
11818,
11822,
11822,
11824,
11824,
11833,
11833,
11836,
11836,
11839,
11839,
11841,
11841,
12289,
12289,
12291,
12291,
12349,
12349,
12539,
12539,
42238,
42239,
42509,
42509,
42511,
42511,
42611,
42611,
42622,
42622,
42738,
42738,
42743,
42743,
43124,
43124,
43127,
43127,
43214,
43215,
43256,
43256,
43258,
43258,
43260,
43260,
43310,
43311,
43359,
43359,
43457,
43457,
43469,
43469,
43486,
43487,
43612,
43612,
43615,
43615,
43742,
43743,
43760,
43761,
44011,
44011,
65040,
65040,
65046,
65046,
65049,
65049,
65072,
65072,
65093,
65094,
65097,
65097,
65100,
65100,
65104,
65104,
65106,
65106,
65108,
65108,
65111,
65111,
65119,
65119,
65121,
65121,
65128,
65128,
65130,
65131,
65281,
65281,
65283,
65283,
65285,
65285,
65287,
65287,
65290,
65290,
65292,
65292,
65294,
65295,
65306,
65307,
65311,
65312,
65340,
65340,
65377,
65377,
65380,
65381,
65792,
65792,
65794,
65794,
66463,
66463,
66512,
66512,
66927,
66927,
67671,
67671,
67871,
67871,
67903,
67903,
68176,
68176,
68184,
68184,
68223,
68223,
68336,
68336,
68342,
68342,
68409,
68409,
68415,
68415,
68505,
68505,
68508,
68508,
69703,
69703,
69709,
69709,
69819,
69820,
69822,
69822,
69825,
69825,
69952,
69952,
69955,
69955,
70004,
70005,
70085,
70085,
70089,
70089,
70093,
70093,
70107,
70107,
70109,
70109,
70111,
70111,
70200,
70200,
70205,
70205,
70313,
70313,
70854,
70854,
71105,
71105,
71127,
71127,
71233,
71233,
71235,
71235,
71484,
71484,
71486,
71486,
74864,
74864,
74868,
74868,
92782,
92783,
92917,
92917,
92983,
92983,
92987,
92987,
92996,
92996,
113823,
113823,
121479,
121479,
121483,
121483
];
static space = FACharacterClasses.isWhiteSpace;
static upper = FACharacterClasses.unicodeCategories[0];
static word = [
65,
90,
97,
122,
170,
170,
181,
181,
186,
186,
192,
214,
216,
246,
248,
705,
710,
721,
736,
740,
748,
748,
750,
750,
880,
884,
886,
887,
890,
893,
895,
895,
902,
902,
904,
906,
908,
908,
910,
929,
931,
1013,
1015,
1153,
1162,
1327,
1329,
1366,
1369,
1369,
1377,
1415,
1488,
1514,
1520,
1522,
1568,
1610,
1646,
1647,
1649,
1747,
1749,
1749,
1765,
1766,
1774,
1775,
1786,
1788,
1791,
1791,
1808,
1808,
1810,
1839,
1869,
1957,
1969,
1969,
1994,
2026,
2036,
2037,
2042,
2042,
2048,
2069,
2074,
2074,
2084,
2084,
2088,
2088,
2112,
2136,
2208,
2228,
2308,
2361,
2365,
2365,
2384,
2384,
2392,
2401,
2417,
2432,
2437,
2444,
2447,
2448,
2451,
2472,
2474,
2480,
2482,
2482,
2486,
2489,
2493,
2493,
2510,
2510,
2524,
2525,
2527,
2529,
2544,
2545,
2565,
2570,
2575,
2576,
2579,
2600,
2602,
2608,
2610,
2611,
2613,
2614,
2616,
2617,
2649,
2652,
2654,
2654,
2674,
2676,
2693,
2701,
2703,
2705,
2707,
2728,
2730,
2736,
2738,
2739,
2741,
2745,
2749,
2749,
2768,
2768,
2784,
2785,
2809,
2809,
2821,
2828,
2831,
2832,
2835,
2856,
2858,
2864,
2866,
2867,
2869,
2873,
2877,
2877,
2908,
2909,
2911,
2913,
2929,
2929,
2947,
2947,
2949,
2954,
2958,
2960,
2962,
2965,
2969,
2970,
2972,
2972,
2974,
2975,
2979,
2980,
2984,
2986,
2990,
3001,
3024,
3024,
3077,
3084,
3086,
3088,
3090,
3112,
3114,
3129,
3133,
3133,
3160,
3162,
3168,
3169,
3205,
3212,
3214,
3216,
3218,
3240,
3242,
3251,
3253,
3257,
3261,
3261,
3294,
3294,
3296,
3297,
3313,
3314,
3333,
3340,
3342,
3344,
3346,
3386,
3389,
3389,
3406,
3406,
3423,
3425,
3450,
3455,
3461,
3478,
3482,
3505,
3507,
3515,
3517,
3517,
3520,
3526,
3585,
3632,
3634,
3635,
3648,
3654,
3713,
3714,
3716,
3716,
3719,
3720,
3722,
3722,
3725,
3725,
3732,
3735,
3737,
3743,
3745,
3747,
3749,
3749,
3751,
3751,
3754,
3755,
3757,
3760,
3762,
3763,
3773,
3773,
3776,
3780,
3782,
3782,
3804,
3807,
3840,
3840,
3904,
3911,
3913,
3948,
3976,
3980,
4096,
4138,
4159,
4159,
4176,
4181,
4186,
4189,
4193,
4193,
4197,
4198,
4206,
4208,
4213,
4225,
4238,
4238,
4256,
4293,
4295,
4295,
4301,
4301,
4304,
4346,
4348,
4680,
4682,
4685,
4688,
4694,
4696,
4696,
4698,
4701,
4704,
4744,
4746,
4749,
4752,
4784,
4786,
4789,
4792,
4798,
4800,
4800,
4802,
4805,
4808,
4822,
4824,
4880,
4882,
4885,
4888,
4954,
4992,
5007,
5024,
5109,
5112,
5117,
5121,
5740,
5743,
5759,
5761,
5786,
5792,
5866,
5873,
5880,
5888,
5900,
5902,
5905,
5920,
5937,
5952,
5969,
5984,
5996,
5998,
6000,
6016,
6067,
6103,
6103,
6108,
6108,
6176,
6263,
6272,
6312,
6314,
6314,
6320,
6389,
6400,
6430,
6480,
6509,
6512,
6516,
6528,
6571,
6576,
6601,
6656,
6678,
6688,
6740,
6823,
6823,
6917,
6963,
6981,
6987,
7043,
7072,
7086,
7087,
7098,
7141,
7168,
7203,
7245,
7247,
7258,
7293,
7401,
7404,
7406,
7409,
7413,
7414,
7424,
7615,
7680,
7957,
7960,
7965,
7968,
8005,
8008,
8013,
8016,
8023,
8025,
8025,
8027,
8027,
8029,
8029,
8031,
8061,
8064,
8116,
8118,
8124,
8126,
8126,
8130,
8132,
8134,
8140,
8144,
8147,
8150,
8155,
8160,
8172,
8178,
8180,
8182,
8188,
8305,
8305,
8319,
8319,
8336,
8348,
8450,
8450,
8455,
8455,
8458,
8467,
8469,
8469,
8473,
8477,
8484,
8484,
8486,
8486,
8488,
8488,
8490,
8493,
8495,
8505,
8508,
8511,
8517,
8521,
8526,
8526,
8579,
8580,
11264,
11310,
11312,
11358,
11360,
11492,
11499,
11502,
11506,
11507,
11520,
11557,
11559,
11559,
11565,
11565,
11568,
11623,
11631,
11631,
11648,
11670,
11680,
11686,
11688,
11694,
11696,
11702,
11704,
11710,
11712,
11718,
11720,
11726,
11728,
11734,
11736,
11742,
11823,
11823,
12293,
12294,
12337,
12341,
12347,
12348,
12353,
12438,
12445,
12447,
12449,
12538,
12540,
12543,
12549,
12589,
12593,
12686,
12704,
12730,
12784,
12799,
13312,
19893,
19968,
40917,
40960,
42124,
42192,
42237,
42240,
42508,
42512,
42527,
42538,
42539,
42560,
42606,
42623,
42653,
42656,
42725,
42775,
42783,
42786,
42888,
42891,
42925,
42928,
42935,
42999,
43009,
43011,
43013,
43015,
43018,
43020,
43042,
43072,
43123,
43138,
43187,
43250,
43255,
43259,
43259,
43261,
43261,
43274,
43301,
43312,
43334,
43360,
43388,
43396,
43442,
43471,
43471,
43488,
43492,
43494,
43503,
43514,
43518,
43520,
43560,
43584,
43586,
43588,
43595,
43616,
43638,
43642,
43642,
43646,
43695,
43697,
43697,
43701,
43702,
43705,
43709,
43712,
43712,
43714,
43714,
43739,
43741,
43744,
43754,
43762,
43764,
43777,
43782,
43785,
43790,
43793,
43798,
43808,
43814,
43816,
43822,
43824,
43866,
43868,
43877,
43888,
44002,
44032,
55203,
55216,
55238,
55243,
55291,
63744,
64109,
64112,
64217,
64256,
64262,
64275,
64279,
64285,
64285,
64287,
64296,
64298,
64310,
64312,
64316,
64318,
64318,
64320,
64321,
64323,
64324,
64326,
64433,
64467,
64829,
64848,
64911,
64914,
64967,
65008,
65019,
65136,
65140,
65142,
65276,
65313,
65338,
65345,
65370,
65382,
65470,
65474,
65479,
65482,
65487,
65490,
65495,
65498,
65500,
65536,
65547,
65549,
65574,
65576,
65594,
65596,
65597,
65599,
65613,
65616,
65629,
65664,
65786,
66176,
66204,
66208,
66256,
66304,
66335,
66352,
66368,
66370,
66377,
66384,
66421,
66432,
66461,
66464,
66499,
66504,
66511,
66560,
66717,
66816,
66855,
66864,
66915,
67072,
67382,
67392,
67413,
67424,
67431,
67584,
67589,
67592,
67592,
67594,
67637,
67639,
67640,
67644,
67644,
67647,
67669,
67680,
67702,
67712,
67742,
67808,
67826,
67828,
67829,
67840,
67861,
67872,
67897,
67968,
68023,
68030,
68031,
68096,
68096,
68112,
68115,
68117,
68119,
68121,
68147,
68192,
68220,
68224,
68252,
68288,
68295,
68297,
68324,
68352,
68405,
68416,
68437,
68448,
68466,
68480,
68497,
68608,
68680,
68736,
68786,
68800,
68850,
69635,
69687,
69763,
69807,
69840,
69864,
69891,
69926,
69968,
70002,
70006,
70006,
70019,
70066,
70081,
70084,
70106,
70106,
70108,
70108,
70144,
70161,
70163,
70187,
70272,
70278,
70280,
70280,
70282,
70285,
70287,
70301,
70303,
70312,
70320,
70366,
70405,
70412,
70415,
70416,
70419,
70440,
70442,
70448,
70450,
70451,
70453,
70457,
70461,
70461,
70480,
70480,
70493,
70497,
70784,
70831,
70852,
70853,
70855,
70855,
71040,
71086,
71128,
71131,
71168,
71215,
71236,
71236,
71296,
71338,
71424,
71449,
71840,
71903,
71935,
71935,
72384,
72440,
73728,
74649,
74880,
75075,
77824,
78894,
82944,
83526,
92160,
92728,
92736,
92766,
92880,
92909,
92928,
92975,
92992,
92995,
93027,
93047,
93053,
93071,
93952,
94020,
94032,
94032,
94099,
94111,
110592,
110593,
113664,
113770,
113776,
113788,
113792,
113800,
113808,
113817,
119808,
119892,
119894,
119964,
119966,
119967,
119970,
119970,
119973,
119974,
119977,
119980,
119982,
119993,
119995,
119995,
119997,
120003,
120005,
120069,
120071,
120074,
120077,
120084,
120086,
120092,
120094,
120121,
120123,
120126,
120128,
120132,
120134,
120134,
120138,
120144,
120146,
120485,
120488,
120512,
120514,
120538,
120540,
120570,
120572,
120596,
120598,
120628,
120630,
120654,
120656,
120686,
120688,
120712,
120714,
120744,
120746,
120770,
120772,
120779,
124928,
125124,
126464,
126467,
126469,
126495,
126497,
126498,
126500,
126500,
126503,
126503,
126505,
126514,
126516,
126519,
126521,
126521,
126523,
126523,
126530,
126530,
126535,
126535,
126537,
126537,
126539,
126539,
126541,
126543,
126545,
126546,
126548,
126548,
126551,
126551,
126553,
126553,
126555,
126555,
126557,
126557,
126559,
126559,
126561,
126562,
126564,
126564,
126567,
126570,
126572,
126578,
126580,
126583,
126585,
126588,
126590,
126590,
126592,
126601,
126603,
126619,
126625,
126627,
126629,
126633,
126635,
126651,
131072,
173782,
173824,
177972,
177984,
178205,
178208,
183969,
194560,
195101,
5870,
5870,
5872,
5872,
8544,
8544,
8578,
8578,
8581,
8581,
8584,
8584,
12295,
12295,
12321,
12321,
12329,
12329,
12344,
12344,
12346,
12346,
42726,
42726,
42735,
42735,
65856,
65856,
65908,
65908,
66369,
66369,
66378,
66378,
66513,
66513,
66517,
66517,
74752,
74752,
74862,
74862,
95,
95,
8255,
8256,
8276,
8276,
65075,
65076,
65101,
65101,
65103,
65103,
65343,
65343,
48,
48,
57,
57,
1632,
1632,
1641,
1641,
1776,
1776,
1785,
1785,
1984,
1984,
1993,
1993,
2406,
2406,
2415,
2415,
2534,
2534,
2543,
2543,
2662,
2662,
2671,
2671,
2790,
2790,
2799,
2799,
2918,
2918,
2927,
2927,
3046,
3046,
3055,
3055,
3174,
3174,
3183,
3183,
3302,
3302,
3311,
3311,
3430,
3430,
3439,
3439,
3558,
3558,
3567,
3567,
3664,
3664,
3673,
3673,
3792,
3792,
3801,
3801,
3872,
3872,
3881,
3881,
4160,
4160,
4169,
4169,
4240,
4240,
4249,
4249,
6112,
6112,
6121,
6121,
6160,
6160,
6169,
6169,
6470,
6470,
6479,
6479,
6608,
6608,
6617,
6617,
6784,
6784,
6793,
6793,
6800,
6800,
6809,
6809,
6992,
6992,
7001,
7001,
7088,
7088,
7097,
7097,
7232,
7232,
7241,
7241,
7248,
7248,
7257,
7257,
42528,
42528,
42537,
42537,
43216,
43216,
43225,
43225,
43264,
43264,
43273,
43273,
43472,
43472,
43481,
43481,
43504,
43504,
43513,
43513,
43600,
43600,
43609,
43609,
44016,
44016,
44025,
44025,
65296,
65296,
65305,
65305,
66720,
66720,
66729,
66729,
69734,
69734,
69743,
69743,
69872,
69872,
69881,
69881,
69942,
69942,
69951,
69951,
70096,
70096,
70105,
70105,
70384,
70384,
70393,
70393,
70864,
70864,
70873,
70873,
71248,
71248,
71257,
71257,
71360,
71360,
71369,
71369,
71472,
71472,
71481,
71481,
71904,
71904,
71913,
71913,
92768,
92768,
92777,
92777,
93008,
93008,
93017,
93017,
120782,
120782,
120831,
120831
];
static xdigit = [
48,
48,
57,
57,
65,
65,
70,
70,
97,
97,
102,
102
];
static _known = null;
static known() {
if (FACharacterClasses._known === null) {
const result = new Map();
result.set("IsLetter", FACharacterClasses.isLetter);
result.set("IsDigit", FACharacterClasses.isDigit);
result.set("IsLetterOrDigit", FACharacterClasses.isLetterOrDigit);
result.set("IsWhiteSpace", FACharacterClasses.isWhiteSpace);
result.set("alnum", FACharacterClasses.alnum);
result.set("alpha", FACharacterClasses.alpha);
result.set("cntrl", FACharacterClasses.cntrl);
result.set("digit", FACharacterClasses.digit);
result.set("graph", FACharacterClasses.graph);
result.set("ascii", FACharacterClasses.ascii);
result.set("blank", FACharacterClasses.blank);
result.set("lower", FACharacterClasses.lower);
result.set("print", FACharacterClasses.print);
result.set("punct", FACharacterClasses.punct);
result.set("space", FACharacterClasses.space);
result.set("upper", FACharacterClasses.upper);
result.set("word", FACharacterClasses.word);
result.set("xdigit", FACharacterClasses.xdigit);
FACharacterClasses._known = result;
}
return FACharacterClasses._known;
}
}
export class FAMatch {
symbolId;
value;
position;
line;
column;
constructor(symbolId = -1, value = null, position = 0, line = 1, column = 1){
this.symbolId = symbolId;
this.value = value;
this.position = position;
this.line = line;
this.column = column;
}
toString() {
let sb = "";
sb += "[SymbolId: ";
sb += this.symbolId;
sb += ", Value: ";
if (this.value !== null && this.value !== undefined) {
sb += "\"";
sb += this.value.replace("\r", "\\r").replace("\t", "\\t").replace("\n", "\\n").replace("\v", "\\v");
sb += "\", Position: ";
} else {
sb += "null, Position: ";
}
sb += this.position;
sb += " (";
sb += this.line;
sb += ", ";
sb += this.column;
sb += ")]";
return sb;
}
}
export class FARunner {
tabWidth = 4;
position = -1;
line = 1;
column = 1;
*[Symbol.iterator]() {
let match = new FAMatch();
match = this.nextMatch();
while(match.symbolId !== -2){
yield match;
match = this.nextMatch();
}
}
}
export class FAStringRunner extends FARunner {
input_string;
set(str) {
this.input_string = str;
this.position = -1;
this.line = 1;
this.column = 1;
}
reset() {
this.position = -1;
this.line = 1;
this.column = 1;
}
advance(s, cp, len, first) {
if (!first) {
switch(String.fromCodePoint(cp)){
case '\n':
++this.line;
this.column = 1;
break;
case '\r':
this.column = 1;
break;
case '\t':
this.column = (this.column - 1) / this.tabWidth * (this.tabWidth + 1);
break;
default:
if (cp > 31) {
++this.column;
}
break;
}
++len;
if (cp > 65535) {
++this.position;
++len;
}
++this.position;
}
if (this.position < s.length) {
cp = s.codePointAt(this.position);
} else {
cp = -1;
}
return [
cp,
len
];
}
}
export class FAStringStateRunner extends FAStringRunner {
_fa;
_blockEnds;
_states;
_nexts;
_initial;
constructor(fa, blockEnds = null){
super();
if (null === fa || undefined === fa) {
throw "fa was not valid";
}
this._fa = fa;
this._blockEnds = blockEnds;
this._states = new Array();
this._nexts = new Array();
this._initial = new Array();
}
nextMatch() {
return this._nextImpl(this.input_string);
}
_nextImpl(s) {
let dfaState = null, dfaNext = null, dfaInitial = null;
if (this.position == -1) {
++this.position;
}
let len = 0;
let cursor_pos = this.position;
let line = this.line;
let column = this.column;
let ch = -1;
let advr = this.advance(s, ch, len, true);
ch = advr[0];
len = advr[1];
if (this._fa.isDeterministic) {
dfaState = this._fa;
dfaInitial = this._fa;
} else {
this._initial.length = 0;
if (this._fa.isCompact) {
this._initial.push(this._fa);
} else {
this._fa.fillEpsilonClosure(this._initial);
}
this._states.length = 0;
this._states.push(...this._initial);
}
while(true){
if (dfaState != null) {
dfaNext = dfaState.move(ch);
} else {
dfaNext = null;
this._nexts.length = 0;
FA.fillMove(this._states, ch, this._nexts);
}
if (dfaNext != null) {
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
if (dfaNext.isDeterministic) {
dfaState = dfaNext;
} else {
this._states.length = 0;
if (dfaNext.isCompact) {
this._states.push(dfaNext);
} else {
dfaNext.fillEpsilonClosure(this._states);
}
dfaState = null;
}
dfaNext = null;
} else if (this._nexts.length > 0) {
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
if (this._nexts.length === 1) {
var ffa = this._nexts[0];
if (ffa.isDeterministic) {
dfaState = ffa;
} else {
dfaNext = null;
this._states.length = 0;
if (!ffa.isCompact) {
ffa.fillEpsilonClosure(this._states);
} else {
this._states.push(ffa);
}
dfaState = null;
}
} else {
this._states.length = 0;
FA.fillEpsilonClosureStates(this._nexts, this._states);
}
this._nexts.length = 0;
} else {
let acc;
if (dfaState !== null) {
acc = dfaState.acceptSymbol;
} else {
acc = FA.getFirstAcceptSymbol(this._states);
}
if (acc > -1) {
if (this._blockEnds != null && this._blockEnds.length > acc && this._blockEnds[acc] !== null) {
var be = this._blockEnds[acc];
if (be.isDeterministic) {
dfaState = be;
dfaInitial = be;
this._states.length = 0;
} else {
dfaState = null;
dfaInitial = null;
this._initial.length = 0;
if (be.isCompact) {
this._initial.push(be);
} else {
be.fillEpsilonClosure(this._initial);
}
this._states.length = 0;
this._states.push(...this._initial);
}
while(true){
if (dfaState !== null) {
dfaNext = dfaState.move(ch);
} else {
dfaNext = null;
this._nexts.length = 0;
FA.fillMove(this._states, ch, this._nexts);
}
if (dfaNext !== null) {
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
if (dfaNext.isDeterministic) {
dfaState = dfaNext;
} else {
this._states.length = 0;
if (dfaNext.isCompact) {
this._states.push(dfaNext);
} else {
dfaNext.fillEpsilonClosure(this._states);
}
dfaState = null;
}
dfaNext = null;
} else if (this._nexts.length > 0) {
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
if (this._nexts.length == 1) {
const ffa = this._nexts[0];
if (ffa.isDeterministic) {
dfaState = ffa;
this._states.length = 0;
} else {
dfaNext = null;
this._states.length = 0;
if (!ffa.isCompact) {
ffa.fillEpsilonClosure(this._states);
} else {
this._states.push(ffa);
}
dfaState = null;
}
} else {
this._states.length = 0;
FA.fillEpsilonClosureStates(this._nexts, this._states);
}
this._nexts.length = 0;
} else {
if (dfaState !== null) {
if (dfaState.isAccepting()) {
return new FAMatch(acc, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
} else {
if (-1 < FA.getFirstAcceptSymbol(this._states)) {
return new FAMatch(acc, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
}
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
if (dfaInitial !== null) {
this._states.length = 0;
dfaState = dfaInitial;
} else {
dfaState = null;
this._states.length = 0;
this._states.push(...this._initial);
}
if (ch == -1) {
return new FAMatch(-1, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
}
}
} else {
return new FAMatch(acc, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
} else {
if (dfaInitial !== null) {
while(ch != -1 && dfaInitial.move(ch) === null){
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
}
} else {
this._states.length = 0;
while(ch != -1 && FA.fillMove(this._initial, ch, this._states).length === 0){
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
}
}
if (len == 0) {
return new FAMatch(-2, null, 0, 0, 0);
}
return new FAMatch(-1, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
}
}
}
}
export class FAStringDfaTableRunner extends FAStringRunner {
_dfa;
_blockEnds;
constructor(dfa, blockEnds = null){
super();
this._dfa = dfa;
this._blockEnds = blockEnds;
}
nextMatch() {
return this._nextImpl(this.input_string);
}
_nextImpl(s) {
let tlen;
let tto;
let prlen;
let pmin;
let pmax;
let i;
let j;
let state = 0;
let acc;
if (this.position === -1) {
++this.position;
}
let len = 0;
let cursor_pos = this.position;
let line = this.line;
let column = this.column;
let ch = -1;
let cont = false;
let advr = this.advance(s, ch, len, true);
ch = advr[0];
len = advr[1];
while(true){
acc = this._dfa[state];
++state;
tlen = this._dfa[state];
++state;
for(let i = 0; i < tlen; ++i){
tto = this._dfa[state];
++state;
prlen = this._dfa[state];
++state;
for(let j = 0; j < prlen; ++j){
pmin = this._dfa[state];
++state;
pmax = this._dfa[state];
++state;
if (ch < pmin) {
state += (prlen - (j + 1)) * 2;
j = prlen;
} else if (ch <= pmax) {
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
state = tto;
cont = true;
i = tlen;
break;
}
}
}
if (cont === true) {
cont = false;
continue;
}
break;
}
if (acc !== -1) {
const sym = acc;
const be = this._blockEnds !== null && this._blockEnds.length > acc ? this._blockEnds[acc] : null;
if (be !== null) {
state = 0;
while(true){
acc = be[state];
++state;
tlen = be[state];
++state;
for(let i = 0; i < tlen; ++i){
tto = be[state];
++state;
prlen = be[state];
++state;
for(let j = 0; j < prlen; ++j){
pmin = be[state];
++state;
pmax = be[state];
++state;
if (ch < pmin) {
state += (prlen - (j + 1)) * 2;
j = prlen;
} else if (ch <= pmax) {
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
state = tto;
i = tlen;
break;
}
}
}
if (acc !== -1) {
return new FAMatch(sym, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
if (ch === -1) {
return new FAMatch(-1, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
state = 0;
}
}
return new FAMatch(acc, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
while(ch !== -1){
var moved = false;
state = 1;
tlen = this._dfa[state];
++state;
for(let i = 0; i < tlen; ++i){
++state;
prlen = this._dfa[state];
++state;
for(let j = 0; j < prlen; ++j){
pmin = this._dfa[state];
++state;
pmax = this._dfa[state];
++state;
if (ch < pmin) {
state += (prlen - (j + 1)) * 2;
j = prlen;
} else if (ch <= pmax) {
moved = true;
}
}
}
if (moved) {
break;
}
advr = this.advance(s, ch, len, false);
ch = advr[0];
len = advr[1];
}
if (len === 0) {
return new FAMatch(-2, null, 0, 0, 0);
}
return new FAMatch(-1, s.substring(cursor_pos, cursor_pos + len), cursor_pos, line, column);
}
}
class _ParseContext {
input;
codepoint = -2;
position = 0;
line = 1;
column = 0;
tabWidth = 4;
capture_buffer = "";
constructor(input, tabWidth = 4, position = 0, line = 1, column = 0){
this.input = input;
this.tabWidth = tabWidth;
this.position = position;
this.line = line;
this.column = column;
}
advance() {
if (this.position >= this.input.length) {
this.codepoint = -1;
} else {
this.codepoint = this.input.codePointAt(this.position);
}
switch(this.codepoint){
case 10:
++this.line;
this.column = 0;
break;
case 13:
this.column = 0;
break;
case 9:
this.column = ((this.column - 1) / this.tabWidth + 1) * this.tabWidth + 1;
break;
default:
if (this.codepoint > 31) ++this.column;
break;
}
++this.position;
return this.codepoint;
}
capture() {
this.capture_buffer += String.fromCodePoint(this.codepoint);
}
ensureStarted() {
if (this.codepoint == -2) {
this.advance();
}
}
static _getCodepoints(values) {
const result = new Array(values.length);
for(let i = 0; i < values.length; ++i){
result[i] = values[i].codePointAt(0);
}
return result;
}
_getErrorMessage(expecting) {
let sb = null;
switch(expecting.length){
case 0:
break;
case 1:
sb = "";
if (-1 == expecting[0]) sb += "end of input";
else {
sb += "\"";
sb += String.fromCodePoint(expecting[0]);
sb += "\"";
}
break;
case 2:
sb = "";
if (-1 == expecting[0]) sb += "end of input";
else {
sb += "\"";
sb += String.fromCodePoint(expecting[0]);
sb += "\"";
}
sb += " or ";
if (-1 == expecting[1]) sb += "end of input";
else {
sb += "\"";
sb += String.fromCodePoint(expecting[1]);
sb += "\"";
}
break;
default:
sb = "";
if (-1 == expecting[0]) sb += "end of input";
else {
sb += "\"";
sb += String.fromCodePoint(expecting[0]);
sb += "\"";
}
const l = expecting.length - 1;
let i = 1;
for(; i < l; ++i){
sb += ", ";
if (-1 == expecting[i]) sb += "end of input";
else {
sb += "\"";
sb += String.fromCodePoint(expecting[1]);
sb += "\"";
}
}
sb += ", or ";
if (-1 == expecting[i]) sb += "end of input";
else {
sb += "\"";
sb += String.fromCodePoint(expecting[i]);
sb += "\"";
}
break;
}
if (-1 == this.codepoint) {
if (0 == expecting.length) return "Unexpected end of input";
return "Unexpected end of input. Expecting " + sb;
}
if (0 == expecting.length) return "Unexpected character \"" + String.fromCodePoint(this.codepoint) + "\" in input";
return "Unexpected character \"" + String.fromCodePoint(this.codepoint) + "\" in input. Expecting " + sb;
}
expecting(...values) {
const codepoints = _ParseContext._getCodepoints(values);
if (this.codepoint === -2) throw "The cursor is before the beginning of the input at " + this.position;
switch(codepoints.length){
case 0:
if (this.codepoint === -1) throw "Unexpected end of input at " + this.position;
break;
case 1:
if (codepoints[0] != this.codepoint) throw this._getErrorMessage(codepoints) + " at " + this.position;
break;
default:
if (!codepoints.includes(this.codepoint)) throw this._getErrorMessage(codepoints) + " at " + this.position;
break;
}
}
trySkipWhiteSpace() {
this.ensureStarted();
if (this.codepoint == -1) {
return false;
}
if (!FACharacterClasses.space.includes(this.codepoint)) {
return false;
}
this.advance();
while(this.codepoint != -1 && FACharacterClasses.space.includes(this.codepoint)){
this.advance();
}
return true;
}
tryReadDigits() {
this.ensureStarted();
if (this.codepoint == -1) {
return false;
}
if (!FACharacterClasses.digit.includes(this.codepoint)) {
return false;
}
this.capture();
this.advance();
while(this.codepoint != -1 && FACharacterClasses.digit.includes(this.codepoint)){
this.capture();
this.advance();
}
return true;
}
tryReadUntil(character, readCharacter = true) {
this.ensureStarted();
if (0 > character) character = -1;
this.capture();
if (this.codepoint === character) {
return true;
}
while(-1 != this.advance() && this.codepoint != character)this.capture();
if (this.codepoint == character) {
if (readCharacter) {
this.capture();
this.advance();
}
return true;
}
return false;
}
}
class _ExpEdge {
exp;
from;
to;
}
export class FADotGraphOptions {
dpi = 300;
statePrefix = "q";
debugString = null;
blockEnds = null;
debugSourceNfa = null;
debugShowNfa = false;
hideAcceptSymbolIds = false;
acceptSymbolNames = null;
vertical = false;
}
export class FAProgress {
_callback = null;
value = 0;
constructor(callback = null){
this._callback = callback;
}
report(value) {
this.value = value;
if (this._callback !== null) {
this._callback(value);
}
}
}
export class FARange {
min;
max;
constructor(min, max){
this.min = min;
this.max = max;
}
intersects(arg) {
let range;
let codepoint;
if (typeof arg === 'number') {
codepoint = arg;
return codepoint >= this.min && codepoint <= this.max;
}
range = arg;
return range.min >= this.min && range.min <= this.max || range.max >= this.min && range.max <= this.max;
}
static toUnpacked(packedRanges) {
const result = new Array(packedRanges.length / 2);
for(let i = 0; i < result.length; ++i){
const j = i * 2;
result[i] = new FARange(packedRanges[j], packedRanges[j + 1]);
}
return result;
}
static toPacked(pairs) {
const result = new Array(pairs.length * 2);
for(let ic = pairs.length, i = 0; i < ic; ++i){
var pair = pairs[i];
var j = i * 2;
result[j] = pair.min;
result[j + 1] = pair.max;
}
return result;
}
static *toNotRanges(ranges) {
let last = 0x10ffff;
const e = ranges[Symbol.iterator]();
let cur = e.next();
if (cur.done) {
yield new FARange(0x0, 0x10ffff);
return;
}
if (cur.value.min > 0) {
yield new FARange(0, cur.value.min - 1);
last = cur.value.max;
if (0x10ffff <= last) return;
} else if (cur.value.min == 0) {
last = cur.value.max;
if (0x10ffff <= last) return;
}
while(!cur.done){
if (0x10ffff <= last) return;
if (last + 1 < cur.value.min) yield new FARange(last + 1, cur.value.min - 1);
last = cur.value.max;
cur = e.next();
}
if (0x10ffff >= last) yield new FARange(last + 1, 0x10ffff);
}
}
export class FATransition {
min;
max;
to;
constructor(to, min = -1, max = -1){
this.min = min;
this.max = max;
this.to = to;
}
isEpsilon() {
return this.min == -1 || this.max == -1;
}
}
class _FListNode {
state = null;
stateList = null;
next = null;
prev = null;
constructor(q, sl){
this.state = q;
this.stateList = sl;
if (sl.count++ === 0) {
sl.first = this;
sl.last = this;
} else {
sl.last.next = this;
this.prev = sl.last;
sl.last = this;
}
}
remove() {
--this.stateList.count;
if (this.stateList.first === this) {
this.stateList.first = this.next;
} else {
this.prev.next = this.next;
}
if (this.stateList.last === this) {
this.stateList.last = this.prev;
} else {
this.next.prev = this.prev;
}
}
}
class _FList {
count = 0;
first = null;
last = null;
add(q) {
return new _FListNode(q, this);
}
}
class _FKeyPair {
key;
value;
constructor(key, value){
this.key = key;
this.value = value;
}
}
export class FA {
isCompact = true;
isDeterministic = true;
tag = -1;
acceptSymbol = -1;
id = -1;
transitions = [];
fromStates = null;
_minimizationTag = -1;
constructor(accept = -1){
this.acceptSymbol = accept;
}
fillClosure(result = []) {
if (result.includes(this)) {
return result;
}
result.push(this);
for (const transition of this.transitions){
const state = transition.to;
state.fillClosure(result);
}
return result;
}
fillEpsilonClosure(result = []) {
if (result.includes(this)) {
return result;
}
result.push(this);
for (const transition of this.transitions){
if (transition.isEpsilon()) {
const state = transition.to;
state.fillEpsilonClosure(result);
}
}
return result;
}
static fillEpsilonClosureStates(states, result = []) {
for (let state of states){
state.fillEpsilonClosure(result);
}
return result;
}
isAccepting() {
return this.acceptSymbol > -1;
}
addEpsilon(to, compact = true) {
if (to === undefined || to === null) {
throw "to was not set";
}
if (compact) {
if (this.acceptSymbol < 0 && to.acceptSymbol > -1) {
this.acceptSymbol = to.acceptSymbol;
}
for(let i = 0; i < to.transitions.length; ++i){
var fat = to.transitions[i];
if (!fat.isEpsilon()) {
this.addTransition(new FARange(fat.min, fat.max), fat.to);
} else {
this.addEpsilon(fat.to, true);
}
}
} else {
var found = false;
let i = 0;
for(; i < this.transitions.length; ++i){
var fat = this.transitions[i];
if (!fat.isEpsilon()) break;
if (fat.to === to) {
found = true;
break;
}
}
if (!found) {
this.transitions.splice(i, 0, new FATransition(to));
this.isCompact = false;
this.isDeterministic = false;
}
}
}
addTransition(range, to, compact = true) {
if (to === undefined || to === null) {
throw "to was not set";
}
if (range.min == -1 || range.max == -1) {
this.addEpsilon(to, compact);
return;
}
if (range.min > range.max) {
const tmp = range.min;
range.min = range.max;
range.max = tmp;
}
var insert = -1;
for(let i = 0; i < this.transitions.length; ++i){
const fat = this.transitions[i];
if (to === fat.to) {
if (range.min === fat.min && range.max == fat.max) {
return;
}
}
if (this.isDeterministic) {
if (range.intersects(new FARange(fat.min, fat.max))) {
this.isDeterministic = false;
}
}
if (range.max > fat.max) {
insert = i;
}
if (!this.isDeterministic && range.max < fat.min) {
break;
}
}
this.transitions.splice(insert + 1, 0, new FATransition(to, range.min, range.max));
}
static _crackSet(str, closure) {
const result = [];
if (str == "") {
return result;
}
const sa = str.split(" ");
for (const s of sa){
result.push(closure[Number.parseInt(s, 10)]);
}
return result;
}
static _makeSet(closure, states) {
let result = "";
let delim = "";
let ns = [];
for (const fa of states){
const idx = closure.indexOf(fa);
ns.push(idx);
}
ns.sort((x, y)=>x - y);
for (const i of ns){
result += delim + i.toString(10);
delim = " ";
}
return result;
}
static _determinize(target, progress = null) {
if (progress === null) {
progress = new FAProgress();
}
let prog = 0;
progress.report(0);
const closure = target.fillClosure();
const p = new Set();
for (const ffa of closure){
p.add(0);
for (const t of ffa.transitions){
p.add(t.min);
if (t.max < 0x10ffff) {
p.add(t.max + 1);
}
}
}
const points = [
...p
];
points.sort((x, y)=>x - y);
++prog;
progress.report(prog);
const sets = new Map();
const working = [];
const dfaMap = new Map();
const initStates = closure[0].fillEpsilonClosure();
let initial = FA._makeSet(closure, initStates);
sets.set(initial, new Set(initStates));
working.push(initial);
const result = new FA();
result.isDeterministic = true;
result.fromStates = initStates;
result.acceptSymbol = FA.getFirstAcceptSymbol(initStates);
dfaMap.set(initial, result);
while(working.length > 0){
const s = working[0];
working.shift();
const dfa = dfaMap.get(s);
const crackedS1 = FA._crackSet(s, closure);
for (const q of crackedS1){
if (q.isAccepting()) {
dfa.acceptSymbol = q.acceptSymbol;
break;
}
}
let i = 0;
for (const pnt of points){
const set = new Set();
for (const c of crackedS1){
const ecs = c.fillEpsilonClosure();
for (const efa of ecs){
for (let trns of efa.transitions){
if (!trns.isEpsilon()) {
if (trns.min <= pnt && pnt <= trns.max) {
for (const eefa of trns.to.fillEpsilonClosure()){
set.add(eefa);
}
}
}
}
}
}
const skey = FA._makeSet(closure, set);
if (!sets.has(skey)) {
sets.set(skey, set);
working.push(skey);
let newFa = new FA();
newFa.isDeterministic = true;
newFa.isCompact = true;
newFa.fromStates = Array.from(set.values());
dfaMap.set(skey, newFa);
}
const dst = dfaMap.get(skey);
const first = pnt;
let last;
if (i + 1 < points.length) {
last = points[i + 1] - 1;
} else {
last = 0x10ffff;
}
dfa.transitions.push(new FATransition(dst, first, last));
++i;
}
++prog;
progress.report(prog);
}
for (const ffa of result.fillClosure()){
const itrns = [
...ffa.transitions
];
for (const trns of itrns){
const acc = trns.to.fillClosure().filter((value, index, array)=>value.isAccepting());
if (acc.length == 0) {
ffa.transitions.splice(ffa.transitions.indexOf(trns), 1);
}
}
++prog;
progress.report(prog);
}
++prog;
progress.report(prog);
return result;
}
isDfa() {
for (const ffa of this.fillClosure()){
if (!ffa.isDeterministic) {
return false;
}
}
return true;
}
toDfa(progress = null) {
return FA._determinize(this, progress);
}
totalize(closure = null) {
if (closure === null) {
closure = this.fillClosure();
}
const s = new FA();
s.transitions.push(new FATransition(s, 0, 0x10ffff));
for (const p of closure){
let maxi = 0;
const sortedTrans = [
...p.transitions
];
sortedTrans.sort((x, y)=>{
let c = x.max - y.max;
if (0 != c) return c;
return x.min - y.min;
});
for (const t of sortedTrans){
if (!t.isEpsilon()) {
if (t.min > maxi) {
p.transitions.push(new FATransition(s, maxi, t.min - 1));
}
if (t.max + 1 > maxi) {
maxi = t.max + 1;
}
}
}
if (maxi <= 0x10ffff) {
p.transitions.push(new FATransition(s, maxi, 0x10ffff));
}
}
}
_step(input) {
for(let ic = this.transitions.length, i = 0; i < ic; ++i){
var t = this.transitions[i];
if (input >= t.min && input <= t.max) return t.to;
}
return null;
}
static _minimize(a, progress) {
let prog = 0;
if (progress === null) {
progress = new FAProgress();
}
progress.report(prog);
a = a.toDfa(progress);
const tr = a.transitions;
if (tr.length == 1) {
const t = tr[0];
if (t.to === a && t.min == 0 && t.max == 0x10ffff) {
return a;
}
}
a.totalize();
++prog;
progress.report(prog);
const cl = a.fillClosure();
const states = new Array();
let mtag = 0;
for (const q of cl){
q._minimizationTag = mtag;
states.push(q);
++mtag;
}
let pp = [];
for(let ic = cl.length, i = 0; i < ic; ++i){
const ffa = cl[i];
pp.push(0);
for (const t of ffa.transitions){
pp.push(t.min);
if (t.max < 0x10ffff) {
pp.push(t.max + 1);
}
}
}
const sigma = new Array();
for(let i = 0; i < pp.length; ++i){
sigma.push(pp[i]);
}
sigma.sort();
const reverse = new Array();
for (const s of states){
const arr = new Array(sigma.length);
arr.fill(null, 0, arr.length - 1);
reverse.push(arr);
}
++prog;
progress.report(prog);
const reverseNonempty = Array();
for(let i = 0; i < states.length; ++i){
const arr = new Array(sigma.length);
arr.fill(false, 0, arr.length - 1);
reverseNonempty.push(arr);
}
const partition = new Array(states.length);
partition.fill(null, 0, partition.length - 1);
++prog;
progress.report(prog);
const block = new Array(states.length);
const active = new Array();
for(let i = 0; i < states.length; ++i){
const arr = new Array(sigma.length);
arr.fill(null, 0, arr.length - 1);
active.push(arr);
}
const active2 = new Array();
for(let i = 0; i < states.length; ++i){
const arr = new Array(sigma.length);
arr.fill(null, 0, arr.length - 1);
active2.push(arr);
}
const pending = new Array();
const pending2 = Array();
for(let i = 0; i < sigma.length; ++i){
const arr = new Array(states.length);
arr.fill(false, 0, arr.length - 1);
pending2.push(arr);
}
let split = new Array();
const split2 = new Array(states.length);
split2.fill(false, 0, split2.length - 1);
let refine = new Array();
const refine2 = new Array(states.length);
split2.fill(false, 0, refine2.length - 1);
const splitBlock = new Array(states.length);
splitBlock.fill(null, 0, splitBlock.length - 1);
++prog;
progress.report(prog);
for(let q = 0; q < states.length; ++q){
splitBlock[q] = new Array();
partition[q] = new Array();
for(let x = 0; x < sigma.length; ++x){
reverse[q][x] = new Array();
active[q][x] = new _FList();
}
}
for (const qq of states){
const j = qq.isAccepting() ? 0 : 1;
partition[j].push(qq);
block[qq._minimizationTag] = j;
for(let x = 0; x < sigma.length; ++x){
const y = sigma[x];
const p = qq._step(y);
const pn = p._minimizationTag;
if (reverse[pn] !== null && reverse[pn][x] !== null) {
reverse[pn][x].push(qq);
}
reverseNonempty[pn][x] = true;
}
++prog;
progress.report(prog);
}
for(let j = 0; j <= 1; ++j){
for(let x = 0; x < sigma.length; ++x){
const part = partition[j];
for (const qq of part){
if (reverseNonempty[qq._minimizationTag][x] === true) {
active2[qq._minimizationTag][x] = active[j][x].add(qq);
}
}
}
++prog;
progress.report(prog);
}
for(let x = 0; x < sigma.length; ++x){
const a0 = active[0][x].count;
const a1 = active[1][x].count;
const j = a0 <= a1 ? 0 : 1;
pending.push(new _FKeyPair(j, x));
pending2[x][j] = true;
}
let k = 2;
while(pending.length > 0){
const ip = pending.shift();
const p = ip.key;
const x = ip.value;
pending2[x][p] = false;
for(let m = active[p][x].first; m !== null; m = m.next){
for (const s of reverse[m.state._minimizationTag][x]){
if (!split2[s._minimizationTag]) {
split2[s._minimizationTag] = true;
split.push(s);
const j = block[s._minimizationTag];
splitBlock[j].push(s);
if (refine2[j] !== true) {
refine2[j] = true;
refine.push(j);
}
}
}
}
++prog;
progress.report(prog);
for (const j of refine){
if (splitBlock[j].length < partition[j].length) {
const b1 = partition[j];
const b2 = partition[k];
const e = splitBlock[j];
for (const s of e){
b1.splice(b1.indexOf(s), 1);
b2.push(s);
block[s._minimizationTag] = k;
for(let c = 0; c < sigma.length; ++c){
const sn = active2[s._minimizationTag][c];
if (sn !== null && sn !== undefined && sn.stateList === active[j][c]) {
sn.remove();
active2[s._minimizationTag][c] = active[k][c].add(s);
}
}
}
for(let c = 0; c < sigma.length; ++c){
const aj = active[j][c].count;
const ak = active[k][c].count;
if (!pending2[c][j] && 0 < aj && aj <= ak) {
pending2[c][j] = true;
pending.push(new _FKeyPair(j, c));
} else {
pending2[c][k] = true;
pending.push(new _FKeyPair(k, c));
}
}
++k;
}
const sbj = splitBlock[j];
for (const s of sbj){
split2[s._minimizationTag] = false;
}
refine2[j] = false;
splitBlock[j].length = 0;
++prog;
progress.report(prog);
}
split.length = 0;
refine.length = 0;
}
++prog;
progress.report(prog);
const newstates = new Array();
for(let n = 0; n < k; ++n){
const s = new FA();
s.isDeterministic = true;
newstates.push(s);
const pn = partition[n];
for (const q of pn){
if (q === a) {
a = s;
}
s.id = q.id;
s.acceptSymbol = q.acceptSymbol;
s._minimizationTag = q._minimizationTag;
q._minimizationTag = n;
}
++prog;
progress.report(prog);
}
for (const s of newstates){
const st = states[s._minimizationTag];
s.acceptSymbol = st.acceptSymbol;
for (const t of st.transitions){
s.transitions.push(new FATransition(newstates[t.to._minimizationTag], t.min, t.max));
}
++prog;
progress.report(prog);
}
for (const ffa of a.fillClosure()){
const itrns = new Array(...ffa.transitions);
ffa.transitions = new Array();
for (const trns of itrns){
if (!trns.to.isTrap()) {
ffa.transitions.push(trns);
}
}
}
return a;
}
toMinimizedDfa(progress = null) {
return FA._minimize(this, progress);
}
clone() {
const result = [];
const closure = this.fillClosure();
for(let j = 0; j < closure.length; ++j){
result.push(new FA());
}
let i = 0;
for (const ffa of closure){
result[i].isCompact = ffa.isCompact;
result[i].isDeterministic = ffa.isDeterministic;
result[i].acceptSymbol = ffa.acceptSymbol;
result[i].tag = ffa.tag;
for (const trns of ffa.transitions){
result[i].transitions.push(new FATransition(result[closure.indexOf(trns.to)], trns.min, trns.max));
}
++i;
}
return result[0];
}
static _toExpressionFillEdgesIn(edges, node) {
const result = new Array();
for(let i = 0; i < edges.length; ++i){
const edge = edges[i];
if (edge.to === node) {
result.push(edge);
}
}
return result;
}
static _toExpressionFillEdgesOut(edges, node) {
const result = new Array();
for(let i = 0; i < edges.length; ++i){
const edge = edges[i];
if (edge.from === node) {
result.push(edge);
}
}
return result;
}
static _toExpressionOrJoin(strings) {
if (strings.length == 0) return "";
if (strings.length == 1) return strings[0];
return "(" + strings.join("|") + ")";
}
static _toExpressionKleeneStar(sb, s, noWrap) {
if (s === undefined || s === null || s.length == 0) return "";
if (noWrap || s.length == 1) {
sb += s;
sb += "*";
return;
}
sb += "(";
sb += s;
sb += ")*";
}
static _toExpressionFillEdgesOrphanState(edges, node) {
const result = new Array();
for(let i = 0; i < edges.length; ++i){
var edge = edges[i];
if (edge.from === node || edge.to === node) {
continue;
}
result.push(edge);
}
return result;
}
static _toExpression(fa) {
const closure = new Array();
let fsmEdges = new Array();
let first, final = null;
first = fa;
let acc = first.fillClosure().filter((elem)=>elem.isAccepting());
if (acc.length == 1) {
final = acc[0];
} else if (acc.length > 1) {
fa = fa.clone();
first = fa;
acc = fa.fillClosure().filter((elem)=>elem.isAccepting());
final = new FA(acc[0].acceptSymbol);
for(let i = 0; i < acc.length; ++i){
let a = acc[i];
a.addEpsilon(final, false);
a.acceptSymbol = -1;
}
}
closure.length = 0;
first.fillClosure(closure);
let sb = "";
var trnsgrp = new Map();
for(let q = 0; q < closure.length; ++q){
var cfa = closure[q];
trnsgrp.clear();
for (const trns of cfa.fillInputTransitionRangesGroupedByState(true, trnsgrp)){
sb = "";
if (trns[1].length == 1 && trns[1][0].min == trns[1][0].max) {
const range = trns[1][0];
if (range.max == -1 || range.min == -1) {
var eedge = new _ExpEdge();
eedge.exp = "";
eedge.from = cfa;
eedge.to = trns[0];
fsmEdges.push(eedge);
continue;
}
sb += FA._appendCharTo(String.fromCodePoint(range.min));
} else {
sb += "[";
sb += FA._appendRangeTo(trns[1]);
sb += "]";
}
var edge = new _ExpEdge();
edge.exp = sb;
edge.from = cfa;
edge.to = trns[0];
fsmEdges.push(edge);
}
}
let tmp = new FA();
tmp.addEpsilon(first, false);
const q0 = first;
first = tmp;
tmp = new FA(final.acceptSymbol);
const qLast = final;
final.acceptSymbol = -1;
final.addEpsilon(tmp, false);
final = tmp;
let newEdge = new _ExpEdge();
newEdge.exp = "";
newEdge.from = first;
newEdge.to = q0;
fsmEdges.push(newEdge);
newEdge = new _ExpEdge();
newEdge.exp = "";
newEdge.from = qLast;
newEdge.to = final;
fsmEdges.push(newEdge);
closure.splice(0, 0, first);
closure.push(final);
let inEdges = new Array();
inEdges.fill(null, 0, fsmEdges.length - 1);
let outEdges = new Array();
outEdges.fill(null, 0, fsmEdges.length - 1);
while(closure.length > 2){
var node = closure[1];
var loops = new Array();
inEdges.length = 0;
inEdges = FA._toExpressionFillEdgesIn(fsmEdges, node);
for(let i = 0; i < inEdges.length; ++i){
var edge = inEdges[i];
if (edge.from === edge.to) {
loops.push(edge.exp);
}
}
sb = FA._toExpressionKleeneStar(sb, FA._toExpressionOrJoin(loops), loops.length > 1);
const middle = sb;
for(let i = 0; i < inEdges.length; ++i){
var inEdge = inEdges[i];
if (inEdge.from == inEdge.to) {
continue;
}
outEdges.length = 0;
outEdges = FA._toExpressionFillEdgesOut(fsmEdges, node);
for(let j = 0; j < outEdges.length; ++j){
var outEdge = outEdges[j];
if (outEdge.from === outEdge.to) {
continue;
}
var expEdge = new _ExpEdge();
expEdge.from = inEdge.from;
expEdge.to = outEdge.to;
sb = "";
sb += inEdge.exp;
sb += middle;
sb += outEdge.exp;
expEdge.exp = sb;
fsmEdges.push(expEdge);
}
}
inEdges = FA._toExpressionFillEdgesOrphanState(fsmEdges, node);
fsmEdges.length = 0;
fsmEdges.push(...inEdges);
closure.splice(closure.indexOf(node), 1);
}
sb = "";
if (fsmEdges.length == 1) {
return fsmEdges[0].exp;
}
if (fsmEdges.length > 1) {
sb += "(";
sb += fsmEdges[0].exp;
for(let i = 1; i < fsmEdges.length; ++i){
sb += "|";
sb += fsmEdges[i].exp;
}
sb += ")";
}
return sb;
}
toString(format, options = null) {
if (format.toLowerCase() === "d") {
if (options != null && options.debugSourceNfa != null && options.debugShowNfa) {
return this._buildCompoundDot(this.fillClosure(), options);
} else {
return this._buildDot(this.fillClosure(), options, -1);
}
} else if (format.toLowerCase() == "e") {
return FA._toExpression(this);
} else {
if (this.id < 0) {
return "[FA]";
} else {
return "q" + this.id.toString();
}
}
}
setIds() {
let i = 0;
for (const fa of this.fillClosure()){
fa.id = i;
++i;
}
}
static literal(codepoints, accept = 0, compact = true) {
if (typeof codepoints == "string") {
codepoints = this.toUtf32(codepoints);
}
const result = new FA();
let current = result;
for (const cp of codepoints){
current.acceptSymbol = -1;
const newFa = new FA();
newFa.acceptSymbol = accept;
current.addTransition(new FARange(cp, cp), newFa, compact);
current = newFa;
}
return result;
}
static set(ranges, accept = 0, compact = true) {
const result = new FA();
const final = new FA();
final.acceptSymbol = accept;
for (const range of [
...ranges
].sort((x, y)=>x.max - y.max)){
result.addTransition(range, final, compact);
}
return result;
}
static concat(exprs, accept = 0, compact = true) {
let result = null;
let left = null;
let right = null;
for (const expr of exprs){
let nval = expr.clone();
if (null === left) {
if (null === result) {
result = nval;
}
left = nval;
continue;
}
if (null === right) {
right = nval;
}
nval = right.clone();
FA._concat(left, nval, compact);
}
const target = null !== right ? right : result;
const acc = target.fillClosure().filter((value, index, array)=>value.isAccepting());
for (const afa of acc){
afa.acceptSymbol = accept;
}
return result;
}
static or(exprs, accept = 0, compact = true) {
const result = new FA();
const final = new FA();
final.acceptSymbol = accept;
for (const expr of exprs){
const nfa = expr.clone();
const nacc = nfa.fillClosure().filter((value, index, array)=>value.isAccepting());
for (const afa of nacc){
afa.acceptSymbol = -1;
afa.addEpsilon(final, compact);
}
result.addEpsilon(nfa, compact);
}
return result;
}
static optional(expr, accept = 0, compact = true) {
const result = expr.clone();
const acc = result.fillClosure().filter((value, index, array)=>value.isAccepting());
for (const afa of acc){
afa.acceptSymbol = accept;
result.addEpsilon(afa, compact);
}
return result;
}
static repeat(expr, minOccurs = -1, maxOccurs = -1, accept = 0, compact = true) {
expr = expr.clone();
if (minOccurs > 0 && maxOccurs > 0 && minOccurs > maxOccurs) {
throw Error("Minimum is greater than maximum");
}
let result;
switch(minOccurs){
case -1:
case 0:
switch(maxOccurs){
case -1:
case 0:
result = new FA();
result.acceptSymbol = accept;
result.addEpsilon(expr, compact);
for (const afa of expr.fillClosure()){
if (afa.isAccepting()) {
afa.acceptSymbol = -1;
afa.addEpsilon(result, compact);
}
}
return result;
case 1:
result = this.optional(expr, accept, compact);
return result;
default:
const l = [];
expr = this.optional(expr, accept, compact);
l.push(expr);
for(let i = 1; i < maxOccurs; ++i){
l.push(expr.clone());
}
result = this.concat(l, accept, compact);
return result;
}
case 1:
switch(maxOccurs){
case -1:
case 0:
result = this.concat([
expr,
FA.repeat(expr, 0, 0, accept, compact)
], accept, compact);
return result;
case 1:
return expr;
default:
result = this.concat([
expr,
FA.repeat(expr, 0, maxOccurs - 1, accept, compact)
], accept, compact);
return result;
}
default:
switch(maxOccurs){
case -1:
case 0:
result = this.concat([
FA.repeat(expr, minOccurs, minOccurs, accept, compact),
FA.repeat(expr, 0, 0, accept, compact)
], accept, compact);
return result;
case 1:
throw new Error("Should never get here");
default:
if (minOccurs == maxOccurs) {
const l = [];
expr = this.optional(expr, accept, compact);
l.push(expr);
for(let i = 1; i < maxOccurs; ++i){
l.push(expr.clone());
}
result = this.concat(l, accept, compact);
return result;
}
result = this.concat([
this.repeat(expr, minOccurs, minOccurs, accept, compact),
FA.repeat(FA.optional(expr, accept, compact), maxOccurs - minOccurs, maxOccurs - minOccurs, accept, compact)
], accept, compact);
return result;
}
}
}
run(value, blockEnds = null) {
const result = new FAStringStateRunner(this, blockEnds);
result.set(value);
return result;
}
static runDfa(value, dfa, blockEnds = null) {
const result = new FAStringDfaTableRunner(dfa, blockEnds);
result.set(value);
return result;
}
isNeutral() {
return !this.isAccepting && this.transitions.length == 1 && this.transitions[0].isEpsilon();
}
isFinal() {
return this.transitions.length == 0;
}
isTrap() {
if (this.isAccepting()) {
return false;
}
for (const ffa of this.fillClosure()){
if (ffa.isAccepting()) {
return false;
}
}
return true;
}
fillInputTransitionRangesGroupedByState(includeEpsilonTransitions = false, result = null) {
if (result === null) {
result = new Map();
}
for (const fat of this.transitions){
if (includeEpsilonTransitions || !fat.isEpsilon()) {
const res = result.get(fat.to);
if (res === undefined) {
const ndata = [
new FARange(fat.min, fat.max)
];
result.set(fat.to, ndata);
} else {
res.push(new FARange(fat.min, fat.max));
}
}
}
for (const values of result.values()){
values.sort((x, y)=>{
var c = x.min - y.min;
if (0 != c) return c;
return x.max - y.max;
});
}
return result;
}
toArray() {
const fa = this;
const result = [];
const closure = fa.fillClosure();
const stateIndices = [];
for(let i = 0; i < closure.length; ++i){
const cfa = closure[i];
stateIndices.push(result.length);
result.push(cfa.isAccepting() ? cfa.acceptSymbol : -1);
const itrgp = cfa.fillInputTransitionRangesGroupedByState();
result.push(itrgp.size);
for (const itr of itrgp.entries()){
result.push(closure.indexOf(itr[0]));
result.push(itr[1].length);
result.push(...FARange.toPacked(itr[1]));
}
}
let state = 0;
while(state < result.length){
++state;
const tlen = result[state++];
for(let i = 0; i < tlen; ++i){
result[state] = stateIndices[result[state]];
++state;
const prlen = result[state++];
state += prlen * 2;
}
}
return result;
}
static fromArray(fa) {
if (fa.length == 0) {
return new FA();
}
let si = 0;
const states = new Map();
while(si < fa.length){
const newFa = new FA();
states.set(si, newFa);
newFa.acceptSymbol = fa[si++];
const tlen = fa[si++];
for(let i = 0; i < tlen; ++i){
++si;
const prlen = fa[si++];
si += prlen * 2;
}
}
si = 0;
while(si < fa.length){
var state = states.get(si);
++si;
const tlen = fa[si++];
for(let i = 0; i < tlen; ++i){
const tto = fa[si++];
const to = states.get(tto);
const prlen = fa[si++];
for(let j = 0; j < prlen; ++j){
state.addTransition(new FARange(fa[si++], fa[si++]), to);
}
}
}
return states.get(0);
}
move(codepoint) {
if (!this.isDeterministic) {
throw "The state machine must be deterministic";
}
for(let i = 0; i < this.transitions.length; ++i){
const fat = this.transitions[i];
if (codepoint < fat.min) {
return null;
}
if (codepoint <= fat.max) {
return fat.to;
}
}
return null;
}
static fillMove(states, codepoint, result = []) {
for (const ffa of states){
for (const fat of ffa.transitions){
if (!fat.isEpsilon() && codepoint >= fat.min && codepoint <= fat.max) {
fat.to.fillEpsilonClosure(result);
}
}
}
return result;
}
static getFirstAcceptSymbol(states) {
for (const fa of states){
if (fa.isAccepting()) {
return fa.acceptSymbol;
}
}
return -1;
}
static _concat(lhs, rhs, compact) {
const acc = lhs.fillClosure().filter((value, index, array)=>value.isAccepting());
for (const afa of acc){
afa.acceptSymbol = -1;
afa.addEpsilon(rhs, compact);
}
}
static *toUtf32(str) {
for (const character of str){
let cp = character.codePointAt(0);
if (cp >= 0xD800 && cp <= 0xDBFF) {
const cpl = character.codePointAt(1);
if (!(cpl >= 0xDC00 && cpl <= 0xDFFF)) {
throw new Error("Unicode stream error. Unterminated high surrogate");
}
const highValue = cp & 0b11_11111111;
const lowValue = cpl & 0b11_11111111;
const magicAdd = 0b1_00000000_00000000;
cp = highValue << 10 | lowValue + magicAdd;
}
yield cp;
}
}
static *_invertRanges(ranges) {
if (ranges == null) {
return;
}
let last = 0x10ffff;
let e = ranges[Symbol.iterator]();
let cur = e.next();
if (cur.done) {
yield new FARange(0, 0x10ffff);
return;
}
if (cur.value.min > 0) {
yield new FARange(0, cur.value.min - 1);
last = cur.value.max;
if (0x10ffff <= last) return;
} else if (cur.value.min == 0) {
last = cur.value.max;
if (0x10ffff <= last) return;
}
cur = e.next();
while(!cur.done){
if (0x10ffff <= last) return;
if (last + 1 < cur.value.min) {
yield new FARange(last + 1, cur.value.min - 1);
}
last = cur.value.max;
cur = e.next();
}
if (0x10ffff > last) {
yield new FARange(last + 1, 0x10ffff);
}
}
static _appendRangeTo(ranges, index = -1) {
let result = "";
if (index === -1) {
for(let i = 0; i < ranges.length; ++i){
result += FA._appendRangeTo(ranges, i);
}
return result;
}
var first = ranges[index].min;
var last = ranges[index].max;
result += FA._appendRangeCharTo(String.fromCodePoint(first));
if (last === first) return result;
if (last === first + 1) {
result += FA._appendRangeCharTo(String.fromCodePoint(last));
return result;
} else if (last === first + 2) {
result += FA._appendRangeCharTo(String.fromCodePoint(first + 1));
result += FA._appendRangeCharTo(String.fromCodePoint(last));
return result;
}
result += "-";
result += FA._appendRangeCharTo(String.fromCodePoint(last));
return result;
}
static _appendCharTo(ch) {
let result = "";
switch(ch){
case '.':
case '[':
case ']':
case '^':
case '-':
case '+':
case '?':
case '(':
case ')':
case '\\':
result += '\\';
result += ch;
break;
case '\t':
result += "\\t";
break;
case '\n':
result += "\\n";
break;
case '\r':
result += "\\r";
break;
case '\0':
result += "\\0";
break;
case '\f':
result += "\\f";
break;
case '\v':
result += "\\v";
break;
case '\b':
result += "\\b";
break;
default:
const s = ch;
const isletter = s.toLowerCase() != s.toUpperCase();
const isdigit = !isletter && s >= '0' && s <= '9';
const issym = !isletter && !isdigit && ",._-<>/\\=+~`!@#$%^&*(){}[]\"\';:?".indexOf(s) > -1;
if (!isletter && !isdigit && !issym) {
if (s.length == 1) {
result += "\\u";
const d = s.codePointAt(0);
result += ("0000" + (+d).toString(16)).slice(-4);
} else {
result += "\\U";
const d = s.codePointAt(0);
result += ("00000000" + (+d).toString(16)).slice(-8);
}
} else {
result += s;
}
break;
}
return result;
}
static _appendRangeCharTo(ch) {
let result = "";
switch(ch){
case '.':
case '[':
case ']':
case '^':
case '-':
case '(':
case ')':
case '{':
case '}':
case '\\':
result += '\\';
result += ch;
break;
case '\t':
result += "\\t";
break;
case '\n':
result += "\\n";
break;
case '\r':
result += "\\r";
break;
case '\0':
result += "\\0";
break;
case '\f':
result += "\\f";
break;
case '\v':
result += "\\v";
break;
case '\b':
result += "\\b";
break;
default:
const s = ch;
const isletter = s.toLowerCase() != s.toUpperCase();
const isdigit = !isletter && s >= '0' && s <= '9';
const issym = !isletter && !isdigit && ",._-<>/\\=+~`!@#$%^&*(){}[]\"\';:?".indexOf(s) > -1;
if (!isletter && !isdigit && !issym) {
if (s.length == 1) {
result += "\\u";
const d = s.codePointAt(0);
result += ("0000" + (+d).toString(16)).slice(-4);
} else {
result += "\\U";
const d = s.codePointAt(0);
result += ("00000000" + (+d).toString(16)).slice(-8);
}
} else result += s;
break;
}
return result;
}
static _escapeLabel(label) {
if (label === null || label.length == 0) return label;
let result = label.replace("\\", "\\\\");
result = result.replace("\"", "\\\"");
result = result.replace("\n", "\\n");
result = result.replace("\r", "\\r");
result = result.replace("\0", "\\0");
result = result.replace("\v", "\\v");
result = result.replace("\t", "\\t");
result = result.replace("\f", "\\f");
return result;
}
_buildDot(closure, options, clusterIndex) {
let result = "";
if (options === null) {
options = new FADotGraphOptions();
}
const hasBlockEnds = options.debugShowNfa === false && options.debugString === null && options.blockEnds !== null;
const spfx = options.statePrefix === null ? "q" : options.statePrefix;
let pfx = "";
if (clusterIndex !== -1) {
result += "subgraph cluster_" + clusterIndex.toString(10) + " {\n";
pfx = "c" + clusterIndex.toString(10);
} else {
result += "digraph FA {\n";
}
if (!options.vertical) {
result += "rankdir=LR\n";
}
result += "node [shape=circle]\n";
let accepting = [];
let finals = [];
let neutrals = [];
for(let i = 0; i < closure.length; ++i){
let ffa = closure[i];
if (ffa.isAccepting()) {
accepting.push(ffa);
} else if (ffa.isNeutral()) {
neutrals.push(ffa);
} else if (ffa.isFinal()) {
finals.push(ffa);
}
}
let fromStates = null;
let toStates = null;
let tchar = -1;
if (options.debugString != null) {
for (let ch of FA.toUtf32(options.debugString)){
if (fromStates === null) {
fromStates = [];
closure[0].fillEpsilonClosure(fromStates);
} else {
fromStates = toStates;
}
tchar = ch;
toStates = FA.fillMove(fromStates, ch);
if (0 == toStates.length) {
break;
}
}
}
if (fromStates == null) {
fromStates = [];
closure[0].fillEpsilonClosure(fromStates);
}
if (toStates != null) {
toStates = FA.fillEpsilonClosureStates(toStates);
}
let i = 0;
for (const ffa of closure){
const isfrom = fromStates !== null && FA.fillEpsilonClosureStates(fromStates).includes(ffa);
const rngGrps = ffa.fillInputTransitionRangesGroupedByState();
for (const rngGrp of rngGrps){
const istrns = isfrom && toStates !== null && options.debugString !== null && toStates.includes(rngGrp[0]);
const di = closure.indexOf(rngGrp[0]);
result += pfx + spfx;
result += i.toString(10);
result += "->";
result += pfx + spfx;
result += di.toString(10);
result += " [label=\"";
let sb;
let notRanges = Array.from(FA._invertRanges(rngGrp[1]));
if (notRanges.length > rngGrp[1].length) {
sb = FA._appendRangeTo(rngGrp[1]);
} else {
result += "^";
sb = FA._appendRangeTo(notRanges);
}
if (sb.length != 1 || sb === " ") {
result += '[';
if (sb.length > 16) {
sb = sb.substring(0, 16);
sb += "...";
}
result += FA._escapeLabel(sb);
result += "]";
} else {
result += FA._escapeLabel(sb);
}
if (!istrns) {
result += "\"]\n";
} else {
result += "\",color=green]\n";
}
}
for (const fat of ffa.transitions){
if (fat.isEpsilon()) {
var istrns = null != toStates && options.debugString != null && toStates.includes(ffa) && toStates.includes(fat.to);
result += pfx + spfx;
result += i.toString(10);
result += "->";
result += pfx + spfx;
result += closure.indexOf(fat.to).toString(10);
if (!istrns) {
result += " [style=dashed,color=gray]\n";
} else {
result += " [style=dashed,color=green]\n";
}
}
}
if (hasBlockEnds && ffa.isAccepting && options.blockEnds?.length > ffa.acceptSymbol && options.blockEnds[ffa.acceptSymbol] !== null) {
result += pfx + spfx + i.toString(10) + "->";
result += pfx + "blockEnd" + ffa.acceptSymbol.toString(10) + spfx + "0";
result += " [style=dashed,label=\".*?\"]\n";
}
++i;
}
let delim;
if (hasBlockEnds) {
for(i = 0; i < options.blockEnds?.length; ++i){
const bfa = options.blockEnds[i];
if (bfa !== null) {
const bclose = bfa.fillClosure();
delim = "";
for(let qi = 0; qi < bclose.length; ++qi){
const cbfa = bclose[qi];
const rngGrps = cbfa.fillInputTransitionRangesGroupedByState();
for (const rngGrp of rngGrps){
const di = bclose.indexOf(rngGrp[0]);
result += pfx + "blockEnd" + i.toString(10) + spfx + qi.toString(10);
result += "->";
result += pfx + "blockEnd" + i.toString(10) + spfx + di.toString(10);
result += " [label=\"";
let sb = FA._appendRangeTo(rngGrp[1]);
if (sb.length != 1 || sb === " ") {
result += "[";
if (sb.length > 16) {
sb = sb.substring(0, 16);
sb += "...";
}
result += FA._escapeLabel(sb);
result += "]";
} else {
result += FA._escapeLabel(sb);
}
result += "\"]\n";
}
for (const fat of cbfa.transitions){
if (fat.isEpsilon()) {
result += "pfx" + "blockEnd" + i.toString(10) + spfx + qi.toString(10);
result += "->";
const di = bclose.indexOf(fat.to);
result += "pfx" + "blockEnd" + i.toString(10) + spfx + di.toString(10);
result += " [style=dashed,color=gray]\n";
}
}
}
for(let qi = 0; qi < bclose.length; ++qi){
const cbfa = bclose[qi];
result += pfx + "blockEnd" + i.toString(10) + spfx + qi.toString(10) + " [label=<";
result += "<TABLE BORDER=\"0\"><TR><TD>";
result += "(be)" + spfx;
result += "<SUB>";
result += qi.toString(10);
result += "</SUB></TD></TR>";
if (cbfa.isAccepting() && !options.hideAcceptSymbolIds) {
result += "<TD><TD>";
let acc = null;
if (options.acceptSymbolNames != null && options.acceptSymbolNames.length > i) {
acc = options.acceptSymbolNames[i];
}
if (acc === null) {
acc = i.toString(10);
}
result += acc.replace("\"", "&quot;");
result += "</TD></TR>";
}
result += "</TABLE>";
result += ">";
if (cbfa.isAccepting()) {
result += ",shape=doublecircle";
} else if (cbfa.isFinal() || cbfa.isNeutral()) {
result += ",color=gray";
}
result += "]";
}
}
}
}
delim = "";
i = 0;
for (const ffa of closure){
result += pfx + spfx;
result += i.toString(10);
result += " [";
if (options.debugString !== null) {
if (toStates !== null) {
const epstates = FA.fillEpsilonClosureStates(toStates, null);
if (epstates.includes(ffa)) {
if (!toStates.includes(ffa)) {
result += "color=darkgreen,";
} else {
result += "color=greeen,";
}
}
}
}
result += "label=<";
result += "<TABLE BORDER=\"0\"><TR><TD>";
result += spfx;
result += "<SUB>";
result += i.toString(10);
result += "</SUB></TD></TR>";
if (options.debugSourceNfa !== null) {
const from = ffa.fromStates;
let brk = Math.floor(Math.sqrt(from.length));
if (from.length <= 3) brk = 3;
for(let j = 0; j < from.length; ++j){
if (j === 0) {
result += "<TR><TD>";
result += "{ ";
delim = "";
} else if (j % brk == 0) {
delim = "";
result += "</TD></TR><TR><TD>";
}
const fromFa = from[j];
result += delim;
result += "q<SUB>";
result += options.debugSourceNfa.fillClosure().indexOf(fromFa).toString(10);
result += "</SUB>";
delim = " ";
if (j === from.length - 1) {
result += " }";
result += "</TD></TR>";
}
}
}
if (ffa.isAccepting() && !options.hideAcceptSymbolIds && !(hasBlockEnds && options.blockEnds?.length > ffa.acceptSymbol && options.blockEnds[ffa.acceptSymbol] !== null)) {
result += "<TR><TD>";
let acc = null;
if (options.acceptSymbolNames !== null && options.acceptSymbolNames.length > ffa.acceptSymbol) {
acc = options.acceptSymbolNames[ffa.acceptSymbol];
}
if (acc === null) {
acc = ffa.acceptSymbol.toString(10);
}
result += acc.replace("\"", "&quot;");
result += "</TD></TR>";
}
result += "</TABLE>";
result += ">";
let isFinal = false;
if (accepting.includes(ffa) && (!hasBlockEnds || options.blockEnds?.length <= ffa.acceptSymbol || options.blockEnds[ffa.acceptSymbol] === null)) {
result += ",shape=doublecircle";
} else if (isFinal || neutrals.includes(ffa)) {
if ((fromStates === null || !fromStates.includes(ffa)) && toStates === null || !toStates.includes(ffa)) {
result += ",color=gray";
}
}
result += "]\n";
++i;
}
delim = "";
if (accepting.length > 0) {
for (const ntfa of accepting){
if (!hasBlockEnds || options.blockEnds?.length <= ntfa.acceptSymbol || options.blockEnds[ntfa.acceptSymbol] === null) {
result += delim;
result += pfx + spfx;
result += closure.indexOf(ntfa).toString(10);
delim = ",";
}
}
if (delim != "") {
result += " [shape=doublecircle]\n";
}
}
delim = "";
if (neutrals.length > 0) {
for (const ntfa of neutrals){
if ((fromStates === null || !fromStates.includes(ntfa)) && (toStates == null || !toStates.includes(ntfa))) {
result += delim;
result += pfx + spfx;
result += closure.indexOf(ntfa).toString(10);
delim = ",";
}
}
result += " [color=gray]\n";
delim = "";
}
delim = "";
if (finals.length > 0) {
for (const ntfa of finals){
result += delim;
result += pfx + spfx;
result += closure.indexOf(ntfa).toString(10);
delim = ",";
}
result += " [shape=circle,color=gray]\n";
}
result += "}\n";
return result;
}
_buildCompoundDot(closure, options) {
let result = "digraph FA {\n";
let vert = true;
if (!options.vertical) {
result += "rank=LR\n";
}
result += "node [shape=circle]\n";
const opt2 = new FADotGraphOptions();
opt2.debugSourceNfa = null;
opt2.statePrefix = options.statePrefix;
opt2.debugString = options.debugString;
opt2.debugShowNfa = false;
opt2.dpi = options.dpi;
opt2.acceptSymbolNames = options.acceptSymbolNames;
opt2.hideAcceptSymbolIds = options.hideAcceptSymbolIds;
opt2.blockEnds = options.blockEnds;
if (!vert) {
result += this._buildDot(closure, options, 2);
result += this._buildDot(options.debugSourceNfa.fillClosure(), opt2, 1);
} else {
result += this._buildDot(options.debugSourceNfa.fillClosure(), opt2, 2);
result += this._buildDot(closure, options, 1);
}
result += "}\n";
return result;
}
static _normalizeSortedRangeList(pairs) {
for(let i = 1; i < pairs.length; ++i){
if (pairs[i - 1].max + 1 >= pairs[i].min) {
const nr = new FARange(pairs[i - 1].min, pairs[i].max);
pairs[i - 1] = nr;
pairs.splice(i, 1);
--i;
}
}
}
static _fromHexChar(hex) {
if (':'.codePointAt(0) > hex && '/'.codePointAt(0) < hex) return hex - '0'.codePointAt(0);
if ('G'.codePointAt(0) > hex && '@'.codePointAt(0) < hex) return hex - '7'.codePointAt(0);
if ('g'.codePointAt(0) > hex && '`'.codePointAt(0) < hex) return hex - 'W'.codePointAt(0);
throw "The value was not hex.";
}
static _isHexChar(hex) {
if (':'.charCodeAt(0) > hex && '/'.codePointAt(0) < hex) return true;
if ('G'.codePointAt(0) > hex && '@'.codePointAt(0) < hex) return true;
if ('g'.codePointAt(0) > hex && '`'.codePointAt(0) < hex) return true;
return false;
}
static _parseModifier(expr, pc, accept, compact) {
var position = pc.position;
switch(pc.codepoint){
case '*'.codePointAt(0):
expr = FA.repeat(expr, 0, 0, accept, compact);
pc.advance();
break;
case '+'.codePointAt(0):
expr = FA.repeat(expr, 1, 0, accept, compact);
pc.advance();
break;
case '?'.codePointAt(0):
expr = FA.optional(expr, accept, compact);
pc.advance();
break;
case '{'.codePointAt(0):
pc.advance();
pc.trySkipWhiteSpace();
pc.expecting('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '}');
var min = -1;
var max = -1;
if (','.codePointAt(0) != pc.codepoint && '}'.codePointAt(0) != pc.codepoint) {
var l = pc.capture_buffer.length;
if (!pc.tryReadDigits()) {
pc.expecting('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
}
min = Number.parseFloat(pc.capture_buffer.substring(l));
pc.trySkipWhiteSpace();
}
if (','.codePointAt(0) == pc.codepoint) {
pc.advance();
pc.trySkipWhiteSpace();
pc.expecting('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '}');
if ('}'.charCodeAt(0) != pc.codepoint) {
var l = pc.capture_buffer.length;
pc.tryReadDigits();
max = Number.parseFloat(pc.capture_buffer.substring(l));
pc.trySkipWhiteSpace();
}
} else {
max = min;
}
pc.expecting('}');
pc.advance();
expr = FA.repeat(expr, min, max, accept, compact);
break;
}
return expr;
}
static _parseEscapePart(pc) {
if (-1 == pc.codepoint) return -1;
switch(String.fromCodePoint(pc.codepoint)){
case 'f':
pc.advance();
return '\f'.codePointAt(0);
case 'v':
pc.advance();
return '\v'.codePointAt(0);
case 't':
pc.advance();
return '\t'.codePointAt(0);
case 'n':
pc.advance();
return '\n'.codePointAt(0);
case 'r':
pc.advance();
return '\r'.codePointAt(0);
case 'x':
if (-1 == pc.advance() || !FA._isHexChar(pc.codepoint)) return 'x'.codePointAt(0);
let b = FA._fromHexChar(pc.codepoint);
if (-1 == pc.advance() || !FA._isHexChar(pc.codepoint)) return b;
b <<= 4;
b |= FA._fromHexChar(pc.codepoint);
if (-1 == pc.advance() || !FA._isHexChar(pc.codepoint)) return b;
b <<= 4;
b |= FA._fromHexChar(pc.codepoint);
if (-1 == pc.advance() || !FA._isHexChar(pc.codepoint)) return b;
b <<= 4;
b |= FA._fromHexChar(pc.codepoint);
return b;
case 'u':
if (-1 == pc.advance()) return 'u'.codePointAt(0);
let u = FA._fromHexChar(pc.codepoint);
u <<= 4;
if (-1 == pc.advance()) return u;
u |= FA._fromHexChar(pc.codepoint);
u <<= 4;
if (-1 == pc.advance()) return u;
u |= FA._fromHexChar(pc.codepoint);
u <<= 4;
if (-1 == pc.advance()) return u;
u |= FA._fromHexChar(pc.codepoint);
return u;
default:
const i = pc.codepoint;
pc.advance();
return i;
}
}
static _parseRangeEscapePart(pc) {
if (-1 == pc.codepoint) return -1;
switch(String.fromCodePoint(pc.codepoint)){
case '0':
pc.advance();
return '\0'.codePointAt(0);
case 'f':
pc.advance();
return '\f'.codePointAt(0);
case 'v':
pc.advance();
return '\v'.codePointAt(0);
case 't':
pc.advance();
return '\t'.codePointAt(0);
case 'n':
pc.advance();
return '\n'.codePointAt(0);
case 'r':
pc.advance();
return '\r'.codePointAt(0);
case 'x':
if (-1 == pc.advance() || !FA._isHexChar(pc.codepoint)) return 'x'.codePointAt(0);
let b = FA._fromHexChar(pc.codepoint);
if (-1 == pc.advance() || !FA._isHexChar(pc.codepoint)) return b;
b <<= 4;
b |= FA._fromHexChar(pc.codepoint);
if (-1 == pc.advance() || !FA._isHexChar(pc.codepoint)) return b;
b <<= 4;
b |= FA._fromHexChar(pc.codepoint);
if (-1 == pc.advance() || !FA._isHexChar(pc.codepoint)) return b;
b <<= 4;
b |= FA._fromHexChar(pc.codepoint);
return b;
case 'u':
if (-1 == pc.advance()) return 'u'.codePointAt(0);
let u = FA._fromHexChar(pc.codepoint);
u <<= 4;
if (-1 == pc.advance()) return u;
u |= FA._fromHexChar(pc.codepoint);
u <<= 4;
if (-1 == pc.advance()) return u;
u |= FA._fromHexChar(pc.codepoint);
u <<= 4;
if (-1 == pc.advance()) return u;
u |= FA._fromHexChar(pc.codepoint);
return u;
default:
const i = pc.codepoint;
pc.advance();
return i;
}
}
static _parseSet(pc) {
const result = new Array();
pc.ensureStarted();
pc.expecting('[');
pc.advance();
pc.expecting();
let firstRead = true;
let firstChar = 0;
let readFirstChar = false;
let wantRange = false;
var isNot = false;
if ('^' == String.fromCodePoint(pc.codepoint)) {
isNot = true;
pc.advance();
pc.expecting();
}
while(-1 != pc.codepoint && (firstRead || ']' != String.fromCodePoint(pc.codepoint))){
if (!wantRange) {
if ('[' == String.fromCodePoint(pc.codepoint)) {
const epos = pc.position;
pc.advance();
pc.expecting();
if (':' != String.fromCodePoint(pc.codepoint)) {
firstChar = '['.codePointAt(0);
readFirstChar = true;
} else {
firstRead = false;
pc.advance();
pc.expecting();
var ll = pc.capture_buffer.length;
if (!pc.tryReadUntil(':'.codePointAt(0), false)) throw "Expecting character class at " + pc.position;
pc.expecting(':');
pc.advance();
pc.expecting(']');
pc.advance();
var cls = pc.capture_buffer.substring(ll);
let ranges = null;
if (!FACharacterClasses.known().has(cls)) throw "Unknown character class \"" + cls + "\" specified at " + epos;
ranges = FACharacterClasses.known().get(cls);
if (ranges != null) {
result.push(...FARange.toUnpacked(ranges));
}
readFirstChar = false;
wantRange = false;
firstRead = false;
continue;
}
}
if (!readFirstChar) {
if ('\\' == String.fromCodePoint(pc.codepoint)) {
pc.advance();
firstChar = FA._parseRangeEscapePart(pc);
} else {
firstChar = pc.codepoint;
pc.advance();
pc.expecting();
}
readFirstChar = true;
} else {
if ('-' == String.fromCodePoint(pc.codepoint)) {
pc.advance();
pc.expecting();
wantRange = true;
} else {
result.push(new FARange(firstChar, firstChar));
readFirstChar = false;
}
}
firstRead = false;
} else {
if ('\\' != String.fromCodePoint(pc.codepoint)) {
const ch = pc.codepoint;
pc.advance();
pc.expecting();
result.push(new FARange(firstChar, ch));
} else {
var min = firstChar;
pc.advance();
result.push(new FARange(min, FA._parseRangeEscapePart(pc)));
}
wantRange = false;
readFirstChar = false;
}
}
if (readFirstChar) {
result.push(new FARange(firstChar, firstChar));
if (wantRange) {
result.push(new FARange('-'.codePointAt(0), '-'.codePointAt(0)));
}
}
pc.expecting(']');
pc.advance();
return [
isNot,
result
];
}
static _parse(pc, accept = 0, compact = true) {
let result = null;
let next = null;
let ich;
pc.ensureStarted();
while(pc.codepoint !== -1){
switch(pc.codepoint){
case -1:
if (result == null) {
result = new FA(accept);
}
return result;
case '.'.codePointAt(0):
const dot = FA.set([
new FARange(0, 0x10ffff)
], accept, compact);
if (null == result) result = dot;
else {
result = FA.concat([
result,
dot
], accept, compact);
}
pc.advance();
result = FA._parseModifier(result, pc, accept, compact);
break;
case '\\'.codePointAt(0):
pc.advance();
pc.expecting();
var isNot = false;
switch(pc.codepoint){
case 'P'.codePointAt(0):
isNot = true;
case 'p'.codePointAt(0):
pc.advance();
pc.expecting('{');
let uc = "";
while(-1 != pc.advance() && '}' != String.fromCodePoint(pc.codepoint))uc += String.fromCodePoint(pc.codepoint);
pc.expecting('}');
pc.advance();
let uci = 0;
switch(uc){
case "Pe":
uci = 21;
break;
case "Pc":
uci = 19;
break;
case "Cc":
uci = 14;
break;
case "Sc":
uci = 26;
break;
case "Pd":
uci = 19;
break;
case "Nd":
uci = 8;
break;
case "Me":
uci = 7;
break;
case "Pf":
uci = 23;
break;
case "Cf":
uci = 15;
break;
case "Pi":
uci = 22;
break;
case "Nl":
uci = 9;
break;
case "Zl":
uci = 12;
break;
case "Ll":
uci = 1;
break;
case "Sm":
uci = 25;
break;
case "Lm":
uci = 3;
break;
case "Sk":
uci = 27;
break;
case "Mn":
uci = 5;
break;
case "Ps":
uci = 20;
break;
case "Lo":
uci = 4;
break;
case "Cn":
uci = 29;
break;
case "No":
uci = 10;
break;
case "Po":
uci = 24;
break;
case "So":
uci = 28;
break;
case "Zp":
uci = 13;
break;
case "Co":
uci = 17;
break;
case "Zs":
uci = 11;
break;
case "Mc":
uci = 6;
break;
case "Cs":
uci = 16;
break;
case "Lt":
uci = 2;
break;
case "Lu":
uci = 0;
break;
}
if (isNot) {
next = FA.set(FARange.toUnpacked(FACharacterClasses.unicodeCategories[uci]), accept, compact);
} else next = FA.set(FARange.toUnpacked(FACharacterClasses.notUnicodeCategories[uci]), accept, compact);
break;
case 'd'.codePointAt(0):
next = FA.set(FARange.toUnpacked(FACharacterClasses.digit), accept, compact);
pc.advance();
break;
case 'D'.codePointAt(0):
next = FA.set(FARange.toNotRanges(FARange.toUnpacked(FACharacterClasses.digit)), accept, compact);
pc.advance();
break;
case 's'.codePointAt(0):
next = FA.set(FARange.toUnpacked(FACharacterClasses.space), accept, compact);
pc.advance();
break;
case 'S'.codePointAt(0):
next = FA.set(FARange.toNotRanges(FARange.toUnpacked(FACharacterClasses.space)), accept, compact);
pc.advance();
break;
case 'w'.codePointAt(0):
next = FA.set(FARange.toUnpacked(FACharacterClasses.word), accept, compact);
pc.advance();
break;
case 'W'.codePointAt(0):
next = FA.set(FARange.toNotRanges(FARange.toUnpacked(FACharacterClasses.word)), accept, compact);
pc.advance();
break;
default:
if (-1 != (ich = FA._parseEscapePart(pc))) {
next = FA.literal([
ich
], accept, compact);
} else {
pc.expecting();
}
break;
}
next = FA._parseModifier(next, pc, accept, compact);
if (null != result) {
result = FA.concat([
result,
next
], accept, compact);
} else result = next;
break;
case ')'.codePointAt(0):
return result;
case '('.codePointAt(0):
pc.advance();
if (String.fromCodePoint(pc.codepoint) == '?') {
pc.advance();
pc.expecting(':');
pc.advance();
}
pc.expecting();
next = FA._parse(pc, accept, compact);
pc.expecting(')');
pc.advance();
next = FA._parseModifier(next, pc, accept, compact);
if (null == result) result = next;
else {
result = FA.concat([
result,
next
], accept, compact);
}
break;
case '|'.codePointAt(0):
if (-1 != pc.advance()) {
next = FA._parse(pc, accept, compact);
result = FA.or([
result,
next
], accept, compact);
} else {
result = FA.optional(result, accept, compact);
}
break;
case '['.codePointAt(0):
const seti = FA._parseSet(pc);
let set = seti[1];
set.sort((x, y)=>{
const c = x.min - y.min;
if (0 != c) return c;
return x.max - y.max;
});
FA._normalizeSortedRangeList(set);
if (seti[0] === true) {
set = [
...FARange.toNotRanges(set)
];
}
next = FA.set(set, accept);
next = FA._parseModifier(next, pc, accept, compact);
if (null == result) result = next;
else {
result = FA.concat([
result,
next
], accept, compact);
}
break;
default:
ich = pc.codepoint;
next = FA.literal([
ich
], accept, compact);
pc.advance();
next = FA._parseModifier(next, pc, accept, compact);
if (null == result) result = next;
else {
result = FA.concat([
result,
next
], accept, compact);
}
break;
}
}
return result;
}
static parse(expression, accept = 0, compact = true) {
const pc = new _ParseContext(expression);
return FA._parse(pc, accept, compact);
}
static toLexer(tokens, makeDfa = true, compact = true, progress = null) {
if (makeDfa) {
for(let i = 0; i < tokens.length; i++){
tokens[i] = tokens[i].toMinimizedDfa(progress);
}
}
var result = new FA();
for(let i = 0; i < tokens.length; i++){
result.addEpsilon(tokens[i], compact);
}
if (makeDfa && !result.isDeterministic) {
return result.toDfa(progress);
} else {
return result;
}
}
}
//# sourceURL=visualfa.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment