re2js 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@
2
2
  * re2js
3
3
  * RE2JS is the JavaScript port of RE2, a regular expression engine that provides linear time matching
4
4
  *
5
- * @version v2.0.1
5
+ * @version v2.1.0
6
6
  * @author Alexey Vasiliev
7
7
  * @homepage https://github.com/le0pard/re2js#readme
8
8
  * @repository github:le0pard/re2js
@@ -54,6 +54,23 @@ class RE2Flags {
54
54
  /**
55
55
  * Various constants and helper for unicode codepoints.
56
56
  */
57
+ const ASCII_SIZE = 128;
58
+ const ASCII_TO_UPPER = new Int32Array(ASCII_SIZE);
59
+ const ASCII_TO_LOWER = new Int32Array(ASCII_SIZE);
60
+ for (let i = 0; i < ASCII_SIZE; i++) {
61
+ if (i >= 97 && i <= 122) {
62
+ // a-z
63
+ ASCII_TO_UPPER[i] = i - 32;
64
+ } else {
65
+ ASCII_TO_UPPER[i] = i;
66
+ }
67
+ if (i >= 65 && i <= 90) {
68
+ // A-Z
69
+ ASCII_TO_LOWER[i] = i + 32;
70
+ } else {
71
+ ASCII_TO_LOWER[i] = i;
72
+ }
73
+ }
57
74
  class Codepoint {
58
75
  // codePointAt(0)
59
76
  static CODES = new Map([['\x07', 7], ['\b', 8], ['\t', 9], ['\n', 10], ['\v', 11], ['\f', 12], ['\r', 13], [' ', 32], ['"', 34], ['$', 36], ['&', 38], ['(', 40], [')', 41], ['*', 42], ['+', 43], ['-', 45], ['.', 46], ['0', 48], ['1', 49], ['2', 50], ['3', 51], ['4', 52], ['5', 53], ['6', 54], ['7', 55], ['8', 56], ['9', 57], [':', 58], ['<', 60], ['>', 62], ['?', 63], ['A', 65], ['B', 66], ['C', 67], ['F', 70], ['P', 80], ['Q', 81], ['U', 85], ['Z', 90], ['[', 91], ['\\', 92], [']', 93], ['^', 94], ['_', 95], ['a', 97], ['b', 98], ['f', 102], ['i', 105], ['m', 109], ['n', 110], ['r', 114], ['s', 115], ['t', 116], ['v', 118], ['x', 120], ['z', 122], ['{', 123], ['|', 124], ['}', 125]]);
@@ -61,6 +78,7 @@ class Codepoint {
61
78
  // convert unicode codepoint to upper case codepoint
62
79
  // return same codepoint, if cannot do it (or codepoint not have upper variation)
63
80
  static toUpperCase(codepoint) {
81
+ if (codepoint < ASCII_SIZE) return ASCII_TO_UPPER[codepoint];
64
82
  const s = String.fromCodePoint(codepoint).toUpperCase();
65
83
  if (s.length > 1) {
66
84
  return codepoint;
@@ -75,6 +93,7 @@ class Codepoint {
75
93
  // convert unicode codepoint to lower case codepoint
76
94
  // return same codepoint, if cannot do it (or codepoint not have lower variation)
77
95
  static toLowerCase(codepoint) {
96
+ if (codepoint < ASCII_SIZE) return ASCII_TO_LOWER[codepoint];
78
97
  const s = String.fromCodePoint(codepoint).toLowerCase();
79
98
  if (s.length > 1) {
80
99
  return codepoint;
@@ -88,9 +107,10 @@ class Codepoint {
88
107
  }
89
108
 
90
109
  class UnicodeRangeTable {
91
- SIZE = 3;
92
- constructor(data) {
110
+ constructor(data, isStride1 = false) {
93
111
  this.data = data; // A Uint32Array
112
+ this.isStride1 = isStride1;
113
+ this.SIZE = isStride1 ? 2 : 3;
94
114
  }
95
115
 
96
116
  // High-performance getters that do NOT allocate memory
@@ -101,14 +121,11 @@ class UnicodeRangeTable {
101
121
  return this.data[index * this.SIZE + 1];
102
122
  }
103
123
  getStride(index) {
104
- return this.data[index * this.SIZE + 2];
124
+ return this.isStride1 ? 1 : this.data[index * this.SIZE + 2];
105
125
  }
106
-
107
- // Convenience getter (slower, for debugging or non-critical paths)
108
126
  get(index) {
109
127
  const i = index * this.SIZE;
110
- // Returns [lo, hi, stride]
111
- return [this.data[i], this.data[i + 1], this.data[i + 2]];
128
+ return [this.data[i], this.data[i + 1], this.getStride(index)];
112
129
  }
113
130
  get length() {
114
131
  return this.data.length / this.SIZE;
@@ -118,229 +135,317 @@ class UnicodeRangeTable {
118
135
  // GENERATED BY tools/scripts/genUnicodeTable.js; DO NOT EDIT.
119
136
  // yarn node ./tools/scripts/genUnicodeTable.js > src/UnicodeTables.js
120
137
 
138
+ const B64_MAP = new Uint8Array(256);
139
+ for (let i = 0, b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-'; i < 64; i++) {
140
+ B64_MAP[b.charCodeAt(i)] = i;
141
+ }
142
+ const decodeVLQ = str => {
143
+ const res = [];
144
+ let value = 0,
145
+ shift = 0;
146
+ for (let i = 0; i < str.length; i++) {
147
+ let digit = B64_MAP[str.charCodeAt(i)];
148
+ value |= (digit & 0x1f) << shift;
149
+ if ((digit & 0x20) === 0) {
150
+ res.push(value);
151
+ value = 0;
152
+ shift = 0;
153
+ } else {
154
+ shift += 5;
155
+ }
156
+ }
157
+ return res;
158
+ };
159
+ const decodeRanges = (str, isStride1) => {
160
+ const res = decodeVLQ(str);
161
+ const numRanges = isStride1 ? res.length / 2 : res.length / 3;
162
+ const out = new Uint32Array(numRanges * 3);
163
+ let current = 0,
164
+ resIdx = 0;
165
+ for (let i = 0; i < numRanges; i++) {
166
+ current += res[resIdx++];
167
+ out[i * 3] = current;
168
+ current += res[resIdx++];
169
+ out[i * 3 + 1] = current;
170
+ out[i * 3 + 2] = isStride1 ? 1 : res[resIdx++];
171
+ }
172
+ return out;
173
+ };
174
+ const decodeOrbit = str => {
175
+ const res = decodeVLQ(str);
176
+ const map = new Map();
177
+ let currentKey = 0;
178
+ for (let i = 0; i < res.length; i += 2) {
179
+ currentKey += res[i];
180
+ map.set(currentKey, res[i + 1]);
181
+ }
182
+ return map;
183
+ };
184
+ class LazyMap {
185
+ constructor(initializer) {
186
+ this.initializer = initializer;
187
+ this.cache = new Map();
188
+ }
189
+ has(key) {
190
+ return key in this.initializer;
191
+ }
192
+ get(key) {
193
+ if (this.cache.has(key)) return this.cache.get(key);
194
+ const fn = this.initializer[key];
195
+ const val = fn ? fn() : null;
196
+ this.cache.set(key, val);
197
+ return val;
198
+ }
199
+ }
121
200
  class UnicodeTables {
122
- static CASE_ORBIT = new Map([[75, 107], [107, 8490], [8490, 75], [83, 115], [115, 383], [383, 83], [181, 924], [924, 956], [956, 181], [197, 229], [229, 8491], [8491, 197], [452, 453], [453, 454], [454, 452], [455, 456], [456, 457], [457, 455], [458, 459], [459, 460], [460, 458], [497, 498], [498, 499], [499, 497], [837, 921], [921, 953], [953, 8126], [8126, 837], [914, 946], [946, 976], [976, 914], [917, 949], [949, 1013], [1013, 917], [920, 952], [952, 977], [977, 1012], [1012, 920], [922, 954], [954, 1008], [1008, 922], [928, 960], [960, 982], [982, 928], [929, 961], [961, 1009], [1009, 929], [931, 962], [962, 963], [963, 931], [934, 966], [966, 981], [981, 934], [937, 969], [969, 8486], [8486, 937], [1042, 1074], [1074, 7296], [7296, 1042], [1044, 1076], [1076, 7297], [7297, 1044], [1054, 1086], [1086, 7298], [7298, 1054], [1057, 1089], [1089, 7299], [7299, 1057], [1058, 1090], [1090, 7300], [7300, 7301], [7301, 1058], [1066, 1098], [1098, 7302], [7302, 1066], [1122, 1123], [1123, 7303], [7303, 1122], [7304, 42570], [42570, 42571], [42571, 7304], [7776, 7777], [7777, 7835], [7835, 7776], [223, 7838], [7838, 223], [8064, 8072], [8072, 8064], [8065, 8073], [8073, 8065], [8066, 8074], [8074, 8066], [8067, 8075], [8075, 8067], [8068, 8076], [8076, 8068], [8069, 8077], [8077, 8069], [8070, 8078], [8078, 8070], [8071, 8079], [8079, 8071], [8080, 8088], [8088, 8080], [8081, 8089], [8089, 8081], [8082, 8090], [8090, 8082], [8083, 8091], [8091, 8083], [8084, 8092], [8092, 8084], [8085, 8093], [8093, 8085], [8086, 8094], [8094, 8086], [8087, 8095], [8095, 8087], [8096, 8104], [8104, 8096], [8097, 8105], [8105, 8097], [8098, 8106], [8106, 8098], [8099, 8107], [8107, 8099], [8100, 8108], [8108, 8100], [8101, 8109], [8109, 8101], [8102, 8110], [8110, 8102], [8103, 8111], [8111, 8103], [8115, 8124], [8124, 8115], [8131, 8140], [8140, 8131], [912, 8147], [8147, 912], [944, 8163], [8163, 944], [8179, 8188], [8188, 8179], [64261, 64262], [64262, 64261], [66560, 66600], [66600, 66560], [66561, 66601], [66601, 66561], [66562, 66602], [66602, 66562], [66563, 66603], [66603, 66563], [66564, 66604], [66604, 66564], [66565, 66605], [66605, 66565], [66566, 66606], [66606, 66566], [66567, 66607], [66607, 66567], [66568, 66608], [66608, 66568], [66569, 66609], [66609, 66569], [66570, 66610], [66610, 66570], [66571, 66611], [66611, 66571], [66572, 66612], [66612, 66572], [66573, 66613], [66613, 66573], [66574, 66614], [66614, 66574], [66575, 66615], [66615, 66575], [66576, 66616], [66616, 66576], [66577, 66617], [66617, 66577], [66578, 66618], [66618, 66578], [66579, 66619], [66619, 66579], [66580, 66620], [66620, 66580], [66581, 66621], [66621, 66581], [66582, 66622], [66622, 66582], [66583, 66623], [66623, 66583], [66584, 66624], [66624, 66584], [66585, 66625], [66625, 66585], [66586, 66626], [66626, 66586], [66587, 66627], [66627, 66587], [66588, 66628], [66628, 66588], [66589, 66629], [66629, 66589], [66590, 66630], [66630, 66590], [66591, 66631], [66631, 66591], [66592, 66632], [66632, 66592], [66593, 66633], [66633, 66593], [66594, 66634], [66634, 66594], [66595, 66635], [66635, 66595], [66596, 66636], [66636, 66596], [66597, 66637], [66637, 66597], [66598, 66638], [66638, 66598], [66599, 66639], [66639, 66599], [66736, 66776], [66776, 66736], [66737, 66777], [66777, 66737], [66738, 66778], [66778, 66738], [66739, 66779], [66779, 66739], [66740, 66780], [66780, 66740], [66741, 66781], [66781, 66741], [66742, 66782], [66782, 66742], [66743, 66783], [66783, 66743], [66744, 66784], [66784, 66744], [66745, 66785], [66785, 66745], [66746, 66786], [66786, 66746], [66747, 66787], [66787, 66747], [66748, 66788], [66788, 66748], [66749, 66789], [66789, 66749], [66750, 66790], [66790, 66750], [66751, 66791], [66791, 66751], [66752, 66792], [66792, 66752], [66753, 66793], [66793, 66753], [66754, 66794], [66794, 66754], [66755, 66795], [66795, 66755], [66756, 66796], [66796, 66756], [66757, 66797], [66797, 66757], [66758, 66798], [66798, 66758], [66759, 66799], [66799, 66759], [66760, 66800], [66800, 66760], [66761, 66801], [66801, 66761], [66762, 66802], [66802, 66762], [66763, 66803], [66803, 66763], [66764, 66804], [66804, 66764], [66765, 66805], [66805, 66765], [66766, 66806], [66806, 66766], [66767, 66807], [66807, 66767], [66768, 66808], [66808, 66768], [66769, 66809], [66809, 66769], [66770, 66810], [66810, 66770], [66771, 66811], [66811, 66771], [66928, 66967], [66967, 66928], [66929, 66968], [66968, 66929], [66930, 66969], [66969, 66930], [66931, 66970], [66970, 66931], [66932, 66971], [66971, 66932], [66933, 66972], [66972, 66933], [66934, 66973], [66973, 66934], [66935, 66974], [66974, 66935], [66936, 66975], [66975, 66936], [66937, 66976], [66976, 66937], [66938, 66977], [66977, 66938], [66940, 66979], [66979, 66940], [66941, 66980], [66980, 66941], [66942, 66981], [66981, 66942], [66943, 66982], [66982, 66943], [66944, 66983], [66983, 66944], [66945, 66984], [66984, 66945], [66946, 66985], [66985, 66946], [66947, 66986], [66986, 66947], [66948, 66987], [66987, 66948], [66949, 66988], [66988, 66949], [66950, 66989], [66989, 66950], [66951, 66990], [66990, 66951], [66952, 66991], [66991, 66952], [66953, 66992], [66992, 66953], [66954, 66993], [66993, 66954], [66956, 66995], [66995, 66956], [66957, 66996], [66996, 66957], [66958, 66997], [66997, 66958], [66959, 66998], [66998, 66959], [66960, 66999], [66999, 66960], [66961, 67000], [67000, 66961], [66962, 67001], [67001, 66962], [66964, 67003], [67003, 66964], [66965, 67004], [67004, 66965], [68736, 68800], [68800, 68736], [68737, 68801], [68801, 68737], [68738, 68802], [68802, 68738], [68739, 68803], [68803, 68739], [68740, 68804], [68804, 68740], [68741, 68805], [68805, 68741], [68742, 68806], [68806, 68742], [68743, 68807], [68807, 68743], [68744, 68808], [68808, 68744], [68745, 68809], [68809, 68745], [68746, 68810], [68810, 68746], [68747, 68811], [68811, 68747], [68748, 68812], [68812, 68748], [68749, 68813], [68813, 68749], [68750, 68814], [68814, 68750], [68751, 68815], [68815, 68751], [68752, 68816], [68816, 68752], [68753, 68817], [68817, 68753], [68754, 68818], [68818, 68754], [68755, 68819], [68819, 68755], [68756, 68820], [68820, 68756], [68757, 68821], [68821, 68757], [68758, 68822], [68822, 68758], [68759, 68823], [68823, 68759], [68760, 68824], [68824, 68760], [68761, 68825], [68825, 68761], [68762, 68826], [68826, 68762], [68763, 68827], [68827, 68763], [68764, 68828], [68828, 68764], [68765, 68829], [68829, 68765], [68766, 68830], [68830, 68766], [68767, 68831], [68831, 68767], [68768, 68832], [68832, 68768], [68769, 68833], [68833, 68769], [68770, 68834], [68834, 68770], [68771, 68835], [68835, 68771], [68772, 68836], [68836, 68772], [68773, 68837], [68837, 68773], [68774, 68838], [68838, 68774], [68775, 68839], [68839, 68775], [68776, 68840], [68840, 68776], [68777, 68841], [68841, 68777], [68778, 68842], [68842, 68778], [68779, 68843], [68843, 68779], [68780, 68844], [68844, 68780], [68781, 68845], [68845, 68781], [68782, 68846], [68846, 68782], [68783, 68847], [68847, 68783], [68784, 68848], [68848, 68784], [68785, 68849], [68849, 68785], [68786, 68850], [68850, 68786], [68944, 68976], [68976, 68944], [68945, 68977], [68977, 68945], [68946, 68978], [68978, 68946], [68947, 68979], [68979, 68947], [68948, 68980], [68980, 68948], [68949, 68981], [68981, 68949], [68950, 68982], [68982, 68950], [68951, 68983], [68983, 68951], [68952, 68984], [68984, 68952], [68953, 68985], [68985, 68953], [68954, 68986], [68986, 68954], [68955, 68987], [68987, 68955], [68956, 68988], [68988, 68956], [68957, 68989], [68989, 68957], [68958, 68990], [68990, 68958], [68959, 68991], [68991, 68959], [68960, 68992], [68992, 68960], [68961, 68993], [68993, 68961], [68962, 68994], [68994, 68962], [68963, 68995], [68995, 68963], [68964, 68996], [68996, 68964], [68965, 68997], [68997, 68965], [71840, 71872], [71872, 71840], [71841, 71873], [71873, 71841], [71842, 71874], [71874, 71842], [71843, 71875], [71875, 71843], [71844, 71876], [71876, 71844], [71845, 71877], [71877, 71845], [71846, 71878], [71878, 71846], [71847, 71879], [71879, 71847], [71848, 71880], [71880, 71848], [71849, 71881], [71881, 71849], [71850, 71882], [71882, 71850], [71851, 71883], [71883, 71851], [71852, 71884], [71884, 71852], [71853, 71885], [71885, 71853], [71854, 71886], [71886, 71854], [71855, 71887], [71887, 71855], [71856, 71888], [71888, 71856], [71857, 71889], [71889, 71857], [71858, 71890], [71890, 71858], [71859, 71891], [71891, 71859], [71860, 71892], [71892, 71860], [71861, 71893], [71893, 71861], [71862, 71894], [71894, 71862], [71863, 71895], [71895, 71863], [71864, 71896], [71896, 71864], [71865, 71897], [71897, 71865], [71866, 71898], [71898, 71866], [71867, 71899], [71899, 71867], [71868, 71900], [71900, 71868], [71869, 71901], [71901, 71869], [71870, 71902], [71902, 71870], [71871, 71903], [71903, 71871], [93760, 93792], [93792, 93760], [93761, 93793], [93793, 93761], [93762, 93794], [93794, 93762], [93763, 93795], [93795, 93763], [93764, 93796], [93796, 93764], [93765, 93797], [93797, 93765], [93766, 93798], [93798, 93766], [93767, 93799], [93799, 93767], [93768, 93800], [93800, 93768], [93769, 93801], [93801, 93769], [93770, 93802], [93802, 93770], [93771, 93803], [93803, 93771], [93772, 93804], [93804, 93772], [93773, 93805], [93805, 93773], [93774, 93806], [93806, 93774], [93775, 93807], [93807, 93775], [93776, 93808], [93808, 93776], [93777, 93809], [93809, 93777], [93778, 93810], [93810, 93778], [93779, 93811], [93811, 93779], [93780, 93812], [93812, 93780], [93781, 93813], [93813, 93781], [93782, 93814], [93814, 93782], [93783, 93815], [93815, 93783], [93784, 93816], [93816, 93784], [93785, 93817], [93817, 93785], [93786, 93818], [93818, 93786], [93787, 93819], [93819, 93787], [93788, 93820], [93820, 93788], [93789, 93821], [93821, 93789], [93790, 93822], [93822, 93790], [93791, 93823], [93823, 93791], [125184, 125218], [125218, 125184], [125185, 125219], [125219, 125185], [125186, 125220], [125220, 125186], [125187, 125221], [125221, 125187], [125188, 125222], [125222, 125188], [125189, 125223], [125223, 125189], [125190, 125224], [125224, 125190], [125191, 125225], [125225, 125191], [125192, 125226], [125226, 125192], [125193, 125227], [125227, 125193], [125194, 125228], [125228, 125194], [125195, 125229], [125229, 125195], [125196, 125230], [125230, 125196], [125197, 125231], [125231, 125197], [125198, 125232], [125232, 125198], [125199, 125233], [125233, 125199], [125200, 125234], [125234, 125200], [125201, 125235], [125235, 125201], [125202, 125236], [125236, 125202], [125203, 125237], [125237, 125203], [125204, 125238], [125238, 125204], [125205, 125239], [125239, 125205], [125206, 125240], [125240, 125206], [125207, 125241], [125241, 125207], [125208, 125242], [125242, 125208], [125209, 125243], [125243, 125209], [125210, 125244], [125244, 125210], [125211, 125245], [125245, 125211], [125212, 125246], [125246, 125212], [125213, 125247], [125247, 125213], [125214, 125248], [125248, 125214], [125215, 125249], [125249, 125215], [125216, 125250], [125250, 125216], [125217, 125251], [125251, 125217]]);
123
- static C = new UnicodeRangeTable(new Uint32Array([0, 31, 1, 127, 159, 1, 173, 888, 715, 889, 896, 7, 897, 899, 1, 907, 909, 2, 930, 1328, 398, 1367, 1368, 1, 1419, 1420, 1, 1424, 1480, 56, 1481, 1487, 1, 1515, 1518, 1, 1525, 1541, 1, 1564, 1757, 193, 1806, 1807, 1, 1867, 1868, 1, 1970, 1983, 1, 2043, 2044, 1, 2094, 2095, 1, 2111, 2140, 29, 2141, 2143, 2, 2155, 2159, 1, 2191, 2198, 1, 2274, 2436, 162, 2445, 2446, 1, 2449, 2450, 1, 2473, 2481, 8, 2483, 2485, 1, 2490, 2491, 1, 2501, 2502, 1, 2505, 2506, 1, 2511, 2518, 1, 2520, 2523, 1, 2526, 2532, 6, 2533, 2559, 26, 2560, 2564, 4, 2571, 2574, 1, 2577, 2578, 1, 2601, 2609, 8, 2612, 2618, 3, 2619, 2621, 2, 2627, 2630, 1, 2633, 2634, 1, 2638, 2640, 1, 2642, 2648, 1, 2653, 2655, 2, 2656, 2661, 1, 2679, 2688, 1, 2692, 2702, 10, 2706, 2729, 23, 2737, 2740, 3, 2746, 2747, 1, 2758, 2766, 4, 2767, 2769, 2, 2770, 2783, 1, 2788, 2789, 1, 2802, 2808, 1, 2816, 2820, 4, 2829, 2830, 1, 2833, 2834, 1, 2857, 2865, 8, 2868, 2874, 6, 2875, 2885, 10, 2886, 2889, 3, 2890, 2894, 4, 2895, 2900, 1, 2904, 2907, 1, 2910, 2916, 6, 2917, 2936, 19, 2937, 2945, 1, 2948, 2955, 7, 2956, 2957, 1, 2961, 2966, 5, 2967, 2968, 1, 2971, 2973, 2, 2976, 2978, 1, 2981, 2983, 1, 2987, 2989, 1, 3002, 3005, 1, 3011, 3013, 1, 3017, 3022, 5, 3023, 3025, 2, 3026, 3030, 1, 3032, 3045, 1, 3067, 3071, 1, 3085, 3089, 4, 3113, 3130, 17, 3131, 3141, 10, 3145, 3150, 5, 3151, 3156, 1, 3159, 3163, 4, 3164, 3166, 2, 3167, 3172, 5, 3173, 3184, 11, 3185, 3190, 1, 3213, 3217, 4, 3241, 3252, 11, 3258, 3259, 1, 3269, 3273, 4, 3278, 3284, 1, 3287, 3292, 1, 3295, 3300, 5, 3301, 3312, 11, 3316, 3327, 1, 3341, 3345, 4, 3397, 3401, 4, 3408, 3411, 1, 3428, 3429, 1, 3456, 3460, 4, 3479, 3481, 1, 3506, 3516, 10, 3518, 3519, 1, 3527, 3529, 1, 3531, 3534, 1, 3541, 3543, 2, 3552, 3557, 1, 3568, 3569, 1, 3573, 3584, 1, 3643, 3646, 1, 3676, 3712, 1, 3715, 3717, 2, 3723, 3748, 25, 3750, 3774, 24, 3775, 3781, 6, 3783, 3791, 8, 3802, 3803, 1, 3808, 3839, 1, 3912, 3949, 37, 3950, 3952, 1, 3992, 4029, 37, 4045, 4059, 14, 4060, 4095, 1, 4294, 4296, 2, 4297, 4300, 1, 4302, 4303, 1, 4681, 4686, 5, 4687, 4695, 8, 4697, 4702, 5, 4703, 4745, 42, 4750, 4751, 1, 4785, 4790, 5, 4791, 4799, 8, 4801, 4806, 5, 4807, 4823, 16, 4881, 4886, 5, 4887, 4955, 68, 4956, 4989, 33, 4990, 4991, 1, 5018, 5023, 1, 5110, 5111, 1, 5118, 5119, 1, 5789, 5791, 1, 5881, 5887, 1, 5910, 5918, 1, 5943, 5951, 1, 5972, 5983, 1, 5997, 6001, 4, 6004, 6015, 1, 6110, 6111, 1, 6122, 6127, 1, 6138, 6143, 1, 6158, 6170, 12, 6171, 6175, 1, 6265, 6271, 1, 6315, 6319, 1, 6390, 6399, 1, 6431, 6444, 13, 6445, 6447, 1, 6460, 6463, 1, 6465, 6467, 1, 6510, 6511, 1, 6517, 6527, 1, 6572, 6575, 1, 6602, 6607, 1, 6619, 6621, 1, 6684, 6685, 1, 6751, 6781, 30, 6782, 6794, 12, 6795, 6799, 1, 6810, 6815, 1, 6830, 6831, 1, 6863, 6911, 1, 6989, 7156, 167, 7157, 7163, 1, 7224, 7226, 1, 7242, 7244, 1, 7307, 7311, 1, 7355, 7356, 1, 7368, 7375, 1, 7419, 7423, 1, 7958, 7959, 1, 7966, 7967, 1, 8006, 8007, 1, 8014, 8015, 1, 8024, 8030, 2, 8062, 8063, 1, 8117, 8133, 16, 8148, 8149, 1, 8156, 8176, 20, 8177, 8181, 4, 8191, 8203, 12, 8204, 8207, 1, 8234, 8238, 1, 8288, 8303, 1, 8306, 8307, 1, 8335, 8349, 14, 8350, 8351, 1, 8385, 8399, 1, 8433, 8447, 1, 8588, 8591, 1, 9258, 9279, 1, 9291, 9311, 1, 11124, 11125, 1, 11158, 11508, 350, 11509, 11512, 1, 11558, 11560, 2, 11561, 11564, 1, 11566, 11567, 1, 11624, 11630, 1, 11633, 11646, 1, 11671, 11679, 1, 11687, 11743, 8, 11870, 11903, 1, 11930, 12020, 90, 12021, 12031, 1, 12246, 12271, 1, 12352, 12439, 87, 12440, 12544, 104, 12545, 12548, 1, 12592, 12687, 95, 12774, 12782, 1, 12831, 42125, 29294, 42126, 42127, 1, 42183, 42191, 1, 42540, 42559, 1, 42744, 42751, 1, 42958, 42959, 1, 42962, 42964, 2, 42973, 42993, 1, 43053, 43055, 1, 43066, 43071, 1, 43128, 43135, 1, 43206, 43213, 1, 43226, 43231, 1, 43348, 43358, 1, 43389, 43391, 1, 43470, 43482, 12, 43483, 43485, 1, 43519, 43575, 56, 43576, 43583, 1, 43598, 43599, 1, 43610, 43611, 1, 43715, 43738, 1, 43767, 43776, 1, 43783, 43784, 1, 43791, 43792, 1, 43799, 43807, 1, 43815, 43823, 8, 43884, 43887, 1, 44014, 44015, 1, 44026, 44031, 1, 55204, 55215, 1, 55239, 55242, 1, 55292, 63743, 1, 64110, 64111, 1, 64218, 64255, 1, 64263, 64274, 1, 64280, 64284, 1, 64311, 64317, 6, 64319, 64325, 3, 64451, 64466, 1, 64912, 64913, 1, 64968, 64974, 1, 64976, 65007, 1, 65050, 65055, 1, 65107, 65127, 20, 65132, 65135, 1, 65141, 65277, 136, 65278, 65280, 1, 65471, 65473, 1, 65480, 65481, 1, 65488, 65489, 1, 65496, 65497, 1, 65501, 65503, 1, 65511, 65519, 8, 65520, 65531, 1, 65534, 65535, 1, 65548, 65575, 27, 65595, 65598, 3, 65614, 65615, 1, 65630, 65663, 1, 65787, 65791, 1, 65795, 65798, 1, 65844, 65846, 1, 65935, 65949, 14, 65950, 65951, 1, 65953, 65999, 1, 66046, 66175, 1, 66205, 66207, 1, 66257, 66271, 1, 66300, 66303, 1, 66340, 66348, 1, 66379, 66383, 1, 66427, 66431, 1, 66462, 66500, 38, 66501, 66503, 1, 66518, 66559, 1, 66718, 66719, 1, 66730, 66735, 1, 66772, 66775, 1, 66812, 66815, 1, 66856, 66863, 1, 66916, 66926, 1, 66939, 66955, 16, 66963, 66966, 3, 66978, 66994, 16, 67002, 67005, 3, 67006, 67007, 1, 67060, 67071, 1, 67383, 67391, 1, 67414, 67423, 1, 67432, 67455, 1, 67462, 67505, 43, 67515, 67583, 1, 67590, 67591, 1, 67593, 67638, 45, 67641, 67643, 1, 67645, 67646, 1, 67670, 67743, 73, 67744, 67750, 1, 67760, 67807, 1, 67827, 67830, 3, 67831, 67834, 1, 67868, 67870, 1, 67898, 67902, 1, 67904, 67967, 1, 68024, 68027, 1, 68048, 68049, 1, 68100, 68103, 3, 68104, 68107, 1, 68116, 68120, 4, 68150, 68151, 1, 68155, 68158, 1, 68169, 68175, 1, 68185, 68191, 1, 68256, 68287, 1, 68327, 68330, 1, 68343, 68351, 1, 68406, 68408, 1, 68438, 68439, 1, 68467, 68471, 1, 68498, 68504, 1, 68509, 68520, 1, 68528, 68607, 1, 68681, 68735, 1, 68787, 68799, 1, 68851, 68857, 1, 68904, 68911, 1, 68922, 68927, 1, 68966, 68968, 1, 68998, 69005, 1, 69008, 69215, 1, 69247, 69290, 43, 69294, 69295, 1, 69298, 69313, 1, 69317, 69371, 1, 69416, 69423, 1, 69466, 69487, 1, 69514, 69551, 1, 69580, 69599, 1, 69623, 69631, 1, 69710, 69713, 1, 69750, 69758, 1, 69821, 69827, 6, 69828, 69839, 1, 69865, 69871, 1, 69882, 69887, 1, 69941, 69960, 19, 69961, 69967, 1, 70007, 70015, 1, 70112, 70133, 21, 70134, 70143, 1, 70162, 70210, 48, 70211, 70271, 1, 70279, 70281, 2, 70286, 70302, 16, 70314, 70319, 1, 70379, 70383, 1, 70394, 70399, 1, 70404, 70413, 9, 70414, 70417, 3, 70418, 70441, 23, 70449, 70452, 3, 70458, 70469, 11, 70470, 70473, 3, 70474, 70478, 4, 70479, 70481, 2, 70482, 70486, 1, 70488, 70492, 1, 70500, 70501, 1, 70509, 70511, 1, 70517, 70527, 1, 70538, 70540, 2, 70541, 70543, 2, 70582, 70593, 11, 70595, 70596, 1, 70598, 70603, 5, 70614, 70617, 3, 70618, 70624, 1, 70627, 70655, 1, 70748, 70754, 6, 70755, 70783, 1, 70856, 70863, 1, 70874, 71039, 1, 71094, 71095, 1, 71134, 71167, 1, 71237, 71247, 1, 71258, 71263, 1, 71277, 71295, 1, 71354, 71359, 1, 71370, 71375, 1, 71396, 71423, 1, 71451, 71452, 1, 71468, 71471, 1, 71495, 71679, 1, 71740, 71839, 1, 71923, 71934, 1, 71943, 71944, 1, 71946, 71947, 1, 71956, 71959, 3, 71990, 71993, 3, 71994, 72007, 13, 72008, 72015, 1, 72026, 72095, 1, 72104, 72105, 1, 72152, 72153, 1, 72165, 72191, 1, 72264, 72271, 1, 72355, 72367, 1, 72441, 72447, 1, 72458, 72639, 1, 72674, 72687, 1, 72698, 72703, 1, 72713, 72759, 46, 72774, 72783, 1, 72813, 72815, 1, 72848, 72849, 1, 72872, 72887, 15, 72888, 72959, 1, 72967, 72970, 3, 73015, 73017, 1, 73019, 73022, 3, 73032, 73039, 1, 73050, 73055, 1, 73062, 73065, 3, 73103, 73106, 3, 73113, 73119, 1, 73130, 73439, 1, 73465, 73471, 1, 73489, 73531, 42, 73532, 73533, 1, 73563, 73647, 1, 73649, 73663, 1, 73714, 73726, 1, 74650, 74751, 1, 74863, 74869, 6, 74870, 74879, 1, 75076, 77711, 1, 77811, 77823, 1, 78896, 78911, 1, 78934, 78943, 1, 82939, 82943, 1, 83527, 90367, 1, 90426, 92159, 1, 92729, 92735, 1, 92767, 92778, 11, 92779, 92781, 1, 92863, 92874, 11, 92875, 92879, 1, 92910, 92911, 1, 92918, 92927, 1, 92998, 93007, 1, 93018, 93026, 8, 93048, 93052, 1, 93072, 93503, 1, 93562, 93759, 1, 93851, 93951, 1, 94027, 94030, 1, 94088, 94094, 1, 94112, 94175, 1, 94181, 94191, 1, 94194, 94207, 1, 100344, 100351, 1, 101590, 101630, 1, 101641, 110575, 1, 110580, 110588, 8, 110591, 110883, 292, 110884, 110897, 1, 110899, 110927, 1, 110931, 110932, 1, 110934, 110947, 1, 110952, 110959, 1, 111356, 113663, 1, 113771, 113775, 1, 113789, 113791, 1, 113801, 113807, 1, 113818, 113819, 1, 113824, 117759, 1, 118010, 118015, 1, 118452, 118527, 1, 118574, 118575, 1, 118599, 118607, 1, 118724, 118783, 1, 119030, 119039, 1, 119079, 119080, 1, 119155, 119162, 1, 119275, 119295, 1, 119366, 119487, 1, 119508, 119519, 1, 119540, 119551, 1, 119639, 119647, 1, 119673, 119807, 1, 119893, 119965, 72, 119968, 119969, 1, 119971, 119972, 1, 119975, 119976, 1, 119981, 119994, 13, 119996, 120004, 8, 120070, 120075, 5, 120076, 120085, 9, 120093, 120122, 29, 120127, 120133, 6, 120135, 120137, 1, 120145, 120486, 341, 120487, 120780, 293, 120781, 121484, 703, 121485, 121498, 1, 121504, 121520, 16, 121521, 122623, 1, 122655, 122660, 1, 122667, 122879, 1, 122887, 122905, 18, 122906, 122914, 8, 122917, 122923, 6, 122924, 122927, 1, 122990, 123022, 1, 123024, 123135, 1, 123181, 123183, 1, 123198, 123199, 1, 123210, 123213, 1, 123216, 123535, 1, 123567, 123583, 1, 123642, 123646, 1, 123648, 124111, 1, 124154, 124367, 1, 124411, 124414, 1, 124416, 124895, 1, 124903, 124908, 5, 124911, 124927, 16, 125125, 125126, 1, 125143, 125183, 1, 125260, 125263, 1, 125274, 125277, 1, 125280, 126064, 1, 126133, 126208, 1, 126270, 126463, 1, 126468, 126496, 28, 126499, 126501, 2, 126502, 126504, 2, 126515, 126520, 5, 126522, 126524, 2, 126525, 126529, 1, 126531, 126534, 1, 126536, 126540, 2, 126544, 126547, 3, 126549, 126550, 1, 126552, 126560, 2, 126563, 126565, 2, 126566, 126571, 5, 126579, 126589, 5, 126591, 126602, 11, 126620, 126624, 1, 126628, 126634, 6, 126652, 126703, 1, 126706, 126975, 1, 127020, 127023, 1, 127124, 127135, 1, 127151, 127152, 1, 127168, 127184, 16, 127222, 127231, 1, 127406, 127461, 1, 127491, 127503, 1, 127548, 127551, 1, 127561, 127567, 1, 127570, 127583, 1, 127590, 127743, 1, 128728, 128731, 1, 128749, 128751, 1, 128765, 128767, 1, 128887, 128890, 1, 128986, 128991, 1, 129004, 129007, 1, 129009, 129023, 1, 129036, 129039, 1, 129096, 129103, 1, 129114, 129119, 1, 129160, 129167, 1, 129198, 129199, 1, 129212, 129215, 1, 129218, 129279, 1, 129620, 129631, 1, 129646, 129647, 1, 129661, 129663, 1, 129674, 129678, 1, 129735, 129741, 1, 129757, 129758, 1, 129770, 129775, 1, 129785, 129791, 1, 129939, 130042, 103, 130043, 131071, 1, 173792, 173823, 1, 177978, 177983, 1, 178206, 178207, 1, 183970, 183983, 1, 191457, 191471, 1, 192094, 194559, 1, 195102, 196607, 1, 201547, 201551, 1, 205744, 917759, 1, 918000, 1114111, 1]));
124
- static Cc = new UnicodeRangeTable(new Uint32Array([0, 31, 1, 127, 159, 1]));
125
- static Cf = new UnicodeRangeTable(new Uint32Array([173, 1536, 1363, 1537, 1541, 1, 1564, 1757, 193, 1807, 2192, 385, 2193, 2274, 81, 6158, 8203, 2045, 8204, 8207, 1, 8234, 8238, 1, 8288, 8292, 1, 8294, 8303, 1, 65279, 65529, 250, 65530, 65531, 1, 69821, 69837, 16, 78896, 78911, 1, 113824, 113827, 1, 119155, 119162, 1, 917505, 917536, 31, 917537, 917631, 1]));
126
- static Co = new UnicodeRangeTable(new Uint32Array([57344, 63743, 1, 983040, 1048573, 1, 1048576, 1114109, 1]));
127
- static Cs = new UnicodeRangeTable(new Uint32Array([55296, 57343, 1]));
128
- static L = new UnicodeRangeTable(new Uint32Array([65, 90, 1, 97, 122, 1, 170, 181, 11, 186, 192, 6, 193, 214, 1, 216, 246, 1, 248, 705, 1, 710, 721, 1, 736, 740, 1, 748, 750, 2, 880, 884, 1, 886, 887, 1, 890, 893, 1, 895, 902, 7, 904, 906, 1, 908, 910, 2, 911, 929, 1, 931, 1013, 1, 1015, 1153, 1, 1162, 1327, 1, 1329, 1366, 1, 1369, 1376, 7, 1377, 1416, 1, 1488, 1514, 1, 1519, 1522, 1, 1568, 1610, 1, 1646, 1647, 1, 1649, 1747, 1, 1749, 1765, 16, 1766, 1774, 8, 1775, 1786, 11, 1787, 1788, 1, 1791, 1808, 17, 1810, 1839, 1, 1869, 1957, 1, 1969, 1994, 25, 1995, 2026, 1, 2036, 2037, 1, 2042, 2048, 6, 2049, 2069, 1, 2074, 2084, 10, 2088, 2112, 24, 2113, 2136, 1, 2144, 2154, 1, 2160, 2183, 1, 2185, 2190, 1, 2208, 2249, 1, 2308, 2361, 1, 2365, 2384, 19, 2392, 2401, 1, 2417, 2432, 1, 2437, 2444, 1, 2447, 2448, 1, 2451, 2472, 1, 2474, 2480, 1, 2482, 2486, 4, 2487, 2489, 1, 2493, 2510, 17, 2524, 2525, 1, 2527, 2529, 1, 2544, 2545, 1, 2556, 2565, 9, 2566, 2570, 1, 2575, 2576, 1, 2579, 2600, 1, 2602, 2608, 1, 2610, 2611, 1, 2613, 2614, 1, 2616, 2617, 1, 2649, 2652, 1, 2654, 2674, 20, 2675, 2676, 1, 2693, 2701, 1, 2703, 2705, 1, 2707, 2728, 1, 2730, 2736, 1, 2738, 2739, 1, 2741, 2745, 1, 2749, 2768, 19, 2784, 2785, 1, 2809, 2821, 12, 2822, 2828, 1, 2831, 2832, 1, 2835, 2856, 1, 2858, 2864, 1, 2866, 2867, 1, 2869, 2873, 1, 2877, 2908, 31, 2909, 2911, 2, 2912, 2913, 1, 2929, 2947, 18, 2949, 2954, 1, 2958, 2960, 1, 2962, 2965, 1, 2969, 2970, 1, 2972, 2974, 2, 2975, 2979, 4, 2980, 2984, 4, 2985, 2986, 1, 2990, 3001, 1, 3024, 3077, 53, 3078, 3084, 1, 3086, 3088, 1, 3090, 3112, 1, 3114, 3129, 1, 3133, 3160, 27, 3161, 3162, 1, 3165, 3168, 3, 3169, 3200, 31, 3205, 3212, 1, 3214, 3216, 1, 3218, 3240, 1, 3242, 3251, 1, 3253, 3257, 1, 3261, 3293, 32, 3294, 3296, 2, 3297, 3313, 16, 3314, 3332, 18, 3333, 3340, 1, 3342, 3344, 1, 3346, 3386, 1, 3389, 3406, 17, 3412, 3414, 1, 3423, 3425, 1, 3450, 3455, 1, 3461, 3478, 1, 3482, 3505, 1, 3507, 3515, 1, 3517, 3520, 3, 3521, 3526, 1, 3585, 3632, 1, 3634, 3635, 1, 3648, 3654, 1, 3713, 3714, 1, 3716, 3718, 2, 3719, 3722, 1, 3724, 3747, 1, 3749, 3751, 2, 3752, 3760, 1, 3762, 3763, 1, 3773, 3776, 3, 3777, 3780, 1, 3782, 3804, 22, 3805, 3807, 1, 3840, 3904, 64, 3905, 3911, 1, 3913, 3948, 1, 3976, 3980, 1, 4096, 4138, 1, 4159, 4176, 17, 4177, 4181, 1, 4186, 4189, 1, 4193, 4197, 4, 4198, 4206, 8, 4207, 4208, 1, 4213, 4225, 1, 4238, 4256, 18, 4257, 4293, 1, 4295, 4301, 6, 4304, 4346, 1, 4348, 4680, 1, 4682, 4685, 1, 4688, 4694, 1, 4696, 4698, 2, 4699, 4701, 1, 4704, 4744, 1, 4746, 4749, 1, 4752, 4784, 1, 4786, 4789, 1, 4792, 4798, 1, 4800, 4802, 2, 4803, 4805, 1, 4808, 4822, 1, 4824, 4880, 1, 4882, 4885, 1, 4888, 4954, 1, 4992, 5007, 1, 5024, 5109, 1, 5112, 5117, 1, 5121, 5740, 1, 5743, 5759, 1, 5761, 5786, 1, 5792, 5866, 1, 5873, 5880, 1, 5888, 5905, 1, 5919, 5937, 1, 5952, 5969, 1, 5984, 5996, 1, 5998, 6000, 1, 6016, 6067, 1, 6103, 6108, 5, 6176, 6264, 1, 6272, 6276, 1, 6279, 6312, 1, 6314, 6320, 6, 6321, 6389, 1, 6400, 6430, 1, 6480, 6509, 1, 6512, 6516, 1, 6528, 6571, 1, 6576, 6601, 1, 6656, 6678, 1, 6688, 6740, 1, 6823, 6917, 94, 6918, 6963, 1, 6981, 6988, 1, 7043, 7072, 1, 7086, 7087, 1, 7098, 7141, 1, 7168, 7203, 1, 7245, 7247, 1, 7258, 7293, 1, 7296, 7306, 1, 7312, 7354, 1, 7357, 7359, 1, 7401, 7404, 1, 7406, 7411, 1, 7413, 7414, 1, 7418, 7424, 6, 7425, 7615, 1, 7680, 7957, 1, 7960, 7965, 1, 7968, 8005, 1, 8008, 8013, 1, 8016, 8023, 1, 8025, 8031, 2, 8032, 8061, 1, 8064, 8116, 1, 8118, 8124, 1, 8126, 8130, 4, 8131, 8132, 1, 8134, 8140, 1, 8144, 8147, 1, 8150, 8155, 1, 8160, 8172, 1, 8178, 8180, 1, 8182, 8188, 1, 8305, 8319, 14, 8336, 8348, 1, 8450, 8455, 5, 8458, 8467, 1, 8469, 8473, 4, 8474, 8477, 1, 8484, 8490, 2, 8491, 8493, 1, 8495, 8505, 1, 8508, 8511, 1, 8517, 8521, 1, 8526, 8579, 53, 8580, 11264, 2684, 11265, 11492, 1, 11499, 11502, 1, 11506, 11507, 1, 11520, 11557, 1, 11559, 11565, 6, 11568, 11623, 1, 11631, 11648, 17, 11649, 11670, 1, 11680, 11686, 1, 11688, 11694, 1, 11696, 11702, 1, 11704, 11710, 1, 11712, 11718, 1, 11720, 11726, 1, 11728, 11734, 1, 11736, 11742, 1, 11823, 12293, 470, 12294, 12337, 43, 12338, 12341, 1, 12347, 12348, 1, 12353, 12438, 1, 12445, 12447, 1, 12449, 12538, 1, 12540, 12543, 1, 12549, 12591, 1, 12593, 12686, 1, 12704, 12735, 1, 12784, 12799, 1, 13312, 19903, 1, 19968, 42124, 1, 42192, 42237, 1, 42240, 42508, 1, 42512, 42527, 1, 42538, 42539, 1, 42560, 42606, 1, 42623, 42653, 1, 42656, 42725, 1, 42775, 42783, 1, 42786, 42888, 1, 42891, 42957, 1, 42960, 42961, 1, 42963, 42965, 2, 42966, 42972, 1, 42994, 43009, 1, 43011, 43013, 1, 43015, 43018, 1, 43020, 43042, 1, 43072, 43123, 1, 43138, 43187, 1, 43250, 43255, 1, 43259, 43261, 2, 43262, 43274, 12, 43275, 43301, 1, 43312, 43334, 1, 43360, 43388, 1, 43396, 43442, 1, 43471, 43488, 17, 43489, 43492, 1, 43494, 43503, 1, 43514, 43518, 1, 43520, 43560, 1, 43584, 43586, 1, 43588, 43595, 1, 43616, 43638, 1, 43642, 43646, 4, 43647, 43695, 1, 43697, 43701, 4, 43702, 43705, 3, 43706, 43709, 1, 43712, 43714, 2, 43739, 43741, 1, 43744, 43754, 1, 43762, 43764, 1, 43777, 43782, 1, 43785, 43790, 1, 43793, 43798, 1, 43808, 43814, 1, 43816, 43822, 1, 43824, 43866, 1, 43868, 43881, 1, 43888, 44002, 1, 44032, 55203, 1, 55216, 55238, 1, 55243, 55291, 1, 63744, 64109, 1, 64112, 64217, 1, 64256, 64262, 1, 64275, 64279, 1, 64285, 64287, 2, 64288, 64296, 1, 64298, 64310, 1, 64312, 64316, 1, 64318, 64320, 2, 64321, 64323, 2, 64324, 64326, 2, 64327, 64433, 1, 64467, 64829, 1, 64848, 64911, 1, 64914, 64967, 1, 65008, 65019, 1, 65136, 65140, 1, 65142, 65276, 1, 65313, 65338, 1, 65345, 65370, 1, 65382, 65470, 1, 65474, 65479, 1, 65482, 65487, 1, 65490, 65495, 1, 65498, 65500, 1, 65536, 65547, 1, 65549, 65574, 1, 65576, 65594, 1, 65596, 65597, 1, 65599, 65613, 1, 65616, 65629, 1, 65664, 65786, 1, 66176, 66204, 1, 66208, 66256, 1, 66304, 66335, 1, 66349, 66368, 1, 66370, 66377, 1, 66384, 66421, 1, 66432, 66461, 1, 66464, 66499, 1, 66504, 66511, 1, 66560, 66717, 1, 66736, 66771, 1, 66776, 66811, 1, 66816, 66855, 1, 66864, 66915, 1, 66928, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1, 67008, 67059, 1, 67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1, 67456, 67461, 1, 67463, 67504, 1, 67506, 67514, 1, 67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3, 67648, 67669, 1, 67680, 67702, 1, 67712, 67742, 1, 67808, 67826, 1, 67828, 67829, 1, 67840, 67861, 1, 67872, 67897, 1, 67968, 68023, 1, 68030, 68031, 1, 68096, 68112, 16, 68113, 68115, 1, 68117, 68119, 1, 68121, 68149, 1, 68192, 68220, 1, 68224, 68252, 1, 68288, 68295, 1, 68297, 68324, 1, 68352, 68405, 1, 68416, 68437, 1, 68448, 68466, 1, 68480, 68497, 1, 68608, 68680, 1, 68736, 68786, 1, 68800, 68850, 1, 68864, 68899, 1, 68938, 68965, 1, 68975, 68997, 1, 69248, 69289, 1, 69296, 69297, 1, 69314, 69316, 1, 69376, 69404, 1, 69415, 69424, 9, 69425, 69445, 1, 69488, 69505, 1, 69552, 69572, 1, 69600, 69622, 1, 69635, 69687, 1, 69745, 69746, 1, 69749, 69763, 14, 69764, 69807, 1, 69840, 69864, 1, 69891, 69926, 1, 69956, 69959, 3, 69968, 70002, 1, 70006, 70019, 13, 70020, 70066, 1, 70081, 70084, 1, 70106, 70108, 2, 70144, 70161, 1, 70163, 70187, 1, 70207, 70208, 1, 70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70312, 1, 70320, 70366, 1, 70405, 70412, 1, 70415, 70416, 1, 70419, 70440, 1, 70442, 70448, 1, 70450, 70451, 1, 70453, 70457, 1, 70461, 70480, 19, 70493, 70497, 1, 70528, 70537, 1, 70539, 70542, 3, 70544, 70581, 1, 70583, 70609, 26, 70611, 70656, 45, 70657, 70708, 1, 70727, 70730, 1, 70751, 70753, 1, 70784, 70831, 1, 70852, 70853, 1, 70855, 71040, 185, 71041, 71086, 1, 71128, 71131, 1, 71168, 71215, 1, 71236, 71296, 60, 71297, 71338, 1, 71352, 71424, 72, 71425, 71450, 1, 71488, 71494, 1, 71680, 71723, 1, 71840, 71903, 1, 71935, 71942, 1, 71945, 71948, 3, 71949, 71955, 1, 71957, 71958, 1, 71960, 71983, 1, 71999, 72001, 2, 72096, 72103, 1, 72106, 72144, 1, 72161, 72163, 2, 72192, 72203, 11, 72204, 72242, 1, 72250, 72272, 22, 72284, 72329, 1, 72349, 72368, 19, 72369, 72440, 1, 72640, 72672, 1, 72704, 72712, 1, 72714, 72750, 1, 72768, 72818, 50, 72819, 72847, 1, 72960, 72966, 1, 72968, 72969, 1, 72971, 73008, 1, 73030, 73056, 26, 73057, 73061, 1, 73063, 73064, 1, 73066, 73097, 1, 73112, 73440, 328, 73441, 73458, 1, 73474, 73476, 2, 73477, 73488, 1, 73490, 73523, 1, 73648, 73728, 80, 73729, 74649, 1, 74880, 75075, 1, 77712, 77808, 1, 77824, 78895, 1, 78913, 78918, 1, 78944, 82938, 1, 82944, 83526, 1, 90368, 90397, 1, 92160, 92728, 1, 92736, 92766, 1, 92784, 92862, 1, 92880, 92909, 1, 92928, 92975, 1, 92992, 92995, 1, 93027, 93047, 1, 93053, 93071, 1, 93504, 93548, 1, 93760, 93823, 1, 93952, 94026, 1, 94032, 94099, 67, 94100, 94111, 1, 94176, 94177, 1, 94179, 94208, 29, 94209, 100343, 1, 100352, 101589, 1, 101631, 101640, 1, 110576, 110579, 1, 110581, 110587, 1, 110589, 110590, 1, 110592, 110882, 1, 110898, 110928, 30, 110929, 110930, 1, 110933, 110948, 15, 110949, 110951, 1, 110960, 111355, 1, 113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 119808, 119892, 1, 119894, 119964, 1, 119966, 119967, 1, 119970, 119973, 3, 119974, 119977, 3, 119978, 119980, 1, 119982, 119993, 1, 119995, 119997, 2, 119998, 120003, 1, 120005, 120069, 1, 120071, 120074, 1, 120077, 120084, 1, 120086, 120092, 1, 120094, 120121, 1, 120123, 120126, 1, 120128, 120132, 1, 120134, 120138, 4, 120139, 120144, 1, 120146, 120485, 1, 120488, 120512, 1, 120514, 120538, 1, 120540, 120570, 1, 120572, 120596, 1, 120598, 120628, 1, 120630, 120654, 1, 120656, 120686, 1, 120688, 120712, 1, 120714, 120744, 1, 120746, 120770, 1, 120772, 120779, 1, 122624, 122654, 1, 122661, 122666, 1, 122928, 122989, 1, 123136, 123180, 1, 123191, 123197, 1, 123214, 123536, 322, 123537, 123565, 1, 123584, 123627, 1, 124112, 124139, 1, 124368, 124397, 1, 124400, 124896, 496, 124897, 124902, 1, 124904, 124907, 1, 124909, 124910, 1, 124912, 124926, 1, 124928, 125124, 1, 125184, 125251, 1, 125259, 126464, 1205, 126465, 126467, 1, 126469, 126495, 1, 126497, 126498, 1, 126500, 126503, 3, 126505, 126514, 1, 126516, 126519, 1, 126521, 126523, 2, 126530, 126535, 5, 126537, 126541, 2, 126542, 126543, 1, 126545, 126546, 1, 126548, 126551, 3, 126553, 126561, 2, 126562, 126564, 2, 126567, 126570, 1, 126572, 126578, 1, 126580, 126583, 1, 126585, 126588, 1, 126590, 126592, 2, 126593, 126601, 1, 126603, 126619, 1, 126625, 126627, 1, 126629, 126633, 1, 126635, 126651, 1, 131072, 173791, 1, 173824, 177977, 1, 177984, 178205, 1, 178208, 183969, 1, 183984, 191456, 1, 191472, 192093, 1, 194560, 195101, 1, 196608, 201546, 1, 201552, 205743, 1]));
129
- static foldL = new UnicodeRangeTable(new Uint32Array([837, 837, 1]));
130
- static Ll = new UnicodeRangeTable(new Uint32Array([97, 122, 1, 181, 223, 42, 224, 246, 1, 248, 255, 1, 257, 311, 2, 312, 328, 2, 329, 375, 2, 378, 382, 2, 383, 384, 1, 387, 389, 2, 392, 396, 4, 397, 402, 5, 405, 409, 4, 410, 411, 1, 414, 417, 3, 419, 421, 2, 424, 426, 2, 427, 429, 2, 432, 436, 4, 438, 441, 3, 442, 445, 3, 446, 447, 1, 454, 460, 3, 462, 476, 2, 477, 495, 2, 496, 499, 3, 501, 505, 4, 507, 563, 2, 564, 569, 1, 572, 575, 3, 576, 578, 2, 583, 591, 2, 592, 659, 1, 661, 687, 1, 881, 883, 2, 887, 891, 4, 892, 893, 1, 912, 940, 28, 941, 974, 1, 976, 977, 1, 981, 983, 1, 985, 1007, 2, 1008, 1011, 1, 1013, 1019, 3, 1020, 1072, 52, 1073, 1119, 1, 1121, 1153, 2, 1163, 1215, 2, 1218, 1230, 2, 1231, 1327, 2, 1376, 1416, 1, 4304, 4346, 1, 4349, 4351, 1, 5112, 5117, 1, 7296, 7304, 1, 7306, 7424, 118, 7425, 7467, 1, 7531, 7543, 1, 7545, 7578, 1, 7681, 7829, 2, 7830, 7837, 1, 7839, 7935, 2, 7936, 7943, 1, 7952, 7957, 1, 7968, 7975, 1, 7984, 7991, 1, 8000, 8005, 1, 8016, 8023, 1, 8032, 8039, 1, 8048, 8061, 1, 8064, 8071, 1, 8080, 8087, 1, 8096, 8103, 1, 8112, 8116, 1, 8118, 8119, 1, 8126, 8130, 4, 8131, 8132, 1, 8134, 8135, 1, 8144, 8147, 1, 8150, 8151, 1, 8160, 8167, 1, 8178, 8180, 1, 8182, 8183, 1, 8458, 8462, 4, 8463, 8467, 4, 8495, 8505, 5, 8508, 8509, 1, 8518, 8521, 1, 8526, 8580, 54, 11312, 11359, 1, 11361, 11365, 4, 11366, 11372, 2, 11377, 11379, 2, 11380, 11382, 2, 11383, 11387, 1, 11393, 11491, 2, 11492, 11500, 8, 11502, 11507, 5, 11520, 11557, 1, 11559, 11565, 6, 42561, 42605, 2, 42625, 42651, 2, 42787, 42799, 2, 42800, 42801, 1, 42803, 42865, 2, 42866, 42872, 1, 42874, 42876, 2, 42879, 42887, 2, 42892, 42894, 2, 42897, 42899, 2, 42900, 42901, 1, 42903, 42921, 2, 42927, 42933, 6, 42935, 42947, 2, 42952, 42954, 2, 42957, 42961, 4, 42963, 42971, 2, 42998, 43002, 4, 43824, 43866, 1, 43872, 43880, 1, 43888, 43967, 1, 64256, 64262, 1, 64275, 64279, 1, 65345, 65370, 1, 66600, 66639, 1, 66776, 66811, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1, 68800, 68850, 1, 68976, 68997, 1, 71872, 71903, 1, 93792, 93823, 1, 119834, 119859, 1, 119886, 119892, 1, 119894, 119911, 1, 119938, 119963, 1, 119990, 119993, 1, 119995, 119997, 2, 119998, 120003, 1, 120005, 120015, 1, 120042, 120067, 1, 120094, 120119, 1, 120146, 120171, 1, 120198, 120223, 1, 120250, 120275, 1, 120302, 120327, 1, 120354, 120379, 1, 120406, 120431, 1, 120458, 120485, 1, 120514, 120538, 1, 120540, 120545, 1, 120572, 120596, 1, 120598, 120603, 1, 120630, 120654, 1, 120656, 120661, 1, 120688, 120712, 1, 120714, 120719, 1, 120746, 120770, 1, 120772, 120777, 1, 120779, 122624, 1845, 122625, 122633, 1, 122635, 122654, 1, 122661, 122666, 1, 125218, 125251, 1]));
131
- static foldLl = new UnicodeRangeTable(new Uint32Array([65, 90, 1, 192, 214, 1, 216, 222, 1, 256, 302, 2, 306, 310, 2, 313, 327, 2, 330, 376, 2, 377, 381, 2, 385, 386, 1, 388, 390, 2, 391, 393, 2, 394, 395, 1, 398, 401, 1, 403, 404, 1, 406, 408, 1, 412, 413, 1, 415, 416, 1, 418, 422, 2, 423, 425, 2, 428, 430, 2, 431, 433, 2, 434, 435, 1, 437, 439, 2, 440, 444, 4, 452, 453, 1, 455, 456, 1, 458, 459, 1, 461, 475, 2, 478, 494, 2, 497, 498, 1, 500, 502, 2, 503, 504, 1, 506, 562, 2, 570, 571, 1, 573, 574, 1, 577, 579, 2, 580, 582, 1, 584, 590, 2, 837, 880, 43, 882, 886, 4, 895, 902, 7, 904, 906, 1, 908, 910, 2, 911, 913, 2, 914, 929, 1, 931, 939, 1, 975, 984, 9, 986, 1006, 2, 1012, 1015, 3, 1017, 1018, 1, 1021, 1071, 1, 1120, 1152, 2, 1162, 1216, 2, 1217, 1229, 2, 1232, 1326, 2, 1329, 1366, 1, 4256, 4293, 1, 4295, 4301, 6, 5024, 5109, 1, 7305, 7312, 7, 7313, 7354, 1, 7357, 7359, 1, 7680, 7828, 2, 7838, 7934, 2, 7944, 7951, 1, 7960, 7965, 1, 7976, 7983, 1, 7992, 7999, 1, 8008, 8013, 1, 8025, 8031, 2, 8040, 8047, 1, 8072, 8079, 1, 8088, 8095, 1, 8104, 8111, 1, 8120, 8124, 1, 8136, 8140, 1, 8152, 8155, 1, 8168, 8172, 1, 8184, 8188, 1, 8486, 8490, 4, 8491, 8498, 7, 8579, 11264, 2685, 11265, 11311, 1, 11360, 11362, 2, 11363, 11364, 1, 11367, 11373, 2, 11374, 11376, 1, 11378, 11381, 3, 11390, 11392, 1, 11394, 11490, 2, 11499, 11501, 2, 11506, 42560, 31054, 42562, 42604, 2, 42624, 42650, 2, 42786, 42798, 2, 42802, 42862, 2, 42873, 42877, 2, 42878, 42886, 2, 42891, 42893, 2, 42896, 42898, 2, 42902, 42922, 2, 42923, 42926, 1, 42928, 42932, 1, 42934, 42948, 2, 42949, 42951, 1, 42953, 42955, 2, 42956, 42960, 4, 42966, 42972, 2, 42997, 65313, 22316, 65314, 65338, 1, 66560, 66599, 1, 66736, 66771, 1, 66928, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 68736, 68786, 1, 68944, 68965, 1, 71840, 71871, 1, 93760, 93791, 1, 125184, 125217, 1]));
132
- static Lm = new UnicodeRangeTable(new Uint32Array([688, 705, 1, 710, 721, 1, 736, 740, 1, 748, 750, 2, 884, 890, 6, 1369, 1600, 231, 1765, 1766, 1, 2036, 2037, 1, 2042, 2074, 32, 2084, 2088, 4, 2249, 2417, 168, 3654, 3782, 128, 4348, 6103, 1755, 6211, 6823, 612, 7288, 7293, 1, 7468, 7530, 1, 7544, 7579, 35, 7580, 7615, 1, 8305, 8319, 14, 8336, 8348, 1, 11388, 11389, 1, 11631, 11823, 192, 12293, 12337, 44, 12338, 12341, 1, 12347, 12445, 98, 12446, 12540, 94, 12541, 12542, 1, 40981, 42232, 1251, 42233, 42237, 1, 42508, 42623, 115, 42652, 42653, 1, 42775, 42783, 1, 42864, 42888, 24, 42994, 42996, 1, 43000, 43001, 1, 43471, 43494, 23, 43632, 43741, 109, 43763, 43764, 1, 43868, 43871, 1, 43881, 65392, 21511, 65438, 65439, 1, 67456, 67461, 1, 67463, 67504, 1, 67506, 67514, 1, 68942, 68975, 33, 92992, 92995, 1, 93504, 93506, 1, 93547, 93548, 1, 94099, 94111, 1, 94176, 94177, 1, 94179, 110576, 16397, 110577, 110579, 1, 110581, 110587, 1, 110589, 110590, 1, 122928, 122989, 1, 123191, 123197, 1, 124139, 125259, 1120]));
133
- static Lo = new UnicodeRangeTable(new Uint32Array([170, 186, 16, 443, 448, 5, 449, 451, 1, 660, 1488, 828, 1489, 1514, 1, 1519, 1522, 1, 1568, 1599, 1, 1601, 1610, 1, 1646, 1647, 1, 1649, 1747, 1, 1749, 1774, 25, 1775, 1786, 11, 1787, 1788, 1, 1791, 1808, 17, 1810, 1839, 1, 1869, 1957, 1, 1969, 1994, 25, 1995, 2026, 1, 2048, 2069, 1, 2112, 2136, 1, 2144, 2154, 1, 2160, 2183, 1, 2185, 2190, 1, 2208, 2248, 1, 2308, 2361, 1, 2365, 2384, 19, 2392, 2401, 1, 2418, 2432, 1, 2437, 2444, 1, 2447, 2448, 1, 2451, 2472, 1, 2474, 2480, 1, 2482, 2486, 4, 2487, 2489, 1, 2493, 2510, 17, 2524, 2525, 1, 2527, 2529, 1, 2544, 2545, 1, 2556, 2565, 9, 2566, 2570, 1, 2575, 2576, 1, 2579, 2600, 1, 2602, 2608, 1, 2610, 2611, 1, 2613, 2614, 1, 2616, 2617, 1, 2649, 2652, 1, 2654, 2674, 20, 2675, 2676, 1, 2693, 2701, 1, 2703, 2705, 1, 2707, 2728, 1, 2730, 2736, 1, 2738, 2739, 1, 2741, 2745, 1, 2749, 2768, 19, 2784, 2785, 1, 2809, 2821, 12, 2822, 2828, 1, 2831, 2832, 1, 2835, 2856, 1, 2858, 2864, 1, 2866, 2867, 1, 2869, 2873, 1, 2877, 2908, 31, 2909, 2911, 2, 2912, 2913, 1, 2929, 2947, 18, 2949, 2954, 1, 2958, 2960, 1, 2962, 2965, 1, 2969, 2970, 1, 2972, 2974, 2, 2975, 2979, 4, 2980, 2984, 4, 2985, 2986, 1, 2990, 3001, 1, 3024, 3077, 53, 3078, 3084, 1, 3086, 3088, 1, 3090, 3112, 1, 3114, 3129, 1, 3133, 3160, 27, 3161, 3162, 1, 3165, 3168, 3, 3169, 3200, 31, 3205, 3212, 1, 3214, 3216, 1, 3218, 3240, 1, 3242, 3251, 1, 3253, 3257, 1, 3261, 3293, 32, 3294, 3296, 2, 3297, 3313, 16, 3314, 3332, 18, 3333, 3340, 1, 3342, 3344, 1, 3346, 3386, 1, 3389, 3406, 17, 3412, 3414, 1, 3423, 3425, 1, 3450, 3455, 1, 3461, 3478, 1, 3482, 3505, 1, 3507, 3515, 1, 3517, 3520, 3, 3521, 3526, 1, 3585, 3632, 1, 3634, 3635, 1, 3648, 3653, 1, 3713, 3714, 1, 3716, 3718, 2, 3719, 3722, 1, 3724, 3747, 1, 3749, 3751, 2, 3752, 3760, 1, 3762, 3763, 1, 3773, 3776, 3, 3777, 3780, 1, 3804, 3807, 1, 3840, 3904, 64, 3905, 3911, 1, 3913, 3948, 1, 3976, 3980, 1, 4096, 4138, 1, 4159, 4176, 17, 4177, 4181, 1, 4186, 4189, 1, 4193, 4197, 4, 4198, 4206, 8, 4207, 4208, 1, 4213, 4225, 1, 4238, 4352, 114, 4353, 4680, 1, 4682, 4685, 1, 4688, 4694, 1, 4696, 4698, 2, 4699, 4701, 1, 4704, 4744, 1, 4746, 4749, 1, 4752, 4784, 1, 4786, 4789, 1, 4792, 4798, 1, 4800, 4802, 2, 4803, 4805, 1, 4808, 4822, 1, 4824, 4880, 1, 4882, 4885, 1, 4888, 4954, 1, 4992, 5007, 1, 5121, 5740, 1, 5743, 5759, 1, 5761, 5786, 1, 5792, 5866, 1, 5873, 5880, 1, 5888, 5905, 1, 5919, 5937, 1, 5952, 5969, 1, 5984, 5996, 1, 5998, 6000, 1, 6016, 6067, 1, 6108, 6176, 68, 6177, 6210, 1, 6212, 6264, 1, 6272, 6276, 1, 6279, 6312, 1, 6314, 6320, 6, 6321, 6389, 1, 6400, 6430, 1, 6480, 6509, 1, 6512, 6516, 1, 6528, 6571, 1, 6576, 6601, 1, 6656, 6678, 1, 6688, 6740, 1, 6917, 6963, 1, 6981, 6988, 1, 7043, 7072, 1, 7086, 7087, 1, 7098, 7141, 1, 7168, 7203, 1, 7245, 7247, 1, 7258, 7287, 1, 7401, 7404, 1, 7406, 7411, 1, 7413, 7414, 1, 7418, 8501, 1083, 8502, 8504, 1, 11568, 11623, 1, 11648, 11670, 1, 11680, 11686, 1, 11688, 11694, 1, 11696, 11702, 1, 11704, 11710, 1, 11712, 11718, 1, 11720, 11726, 1, 11728, 11734, 1, 11736, 11742, 1, 12294, 12348, 54, 12353, 12438, 1, 12447, 12449, 2, 12450, 12538, 1, 12543, 12549, 6, 12550, 12591, 1, 12593, 12686, 1, 12704, 12735, 1, 12784, 12799, 1, 13312, 19903, 1, 19968, 40980, 1, 40982, 42124, 1, 42192, 42231, 1, 42240, 42507, 1, 42512, 42527, 1, 42538, 42539, 1, 42606, 42656, 50, 42657, 42725, 1, 42895, 42999, 104, 43003, 43009, 1, 43011, 43013, 1, 43015, 43018, 1, 43020, 43042, 1, 43072, 43123, 1, 43138, 43187, 1, 43250, 43255, 1, 43259, 43261, 2, 43262, 43274, 12, 43275, 43301, 1, 43312, 43334, 1, 43360, 43388, 1, 43396, 43442, 1, 43488, 43492, 1, 43495, 43503, 1, 43514, 43518, 1, 43520, 43560, 1, 43584, 43586, 1, 43588, 43595, 1, 43616, 43631, 1, 43633, 43638, 1, 43642, 43646, 4, 43647, 43695, 1, 43697, 43701, 4, 43702, 43705, 3, 43706, 43709, 1, 43712, 43714, 2, 43739, 43740, 1, 43744, 43754, 1, 43762, 43777, 15, 43778, 43782, 1, 43785, 43790, 1, 43793, 43798, 1, 43808, 43814, 1, 43816, 43822, 1, 43968, 44002, 1, 44032, 55203, 1, 55216, 55238, 1, 55243, 55291, 1, 63744, 64109, 1, 64112, 64217, 1, 64285, 64287, 2, 64288, 64296, 1, 64298, 64310, 1, 64312, 64316, 1, 64318, 64320, 2, 64321, 64323, 2, 64324, 64326, 2, 64327, 64433, 1, 64467, 64829, 1, 64848, 64911, 1, 64914, 64967, 1, 65008, 65019, 1, 65136, 65140, 1, 65142, 65276, 1, 65382, 65391, 1, 65393, 65437, 1, 65440, 65470, 1, 65474, 65479, 1, 65482, 65487, 1, 65490, 65495, 1, 65498, 65500, 1, 65536, 65547, 1, 65549, 65574, 1, 65576, 65594, 1, 65596, 65597, 1, 65599, 65613, 1, 65616, 65629, 1, 65664, 65786, 1, 66176, 66204, 1, 66208, 66256, 1, 66304, 66335, 1, 66349, 66368, 1, 66370, 66377, 1, 66384, 66421, 1, 66432, 66461, 1, 66464, 66499, 1, 66504, 66511, 1, 66640, 66717, 1, 66816, 66855, 1, 66864, 66915, 1, 67008, 67059, 1, 67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1, 67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3, 67648, 67669, 1, 67680, 67702, 1, 67712, 67742, 1, 67808, 67826, 1, 67828, 67829, 1, 67840, 67861, 1, 67872, 67897, 1, 67968, 68023, 1, 68030, 68031, 1, 68096, 68112, 16, 68113, 68115, 1, 68117, 68119, 1, 68121, 68149, 1, 68192, 68220, 1, 68224, 68252, 1, 68288, 68295, 1, 68297, 68324, 1, 68352, 68405, 1, 68416, 68437, 1, 68448, 68466, 1, 68480, 68497, 1, 68608, 68680, 1, 68864, 68899, 1, 68938, 68941, 1, 68943, 69248, 305, 69249, 69289, 1, 69296, 69297, 1, 69314, 69316, 1, 69376, 69404, 1, 69415, 69424, 9, 69425, 69445, 1, 69488, 69505, 1, 69552, 69572, 1, 69600, 69622, 1, 69635, 69687, 1, 69745, 69746, 1, 69749, 69763, 14, 69764, 69807, 1, 69840, 69864, 1, 69891, 69926, 1, 69956, 69959, 3, 69968, 70002, 1, 70006, 70019, 13, 70020, 70066, 1, 70081, 70084, 1, 70106, 70108, 2, 70144, 70161, 1, 70163, 70187, 1, 70207, 70208, 1, 70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70312, 1, 70320, 70366, 1, 70405, 70412, 1, 70415, 70416, 1, 70419, 70440, 1, 70442, 70448, 1, 70450, 70451, 1, 70453, 70457, 1, 70461, 70480, 19, 70493, 70497, 1, 70528, 70537, 1, 70539, 70542, 3, 70544, 70581, 1, 70583, 70609, 26, 70611, 70656, 45, 70657, 70708, 1, 70727, 70730, 1, 70751, 70753, 1, 70784, 70831, 1, 70852, 70853, 1, 70855, 71040, 185, 71041, 71086, 1, 71128, 71131, 1, 71168, 71215, 1, 71236, 71296, 60, 71297, 71338, 1, 71352, 71424, 72, 71425, 71450, 1, 71488, 71494, 1, 71680, 71723, 1, 71935, 71942, 1, 71945, 71948, 3, 71949, 71955, 1, 71957, 71958, 1, 71960, 71983, 1, 71999, 72001, 2, 72096, 72103, 1, 72106, 72144, 1, 72161, 72163, 2, 72192, 72203, 11, 72204, 72242, 1, 72250, 72272, 22, 72284, 72329, 1, 72349, 72368, 19, 72369, 72440, 1, 72640, 72672, 1, 72704, 72712, 1, 72714, 72750, 1, 72768, 72818, 50, 72819, 72847, 1, 72960, 72966, 1, 72968, 72969, 1, 72971, 73008, 1, 73030, 73056, 26, 73057, 73061, 1, 73063, 73064, 1, 73066, 73097, 1, 73112, 73440, 328, 73441, 73458, 1, 73474, 73476, 2, 73477, 73488, 1, 73490, 73523, 1, 73648, 73728, 80, 73729, 74649, 1, 74880, 75075, 1, 77712, 77808, 1, 77824, 78895, 1, 78913, 78918, 1, 78944, 82938, 1, 82944, 83526, 1, 90368, 90397, 1, 92160, 92728, 1, 92736, 92766, 1, 92784, 92862, 1, 92880, 92909, 1, 92928, 92975, 1, 93027, 93047, 1, 93053, 93071, 1, 93507, 93546, 1, 93952, 94026, 1, 94032, 94208, 176, 94209, 100343, 1, 100352, 101589, 1, 101631, 101640, 1, 110592, 110882, 1, 110898, 110928, 30, 110929, 110930, 1, 110933, 110948, 15, 110949, 110951, 1, 110960, 111355, 1, 113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 122634, 123136, 502, 123137, 123180, 1, 123214, 123536, 322, 123537, 123565, 1, 123584, 123627, 1, 124112, 124138, 1, 124368, 124397, 1, 124400, 124896, 496, 124897, 124902, 1, 124904, 124907, 1, 124909, 124910, 1, 124912, 124926, 1, 124928, 125124, 1, 126464, 126467, 1, 126469, 126495, 1, 126497, 126498, 1, 126500, 126503, 3, 126505, 126514, 1, 126516, 126519, 1, 126521, 126523, 2, 126530, 126535, 5, 126537, 126541, 2, 126542, 126543, 1, 126545, 126546, 1, 126548, 126551, 3, 126553, 126561, 2, 126562, 126564, 2, 126567, 126570, 1, 126572, 126578, 1, 126580, 126583, 1, 126585, 126588, 1, 126590, 126592, 2, 126593, 126601, 1, 126603, 126619, 1, 126625, 126627, 1, 126629, 126633, 1, 126635, 126651, 1, 131072, 173791, 1, 173824, 177977, 1, 177984, 178205, 1, 178208, 183969, 1, 183984, 191456, 1, 191472, 192093, 1, 194560, 195101, 1, 196608, 201546, 1, 201552, 205743, 1]));
134
- static Lt = new UnicodeRangeTable(new Uint32Array([453, 459, 3, 498, 8072, 7574, 8073, 8079, 1, 8088, 8095, 1, 8104, 8111, 1, 8124, 8140, 16, 8188, 8188, 1]));
135
- static foldLt = new UnicodeRangeTable(new Uint32Array([452, 454, 2, 455, 457, 2, 458, 460, 2, 497, 499, 2, 8064, 8071, 1, 8080, 8087, 1, 8096, 8103, 1, 8115, 8131, 16, 8179, 8179, 1]));
136
- static Lu = new UnicodeRangeTable(new Uint32Array([65, 90, 1, 192, 214, 1, 216, 222, 1, 256, 310, 2, 313, 327, 2, 330, 376, 2, 377, 381, 2, 385, 386, 1, 388, 390, 2, 391, 393, 2, 394, 395, 1, 398, 401, 1, 403, 404, 1, 406, 408, 1, 412, 413, 1, 415, 416, 1, 418, 422, 2, 423, 425, 2, 428, 430, 2, 431, 433, 2, 434, 435, 1, 437, 439, 2, 440, 444, 4, 452, 461, 3, 463, 475, 2, 478, 494, 2, 497, 500, 3, 502, 504, 1, 506, 562, 2, 570, 571, 1, 573, 574, 1, 577, 579, 2, 580, 582, 1, 584, 590, 2, 880, 882, 2, 886, 895, 9, 902, 904, 2, 905, 906, 1, 908, 910, 2, 911, 913, 2, 914, 929, 1, 931, 939, 1, 975, 978, 3, 979, 980, 1, 984, 1006, 2, 1012, 1015, 3, 1017, 1018, 1, 1021, 1071, 1, 1120, 1152, 2, 1162, 1216, 2, 1217, 1229, 2, 1232, 1326, 2, 1329, 1366, 1, 4256, 4293, 1, 4295, 4301, 6, 5024, 5109, 1, 7305, 7312, 7, 7313, 7354, 1, 7357, 7359, 1, 7680, 7828, 2, 7838, 7934, 2, 7944, 7951, 1, 7960, 7965, 1, 7976, 7983, 1, 7992, 7999, 1, 8008, 8013, 1, 8025, 8031, 2, 8040, 8047, 1, 8120, 8123, 1, 8136, 8139, 1, 8152, 8155, 1, 8168, 8172, 1, 8184, 8187, 1, 8450, 8455, 5, 8459, 8461, 1, 8464, 8466, 1, 8469, 8473, 4, 8474, 8477, 1, 8484, 8490, 2, 8491, 8493, 1, 8496, 8499, 1, 8510, 8511, 1, 8517, 8579, 62, 11264, 11311, 1, 11360, 11362, 2, 11363, 11364, 1, 11367, 11373, 2, 11374, 11376, 1, 11378, 11381, 3, 11390, 11392, 1, 11394, 11490, 2, 11499, 11501, 2, 11506, 42560, 31054, 42562, 42604, 2, 42624, 42650, 2, 42786, 42798, 2, 42802, 42862, 2, 42873, 42877, 2, 42878, 42886, 2, 42891, 42893, 2, 42896, 42898, 2, 42902, 42922, 2, 42923, 42926, 1, 42928, 42932, 1, 42934, 42948, 2, 42949, 42951, 1, 42953, 42955, 2, 42956, 42960, 4, 42966, 42972, 2, 42997, 65313, 22316, 65314, 65338, 1, 66560, 66599, 1, 66736, 66771, 1, 66928, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 68736, 68786, 1, 68944, 68965, 1, 71840, 71871, 1, 93760, 93791, 1, 119808, 119833, 1, 119860, 119885, 1, 119912, 119937, 1, 119964, 119966, 2, 119967, 119973, 3, 119974, 119977, 3, 119978, 119980, 1, 119982, 119989, 1, 120016, 120041, 1, 120068, 120069, 1, 120071, 120074, 1, 120077, 120084, 1, 120086, 120092, 1, 120120, 120121, 1, 120123, 120126, 1, 120128, 120132, 1, 120134, 120138, 4, 120139, 120144, 1, 120172, 120197, 1, 120224, 120249, 1, 120276, 120301, 1, 120328, 120353, 1, 120380, 120405, 1, 120432, 120457, 1, 120488, 120512, 1, 120546, 120570, 1, 120604, 120628, 1, 120662, 120686, 1, 120720, 120744, 1, 120778, 125184, 4406, 125185, 125217, 1]));
137
- static Upper = this.Lu;
138
- static foldLu = new UnicodeRangeTable(new Uint32Array([97, 122, 1, 181, 223, 42, 224, 246, 1, 248, 255, 1, 257, 303, 2, 307, 311, 2, 314, 328, 2, 331, 375, 2, 378, 382, 2, 383, 384, 1, 387, 389, 2, 392, 396, 4, 402, 405, 3, 409, 411, 1, 414, 417, 3, 419, 421, 2, 424, 429, 5, 432, 436, 4, 438, 441, 3, 445, 447, 2, 453, 454, 1, 456, 457, 1, 459, 460, 1, 462, 476, 2, 477, 495, 2, 498, 499, 1, 501, 505, 4, 507, 543, 2, 547, 563, 2, 572, 575, 3, 576, 578, 2, 583, 591, 2, 592, 596, 1, 598, 599, 1, 601, 603, 2, 604, 608, 4, 609, 611, 2, 612, 614, 1, 616, 620, 1, 623, 625, 2, 626, 629, 3, 637, 640, 3, 642, 643, 1, 647, 652, 1, 658, 669, 11, 670, 837, 167, 881, 883, 2, 887, 891, 4, 892, 893, 1, 940, 943, 1, 945, 974, 1, 976, 977, 1, 981, 983, 1, 985, 1007, 2, 1008, 1011, 1, 1013, 1019, 3, 1072, 1119, 1, 1121, 1153, 2, 1163, 1215, 2, 1218, 1230, 2, 1231, 1327, 2, 1377, 1414, 1, 4304, 4346, 1, 4349, 4351, 1, 5112, 5117, 1, 7296, 7304, 1, 7306, 7545, 239, 7549, 7566, 17, 7681, 7829, 2, 7835, 7841, 6, 7843, 7935, 2, 7936, 7943, 1, 7952, 7957, 1, 7968, 7975, 1, 7984, 7991, 1, 8000, 8005, 1, 8017, 8023, 2, 8032, 8039, 1, 8048, 8061, 1, 8112, 8113, 1, 8126, 8144, 18, 8145, 8160, 15, 8161, 8165, 4, 8526, 8580, 54, 11312, 11359, 1, 11361, 11365, 4, 11366, 11372, 2, 11379, 11382, 3, 11393, 11491, 2, 11500, 11502, 2, 11507, 11520, 13, 11521, 11557, 1, 11559, 11565, 6, 42561, 42605, 2, 42625, 42651, 2, 42787, 42799, 2, 42803, 42863, 2, 42874, 42876, 2, 42879, 42887, 2, 42892, 42897, 5, 42899, 42900, 1, 42903, 42921, 2, 42933, 42947, 2, 42952, 42954, 2, 42957, 42961, 4, 42967, 42971, 2, 42998, 43859, 861, 43888, 43967, 1, 65345, 65370, 1, 66600, 66639, 1, 66776, 66811, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1, 68800, 68850, 1, 68976, 68997, 1, 71872, 71903, 1, 93792, 93823, 1, 125218, 125251, 1]));
139
- static M = new UnicodeRangeTable(new Uint32Array([768, 879, 1, 1155, 1161, 1, 1425, 1469, 1, 1471, 1473, 2, 1474, 1476, 2, 1477, 1479, 2, 1552, 1562, 1, 1611, 1631, 1, 1648, 1750, 102, 1751, 1756, 1, 1759, 1764, 1, 1767, 1768, 1, 1770, 1773, 1, 1809, 1840, 31, 1841, 1866, 1, 1958, 1968, 1, 2027, 2035, 1, 2045, 2070, 25, 2071, 2073, 1, 2075, 2083, 1, 2085, 2087, 1, 2089, 2093, 1, 2137, 2139, 1, 2199, 2207, 1, 2250, 2273, 1, 2275, 2307, 1, 2362, 2364, 1, 2366, 2383, 1, 2385, 2391, 1, 2402, 2403, 1, 2433, 2435, 1, 2492, 2494, 2, 2495, 2500, 1, 2503, 2504, 1, 2507, 2509, 1, 2519, 2530, 11, 2531, 2558, 27, 2561, 2563, 1, 2620, 2622, 2, 2623, 2626, 1, 2631, 2632, 1, 2635, 2637, 1, 2641, 2672, 31, 2673, 2677, 4, 2689, 2691, 1, 2748, 2750, 2, 2751, 2757, 1, 2759, 2761, 1, 2763, 2765, 1, 2786, 2787, 1, 2810, 2815, 1, 2817, 2819, 1, 2876, 2878, 2, 2879, 2884, 1, 2887, 2888, 1, 2891, 2893, 1, 2901, 2903, 1, 2914, 2915, 1, 2946, 3006, 60, 3007, 3010, 1, 3014, 3016, 1, 3018, 3021, 1, 3031, 3072, 41, 3073, 3076, 1, 3132, 3134, 2, 3135, 3140, 1, 3142, 3144, 1, 3146, 3149, 1, 3157, 3158, 1, 3170, 3171, 1, 3201, 3203, 1, 3260, 3262, 2, 3263, 3268, 1, 3270, 3272, 1, 3274, 3277, 1, 3285, 3286, 1, 3298, 3299, 1, 3315, 3328, 13, 3329, 3331, 1, 3387, 3388, 1, 3390, 3396, 1, 3398, 3400, 1, 3402, 3405, 1, 3415, 3426, 11, 3427, 3457, 30, 3458, 3459, 1, 3530, 3535, 5, 3536, 3540, 1, 3542, 3544, 2, 3545, 3551, 1, 3570, 3571, 1, 3633, 3636, 3, 3637, 3642, 1, 3655, 3662, 1, 3761, 3764, 3, 3765, 3772, 1, 3784, 3790, 1, 3864, 3865, 1, 3893, 3897, 2, 3902, 3903, 1, 3953, 3972, 1, 3974, 3975, 1, 3981, 3991, 1, 3993, 4028, 1, 4038, 4139, 101, 4140, 4158, 1, 4182, 4185, 1, 4190, 4192, 1, 4194, 4196, 1, 4199, 4205, 1, 4209, 4212, 1, 4226, 4237, 1, 4239, 4250, 11, 4251, 4253, 1, 4957, 4959, 1, 5906, 5909, 1, 5938, 5940, 1, 5970, 5971, 1, 6002, 6003, 1, 6068, 6099, 1, 6109, 6155, 46, 6156, 6157, 1, 6159, 6277, 118, 6278, 6313, 35, 6432, 6443, 1, 6448, 6459, 1, 6679, 6683, 1, 6741, 6750, 1, 6752, 6780, 1, 6783, 6832, 49, 6833, 6862, 1, 6912, 6916, 1, 6964, 6980, 1, 7019, 7027, 1, 7040, 7042, 1, 7073, 7085, 1, 7142, 7155, 1, 7204, 7223, 1, 7376, 7378, 1, 7380, 7400, 1, 7405, 7412, 7, 7415, 7417, 1, 7616, 7679, 1, 8400, 8432, 1, 11503, 11505, 1, 11647, 11744, 97, 11745, 11775, 1, 12330, 12335, 1, 12441, 12442, 1, 42607, 42610, 1, 42612, 42621, 1, 42654, 42655, 1, 42736, 42737, 1, 43010, 43014, 4, 43019, 43043, 24, 43044, 43047, 1, 43052, 43136, 84, 43137, 43188, 51, 43189, 43205, 1, 43232, 43249, 1, 43263, 43302, 39, 43303, 43309, 1, 43335, 43347, 1, 43392, 43395, 1, 43443, 43456, 1, 43493, 43561, 68, 43562, 43574, 1, 43587, 43596, 9, 43597, 43643, 46, 43644, 43645, 1, 43696, 43698, 2, 43699, 43700, 1, 43703, 43704, 1, 43710, 43711, 1, 43713, 43755, 42, 43756, 43759, 1, 43765, 43766, 1, 44003, 44010, 1, 44012, 44013, 1, 64286, 65024, 738, 65025, 65039, 1, 65056, 65071, 1, 66045, 66272, 227, 66422, 66426, 1, 68097, 68099, 1, 68101, 68102, 1, 68108, 68111, 1, 68152, 68154, 1, 68159, 68325, 166, 68326, 68900, 574, 68901, 68903, 1, 68969, 68973, 1, 69291, 69292, 1, 69372, 69375, 1, 69446, 69456, 1, 69506, 69509, 1, 69632, 69634, 1, 69688, 69702, 1, 69744, 69747, 3, 69748, 69759, 11, 69760, 69762, 1, 69808, 69818, 1, 69826, 69888, 62, 69889, 69890, 1, 69927, 69940, 1, 69957, 69958, 1, 70003, 70016, 13, 70017, 70018, 1, 70067, 70080, 1, 70089, 70092, 1, 70094, 70095, 1, 70188, 70199, 1, 70206, 70209, 3, 70367, 70378, 1, 70400, 70403, 1, 70459, 70460, 1, 70462, 70468, 1, 70471, 70472, 1, 70475, 70477, 1, 70487, 70498, 11, 70499, 70502, 3, 70503, 70508, 1, 70512, 70516, 1, 70584, 70592, 1, 70594, 70597, 3, 70599, 70602, 1, 70604, 70608, 1, 70610, 70625, 15, 70626, 70709, 83, 70710, 70726, 1, 70750, 70832, 82, 70833, 70851, 1, 71087, 71093, 1, 71096, 71104, 1, 71132, 71133, 1, 71216, 71232, 1, 71339, 71351, 1, 71453, 71467, 1, 71724, 71738, 1, 71984, 71989, 1, 71991, 71992, 1, 71995, 71998, 1, 72000, 72002, 2, 72003, 72145, 142, 72146, 72151, 1, 72154, 72160, 1, 72164, 72193, 29, 72194, 72202, 1, 72243, 72249, 1, 72251, 72254, 1, 72263, 72273, 10, 72274, 72283, 1, 72330, 72345, 1, 72751, 72758, 1, 72760, 72767, 1, 72850, 72871, 1, 72873, 72886, 1, 73009, 73014, 1, 73018, 73020, 2, 73021, 73023, 2, 73024, 73029, 1, 73031, 73098, 67, 73099, 73102, 1, 73104, 73105, 1, 73107, 73111, 1, 73459, 73462, 1, 73472, 73473, 1, 73475, 73524, 49, 73525, 73530, 1, 73534, 73538, 1, 73562, 78912, 5350, 78919, 78933, 1, 90398, 90415, 1, 92912, 92916, 1, 92976, 92982, 1, 94031, 94033, 2, 94034, 94087, 1, 94095, 94098, 1, 94180, 94192, 12, 94193, 113821, 19628, 113822, 118528, 4706, 118529, 118573, 1, 118576, 118598, 1, 119141, 119145, 1, 119149, 119154, 1, 119163, 119170, 1, 119173, 119179, 1, 119210, 119213, 1, 119362, 119364, 1, 121344, 121398, 1, 121403, 121452, 1, 121461, 121476, 15, 121499, 121503, 1, 121505, 121519, 1, 122880, 122886, 1, 122888, 122904, 1, 122907, 122913, 1, 122915, 122916, 1, 122918, 122922, 1, 123023, 123184, 161, 123185, 123190, 1, 123566, 123628, 62, 123629, 123631, 1, 124140, 124143, 1, 124398, 124399, 1, 125136, 125142, 1, 125252, 125258, 1, 917760, 917999, 1]));
140
- static foldM = new UnicodeRangeTable(new Uint32Array([921, 953, 32, 8126, 8126, 1]));
141
- static Mc = new UnicodeRangeTable(new Uint32Array([2307, 2363, 56, 2366, 2368, 1, 2377, 2380, 1, 2382, 2383, 1, 2434, 2435, 1, 2494, 2496, 1, 2503, 2504, 1, 2507, 2508, 1, 2519, 2563, 44, 2622, 2624, 1, 2691, 2750, 59, 2751, 2752, 1, 2761, 2763, 2, 2764, 2818, 54, 2819, 2878, 59, 2880, 2887, 7, 2888, 2891, 3, 2892, 2903, 11, 3006, 3007, 1, 3009, 3010, 1, 3014, 3016, 1, 3018, 3020, 1, 3031, 3073, 42, 3074, 3075, 1, 3137, 3140, 1, 3202, 3203, 1, 3262, 3264, 2, 3265, 3268, 1, 3271, 3272, 1, 3274, 3275, 1, 3285, 3286, 1, 3315, 3330, 15, 3331, 3390, 59, 3391, 3392, 1, 3398, 3400, 1, 3402, 3404, 1, 3415, 3458, 43, 3459, 3535, 76, 3536, 3537, 1, 3544, 3551, 1, 3570, 3571, 1, 3902, 3903, 1, 3967, 4139, 172, 4140, 4145, 5, 4152, 4155, 3, 4156, 4182, 26, 4183, 4194, 11, 4195, 4196, 1, 4199, 4205, 1, 4227, 4228, 1, 4231, 4236, 1, 4239, 4250, 11, 4251, 4252, 1, 5909, 5940, 31, 6070, 6078, 8, 6079, 6085, 1, 6087, 6088, 1, 6435, 6438, 1, 6441, 6443, 1, 6448, 6449, 1, 6451, 6456, 1, 6681, 6682, 1, 6741, 6743, 2, 6753, 6755, 2, 6756, 6765, 9, 6766, 6770, 1, 6916, 6965, 49, 6971, 6973, 2, 6974, 6977, 1, 6979, 6980, 1, 7042, 7073, 31, 7078, 7079, 1, 7082, 7143, 61, 7146, 7148, 1, 7150, 7154, 4, 7155, 7204, 49, 7205, 7211, 1, 7220, 7221, 1, 7393, 7415, 22, 12334, 12335, 1, 43043, 43044, 1, 43047, 43136, 89, 43137, 43188, 51, 43189, 43203, 1, 43346, 43347, 1, 43395, 43444, 49, 43445, 43450, 5, 43451, 43454, 3, 43455, 43456, 1, 43567, 43568, 1, 43571, 43572, 1, 43597, 43643, 46, 43645, 43755, 110, 43758, 43759, 1, 43765, 44003, 238, 44004, 44006, 2, 44007, 44009, 2, 44010, 44012, 2, 69632, 69634, 2, 69762, 69808, 46, 69809, 69810, 1, 69815, 69816, 1, 69932, 69957, 25, 69958, 70018, 60, 70067, 70069, 1, 70079, 70080, 1, 70094, 70188, 94, 70189, 70190, 1, 70194, 70195, 1, 70197, 70368, 171, 70369, 70370, 1, 70402, 70403, 1, 70462, 70463, 1, 70465, 70468, 1, 70471, 70472, 1, 70475, 70477, 1, 70487, 70498, 11, 70499, 70584, 85, 70585, 70586, 1, 70594, 70597, 3, 70599, 70602, 1, 70604, 70605, 1, 70607, 70709, 102, 70710, 70711, 1, 70720, 70721, 1, 70725, 70832, 107, 70833, 70834, 1, 70841, 70843, 2, 70844, 70846, 1, 70849, 71087, 238, 71088, 71089, 1, 71096, 71099, 1, 71102, 71216, 114, 71217, 71218, 1, 71227, 71228, 1, 71230, 71340, 110, 71342, 71343, 1, 71350, 71454, 104, 71456, 71457, 1, 71462, 71724, 262, 71725, 71726, 1, 71736, 71984, 248, 71985, 71989, 1, 71991, 71992, 1, 71997, 72000, 3, 72002, 72145, 143, 72146, 72147, 1, 72156, 72159, 1, 72164, 72249, 85, 72279, 72280, 1, 72343, 72751, 408, 72766, 72873, 107, 72881, 72884, 3, 73098, 73102, 1, 73107, 73108, 1, 73110, 73461, 351, 73462, 73475, 13, 73524, 73525, 1, 73534, 73535, 1, 73537, 90410, 16873, 90411, 90412, 1, 94033, 94087, 1, 94192, 94193, 1, 119141, 119142, 1, 119149, 119154, 1]));
142
- static Me = new UnicodeRangeTable(new Uint32Array([1160, 1161, 1, 6846, 8413, 1567, 8414, 8416, 1, 8418, 8420, 1, 42608, 42610, 1]));
143
- static Mn = new UnicodeRangeTable(new Uint32Array([768, 879, 1, 1155, 1159, 1, 1425, 1469, 1, 1471, 1473, 2, 1474, 1476, 2, 1477, 1479, 2, 1552, 1562, 1, 1611, 1631, 1, 1648, 1750, 102, 1751, 1756, 1, 1759, 1764, 1, 1767, 1768, 1, 1770, 1773, 1, 1809, 1840, 31, 1841, 1866, 1, 1958, 1968, 1, 2027, 2035, 1, 2045, 2070, 25, 2071, 2073, 1, 2075, 2083, 1, 2085, 2087, 1, 2089, 2093, 1, 2137, 2139, 1, 2199, 2207, 1, 2250, 2273, 1, 2275, 2306, 1, 2362, 2364, 2, 2369, 2376, 1, 2381, 2385, 4, 2386, 2391, 1, 2402, 2403, 1, 2433, 2492, 59, 2497, 2500, 1, 2509, 2530, 21, 2531, 2558, 27, 2561, 2562, 1, 2620, 2625, 5, 2626, 2631, 5, 2632, 2635, 3, 2636, 2637, 1, 2641, 2672, 31, 2673, 2677, 4, 2689, 2690, 1, 2748, 2753, 5, 2754, 2757, 1, 2759, 2760, 1, 2765, 2786, 21, 2787, 2810, 23, 2811, 2815, 1, 2817, 2876, 59, 2879, 2881, 2, 2882, 2884, 1, 2893, 2901, 8, 2902, 2914, 12, 2915, 2946, 31, 3008, 3021, 13, 3072, 3076, 4, 3132, 3134, 2, 3135, 3136, 1, 3142, 3144, 1, 3146, 3149, 1, 3157, 3158, 1, 3170, 3171, 1, 3201, 3260, 59, 3263, 3270, 7, 3276, 3277, 1, 3298, 3299, 1, 3328, 3329, 1, 3387, 3388, 1, 3393, 3396, 1, 3405, 3426, 21, 3427, 3457, 30, 3530, 3538, 8, 3539, 3540, 1, 3542, 3633, 91, 3636, 3642, 1, 3655, 3662, 1, 3761, 3764, 3, 3765, 3772, 1, 3784, 3790, 1, 3864, 3865, 1, 3893, 3897, 2, 3953, 3966, 1, 3968, 3972, 1, 3974, 3975, 1, 3981, 3991, 1, 3993, 4028, 1, 4038, 4141, 103, 4142, 4144, 1, 4146, 4151, 1, 4153, 4154, 1, 4157, 4158, 1, 4184, 4185, 1, 4190, 4192, 1, 4209, 4212, 1, 4226, 4229, 3, 4230, 4237, 7, 4253, 4957, 704, 4958, 4959, 1, 5906, 5908, 1, 5938, 5939, 1, 5970, 5971, 1, 6002, 6003, 1, 6068, 6069, 1, 6071, 6077, 1, 6086, 6089, 3, 6090, 6099, 1, 6109, 6155, 46, 6156, 6157, 1, 6159, 6277, 118, 6278, 6313, 35, 6432, 6434, 1, 6439, 6440, 1, 6450, 6457, 7, 6458, 6459, 1, 6679, 6680, 1, 6683, 6742, 59, 6744, 6750, 1, 6752, 6754, 2, 6757, 6764, 1, 6771, 6780, 1, 6783, 6832, 49, 6833, 6845, 1, 6847, 6862, 1, 6912, 6915, 1, 6964, 6966, 2, 6967, 6970, 1, 6972, 6978, 6, 7019, 7027, 1, 7040, 7041, 1, 7074, 7077, 1, 7080, 7081, 1, 7083, 7085, 1, 7142, 7144, 2, 7145, 7149, 4, 7151, 7153, 1, 7212, 7219, 1, 7222, 7223, 1, 7376, 7378, 1, 7380, 7392, 1, 7394, 7400, 1, 7405, 7412, 7, 7416, 7417, 1, 7616, 7679, 1, 8400, 8412, 1, 8417, 8421, 4, 8422, 8432, 1, 11503, 11505, 1, 11647, 11744, 97, 11745, 11775, 1, 12330, 12333, 1, 12441, 12442, 1, 42607, 42612, 5, 42613, 42621, 1, 42654, 42655, 1, 42736, 42737, 1, 43010, 43014, 4, 43019, 43045, 26, 43046, 43052, 6, 43204, 43205, 1, 43232, 43249, 1, 43263, 43302, 39, 43303, 43309, 1, 43335, 43345, 1, 43392, 43394, 1, 43443, 43446, 3, 43447, 43449, 1, 43452, 43453, 1, 43493, 43561, 68, 43562, 43566, 1, 43569, 43570, 1, 43573, 43574, 1, 43587, 43596, 9, 43644, 43696, 52, 43698, 43700, 1, 43703, 43704, 1, 43710, 43711, 1, 43713, 43756, 43, 43757, 43766, 9, 44005, 44008, 3, 44013, 64286, 20273, 65024, 65039, 1, 65056, 65071, 1, 66045, 66272, 227, 66422, 66426, 1, 68097, 68099, 1, 68101, 68102, 1, 68108, 68111, 1, 68152, 68154, 1, 68159, 68325, 166, 68326, 68900, 574, 68901, 68903, 1, 68969, 68973, 1, 69291, 69292, 1, 69372, 69375, 1, 69446, 69456, 1, 69506, 69509, 1, 69633, 69688, 55, 69689, 69702, 1, 69744, 69747, 3, 69748, 69759, 11, 69760, 69761, 1, 69811, 69814, 1, 69817, 69818, 1, 69826, 69888, 62, 69889, 69890, 1, 69927, 69931, 1, 69933, 69940, 1, 70003, 70016, 13, 70017, 70070, 53, 70071, 70078, 1, 70089, 70092, 1, 70095, 70191, 96, 70192, 70193, 1, 70196, 70198, 2, 70199, 70206, 7, 70209, 70367, 158, 70371, 70378, 1, 70400, 70401, 1, 70459, 70460, 1, 70464, 70502, 38, 70503, 70508, 1, 70512, 70516, 1, 70587, 70592, 1, 70606, 70610, 2, 70625, 70626, 1, 70712, 70719, 1, 70722, 70724, 1, 70726, 70750, 24, 70835, 70840, 1, 70842, 70847, 5, 70848, 70850, 2, 70851, 71090, 239, 71091, 71093, 1, 71100, 71101, 1, 71103, 71104, 1, 71132, 71133, 1, 71219, 71226, 1, 71229, 71231, 2, 71232, 71339, 107, 71341, 71344, 3, 71345, 71349, 1, 71351, 71453, 102, 71455, 71458, 3, 71459, 71461, 1, 71463, 71467, 1, 71727, 71735, 1, 71737, 71738, 1, 71995, 71996, 1, 71998, 72003, 5, 72148, 72151, 1, 72154, 72155, 1, 72160, 72193, 33, 72194, 72202, 1, 72243, 72248, 1, 72251, 72254, 1, 72263, 72273, 10, 72274, 72278, 1, 72281, 72283, 1, 72330, 72342, 1, 72344, 72345, 1, 72752, 72758, 1, 72760, 72765, 1, 72767, 72850, 83, 72851, 72871, 1, 72874, 72880, 1, 72882, 72883, 1, 72885, 72886, 1, 73009, 73014, 1, 73018, 73020, 2, 73021, 73023, 2, 73024, 73029, 1, 73031, 73104, 73, 73105, 73109, 4, 73111, 73459, 348, 73460, 73472, 12, 73473, 73526, 53, 73527, 73530, 1, 73536, 73538, 2, 73562, 78912, 5350, 78919, 78933, 1, 90398, 90409, 1, 90413, 90415, 1, 92912, 92916, 1, 92976, 92982, 1, 94031, 94095, 64, 94096, 94098, 1, 94180, 113821, 19641, 113822, 118528, 4706, 118529, 118573, 1, 118576, 118598, 1, 119143, 119145, 1, 119163, 119170, 1, 119173, 119179, 1, 119210, 119213, 1, 119362, 119364, 1, 121344, 121398, 1, 121403, 121452, 1, 121461, 121476, 15, 121499, 121503, 1, 121505, 121519, 1, 122880, 122886, 1, 122888, 122904, 1, 122907, 122913, 1, 122915, 122916, 1, 122918, 122922, 1, 123023, 123184, 161, 123185, 123190, 1, 123566, 123628, 62, 123629, 123631, 1, 124140, 124143, 1, 124398, 124399, 1, 125136, 125142, 1, 125252, 125258, 1, 917760, 917999, 1]));
144
- static foldMn = new UnicodeRangeTable(new Uint32Array([921, 953, 32, 8126, 8126, 1]));
145
- static N = new UnicodeRangeTable(new Uint32Array([48, 57, 1, 178, 179, 1, 185, 188, 3, 189, 190, 1, 1632, 1641, 1, 1776, 1785, 1, 1984, 1993, 1, 2406, 2415, 1, 2534, 2543, 1, 2548, 2553, 1, 2662, 2671, 1, 2790, 2799, 1, 2918, 2927, 1, 2930, 2935, 1, 3046, 3058, 1, 3174, 3183, 1, 3192, 3198, 1, 3302, 3311, 1, 3416, 3422, 1, 3430, 3448, 1, 3558, 3567, 1, 3664, 3673, 1, 3792, 3801, 1, 3872, 3891, 1, 4160, 4169, 1, 4240, 4249, 1, 4969, 4988, 1, 5870, 5872, 1, 6112, 6121, 1, 6128, 6137, 1, 6160, 6169, 1, 6470, 6479, 1, 6608, 6618, 1, 6784, 6793, 1, 6800, 6809, 1, 6992, 7001, 1, 7088, 7097, 1, 7232, 7241, 1, 7248, 7257, 1, 8304, 8308, 4, 8309, 8313, 1, 8320, 8329, 1, 8528, 8578, 1, 8581, 8585, 1, 9312, 9371, 1, 9450, 9471, 1, 10102, 10131, 1, 11517, 12295, 778, 12321, 12329, 1, 12344, 12346, 1, 12690, 12693, 1, 12832, 12841, 1, 12872, 12879, 1, 12881, 12895, 1, 12928, 12937, 1, 12977, 12991, 1, 42528, 42537, 1, 42726, 42735, 1, 43056, 43061, 1, 43216, 43225, 1, 43264, 43273, 1, 43472, 43481, 1, 43504, 43513, 1, 43600, 43609, 1, 44016, 44025, 1, 65296, 65305, 1, 65799, 65843, 1, 65856, 65912, 1, 65930, 65931, 1, 66273, 66299, 1, 66336, 66339, 1, 66369, 66378, 9, 66513, 66517, 1, 66720, 66729, 1, 67672, 67679, 1, 67705, 67711, 1, 67751, 67759, 1, 67835, 67839, 1, 67862, 67867, 1, 68028, 68029, 1, 68032, 68047, 1, 68050, 68095, 1, 68160, 68168, 1, 68221, 68222, 1, 68253, 68255, 1, 68331, 68335, 1, 68440, 68447, 1, 68472, 68479, 1, 68521, 68527, 1, 68858, 68863, 1, 68912, 68921, 1, 68928, 68937, 1, 69216, 69246, 1, 69405, 69414, 1, 69457, 69460, 1, 69573, 69579, 1, 69714, 69743, 1, 69872, 69881, 1, 69942, 69951, 1, 70096, 70105, 1, 70113, 70132, 1, 70384, 70393, 1, 70736, 70745, 1, 70864, 70873, 1, 71248, 71257, 1, 71360, 71369, 1, 71376, 71395, 1, 71472, 71483, 1, 71904, 71922, 1, 72016, 72025, 1, 72688, 72697, 1, 72784, 72812, 1, 73040, 73049, 1, 73120, 73129, 1, 73552, 73561, 1, 73664, 73684, 1, 74752, 74862, 1, 90416, 90425, 1, 92768, 92777, 1, 92864, 92873, 1, 93008, 93017, 1, 93019, 93025, 1, 93552, 93561, 1, 93824, 93846, 1, 118000, 118009, 1, 119488, 119507, 1, 119520, 119539, 1, 119648, 119672, 1, 120782, 120831, 1, 123200, 123209, 1, 123632, 123641, 1, 124144, 124153, 1, 124401, 124410, 1, 125127, 125135, 1, 125264, 125273, 1, 126065, 126123, 1, 126125, 126127, 1, 126129, 126132, 1, 126209, 126253, 1, 126255, 126269, 1, 127232, 127244, 1, 130032, 130041, 1]));
146
- static Nd = new UnicodeRangeTable(new Uint32Array([48, 57, 1, 1632, 1641, 1, 1776, 1785, 1, 1984, 1993, 1, 2406, 2415, 1, 2534, 2543, 1, 2662, 2671, 1, 2790, 2799, 1, 2918, 2927, 1, 3046, 3055, 1, 3174, 3183, 1, 3302, 3311, 1, 3430, 3439, 1, 3558, 3567, 1, 3664, 3673, 1, 3792, 3801, 1, 3872, 3881, 1, 4160, 4169, 1, 4240, 4249, 1, 6112, 6121, 1, 6160, 6169, 1, 6470, 6479, 1, 6608, 6617, 1, 6784, 6793, 1, 6800, 6809, 1, 6992, 7001, 1, 7088, 7097, 1, 7232, 7241, 1, 7248, 7257, 1, 42528, 42537, 1, 43216, 43225, 1, 43264, 43273, 1, 43472, 43481, 1, 43504, 43513, 1, 43600, 43609, 1, 44016, 44025, 1, 65296, 65305, 1, 66720, 66729, 1, 68912, 68921, 1, 68928, 68937, 1, 69734, 69743, 1, 69872, 69881, 1, 69942, 69951, 1, 70096, 70105, 1, 70384, 70393, 1, 70736, 70745, 1, 70864, 70873, 1, 71248, 71257, 1, 71360, 71369, 1, 71376, 71395, 1, 71472, 71481, 1, 71904, 71913, 1, 72016, 72025, 1, 72688, 72697, 1, 72784, 72793, 1, 73040, 73049, 1, 73120, 73129, 1, 73552, 73561, 1, 90416, 90425, 1, 92768, 92777, 1, 92864, 92873, 1, 93008, 93017, 1, 93552, 93561, 1, 118000, 118009, 1, 120782, 120831, 1, 123200, 123209, 1, 123632, 123641, 1, 124144, 124153, 1, 124401, 124410, 1, 125264, 125273, 1, 130032, 130041, 1]));
147
- static Nl = new UnicodeRangeTable(new Uint32Array([5870, 5872, 1, 8544, 8578, 1, 8581, 8584, 1, 12295, 12321, 26, 12322, 12329, 1, 12344, 12346, 1, 42726, 42735, 1, 65856, 65908, 1, 66369, 66378, 9, 66513, 66517, 1, 74752, 74862, 1]));
148
- static No = new UnicodeRangeTable(new Uint32Array([178, 179, 1, 185, 188, 3, 189, 190, 1, 2548, 2553, 1, 2930, 2935, 1, 3056, 3058, 1, 3192, 3198, 1, 3416, 3422, 1, 3440, 3448, 1, 3882, 3891, 1, 4969, 4988, 1, 6128, 6137, 1, 6618, 8304, 1686, 8308, 8313, 1, 8320, 8329, 1, 8528, 8543, 1, 8585, 9312, 727, 9313, 9371, 1, 9450, 9471, 1, 10102, 10131, 1, 11517, 12690, 1173, 12691, 12693, 1, 12832, 12841, 1, 12872, 12879, 1, 12881, 12895, 1, 12928, 12937, 1, 12977, 12991, 1, 43056, 43061, 1, 65799, 65843, 1, 65909, 65912, 1, 65930, 65931, 1, 66273, 66299, 1, 66336, 66339, 1, 67672, 67679, 1, 67705, 67711, 1, 67751, 67759, 1, 67835, 67839, 1, 67862, 67867, 1, 68028, 68029, 1, 68032, 68047, 1, 68050, 68095, 1, 68160, 68168, 1, 68221, 68222, 1, 68253, 68255, 1, 68331, 68335, 1, 68440, 68447, 1, 68472, 68479, 1, 68521, 68527, 1, 68858, 68863, 1, 69216, 69246, 1, 69405, 69414, 1, 69457, 69460, 1, 69573, 69579, 1, 69714, 69733, 1, 70113, 70132, 1, 71482, 71483, 1, 71914, 71922, 1, 72794, 72812, 1, 73664, 73684, 1, 93019, 93025, 1, 93824, 93846, 1, 119488, 119507, 1, 119520, 119539, 1, 119648, 119672, 1, 125127, 125135, 1, 126065, 126123, 1, 126125, 126127, 1, 126129, 126132, 1, 126209, 126253, 1, 126255, 126269, 1, 127232, 127244, 1]));
149
- static P = new UnicodeRangeTable(new Uint32Array([33, 35, 1, 37, 42, 1, 44, 47, 1, 58, 59, 1, 63, 64, 1, 91, 93, 1, 95, 123, 28, 125, 161, 36, 167, 171, 4, 182, 183, 1, 187, 191, 4, 894, 903, 9, 1370, 1375, 1, 1417, 1418, 1, 1470, 1472, 2, 1475, 1478, 3, 1523, 1524, 1, 1545, 1546, 1, 1548, 1549, 1, 1563, 1565, 2, 1566, 1567, 1, 1642, 1645, 1, 1748, 1792, 44, 1793, 1805, 1, 2039, 2041, 1, 2096, 2110, 1, 2142, 2404, 262, 2405, 2416, 11, 2557, 2678, 121, 2800, 3191, 391, 3204, 3572, 368, 3663, 3674, 11, 3675, 3844, 169, 3845, 3858, 1, 3860, 3898, 38, 3899, 3901, 1, 3973, 4048, 75, 4049, 4052, 1, 4057, 4058, 1, 4170, 4175, 1, 4347, 4960, 613, 4961, 4968, 1, 5120, 5742, 622, 5787, 5788, 1, 5867, 5869, 1, 5941, 5942, 1, 6100, 6102, 1, 6104, 6106, 1, 6144, 6154, 1, 6468, 6469, 1, 6686, 6687, 1, 6816, 6822, 1, 6824, 6829, 1, 6990, 6991, 1, 7002, 7008, 1, 7037, 7039, 1, 7164, 7167, 1, 7227, 7231, 1, 7294, 7295, 1, 7360, 7367, 1, 7379, 8208, 829, 8209, 8231, 1, 8240, 8259, 1, 8261, 8273, 1, 8275, 8286, 1, 8317, 8318, 1, 8333, 8334, 1, 8968, 8971, 1, 9001, 9002, 1, 10088, 10101, 1, 10181, 10182, 1, 10214, 10223, 1, 10627, 10648, 1, 10712, 10715, 1, 10748, 10749, 1, 11513, 11516, 1, 11518, 11519, 1, 11632, 11776, 144, 11777, 11822, 1, 11824, 11855, 1, 11858, 11869, 1, 12289, 12291, 1, 12296, 12305, 1, 12308, 12319, 1, 12336, 12349, 13, 12448, 12539, 91, 42238, 42239, 1, 42509, 42511, 1, 42611, 42622, 11, 42738, 42743, 1, 43124, 43127, 1, 43214, 43215, 1, 43256, 43258, 1, 43260, 43310, 50, 43311, 43359, 48, 43457, 43469, 1, 43486, 43487, 1, 43612, 43615, 1, 43742, 43743, 1, 43760, 43761, 1, 44011, 64830, 20819, 64831, 65040, 209, 65041, 65049, 1, 65072, 65106, 1, 65108, 65121, 1, 65123, 65128, 5, 65130, 65131, 1, 65281, 65283, 1, 65285, 65290, 1, 65292, 65295, 1, 65306, 65307, 1, 65311, 65312, 1, 65339, 65341, 1, 65343, 65371, 28, 65373, 65375, 2, 65376, 65381, 1, 65792, 65794, 1, 66463, 66512, 49, 66927, 67671, 744, 67871, 67903, 32, 68176, 68184, 1, 68223, 68336, 113, 68337, 68342, 1, 68409, 68415, 1, 68505, 68508, 1, 68974, 69293, 319, 69461, 69465, 1, 69510, 69513, 1, 69703, 69709, 1, 69819, 69820, 1, 69822, 69825, 1, 69952, 69955, 1, 70004, 70005, 1, 70085, 70088, 1, 70093, 70107, 14, 70109, 70111, 1, 70200, 70205, 1, 70313, 70612, 299, 70613, 70615, 2, 70616, 70731, 115, 70732, 70735, 1, 70746, 70747, 1, 70749, 70854, 105, 71105, 71127, 1, 71233, 71235, 1, 71264, 71276, 1, 71353, 71484, 131, 71485, 71486, 1, 71739, 72004, 265, 72005, 72006, 1, 72162, 72255, 93, 72256, 72262, 1, 72346, 72348, 1, 72350, 72354, 1, 72448, 72457, 1, 72673, 72769, 96, 72770, 72773, 1, 72816, 72817, 1, 73463, 73464, 1, 73539, 73551, 1, 73727, 74864, 1137, 74865, 74868, 1, 77809, 77810, 1, 92782, 92783, 1, 92917, 92983, 66, 92984, 92987, 1, 92996, 93549, 553, 93550, 93551, 1, 93847, 93850, 1, 94178, 113823, 19645, 121479, 121483, 1, 124415, 125278, 863, 125279, 125279, 1]));
150
- static Pc = new UnicodeRangeTable(new Uint32Array([95, 8255, 8160, 8256, 8276, 20, 65075, 65076, 1, 65101, 65103, 1, 65343, 65343, 1]));
151
- static Pd = new UnicodeRangeTable(new Uint32Array([45, 1418, 1373, 1470, 5120, 3650, 6150, 8208, 2058, 8209, 8213, 1, 11799, 11802, 3, 11834, 11835, 1, 11840, 11869, 29, 12316, 12336, 20, 12448, 65073, 52625, 65074, 65112, 38, 65123, 65293, 170, 68974, 69293, 319]));
152
- static Pe = new UnicodeRangeTable(new Uint32Array([41, 93, 52, 125, 3899, 3774, 3901, 5788, 1887, 8262, 8318, 56, 8334, 8969, 635, 8971, 9002, 31, 10089, 10101, 2, 10182, 10215, 33, 10217, 10223, 2, 10628, 10648, 2, 10713, 10715, 2, 10749, 11811, 1062, 11813, 11817, 2, 11862, 11868, 2, 12297, 12305, 2, 12309, 12315, 2, 12318, 12319, 1, 64830, 65048, 218, 65078, 65092, 2, 65096, 65114, 18, 65116, 65118, 2, 65289, 65341, 52, 65373, 65379, 3]));
153
- static Pf = new UnicodeRangeTable(new Uint32Array([187, 8217, 8030, 8221, 8250, 29, 11779, 11781, 2, 11786, 11789, 3, 11805, 11809, 4]));
154
- static Pi = new UnicodeRangeTable(new Uint32Array([171, 8216, 8045, 8219, 8220, 1, 8223, 8249, 26, 11778, 11780, 2, 11785, 11788, 3, 11804, 11808, 4]));
155
- static Po = new UnicodeRangeTable(new Uint32Array([33, 35, 1, 37, 39, 1, 42, 46, 2, 47, 58, 11, 59, 63, 4, 64, 92, 28, 161, 167, 6, 182, 183, 1, 191, 894, 703, 903, 1370, 467, 1371, 1375, 1, 1417, 1472, 55, 1475, 1478, 3, 1523, 1524, 1, 1545, 1546, 1, 1548, 1549, 1, 1563, 1565, 2, 1566, 1567, 1, 1642, 1645, 1, 1748, 1792, 44, 1793, 1805, 1, 2039, 2041, 1, 2096, 2110, 1, 2142, 2404, 262, 2405, 2416, 11, 2557, 2678, 121, 2800, 3191, 391, 3204, 3572, 368, 3663, 3674, 11, 3675, 3844, 169, 3845, 3858, 1, 3860, 3973, 113, 4048, 4052, 1, 4057, 4058, 1, 4170, 4175, 1, 4347, 4960, 613, 4961, 4968, 1, 5742, 5867, 125, 5868, 5869, 1, 5941, 5942, 1, 6100, 6102, 1, 6104, 6106, 1, 6144, 6149, 1, 6151, 6154, 1, 6468, 6469, 1, 6686, 6687, 1, 6816, 6822, 1, 6824, 6829, 1, 6990, 6991, 1, 7002, 7008, 1, 7037, 7039, 1, 7164, 7167, 1, 7227, 7231, 1, 7294, 7295, 1, 7360, 7367, 1, 7379, 8214, 835, 8215, 8224, 9, 8225, 8231, 1, 8240, 8248, 1, 8251, 8254, 1, 8257, 8259, 1, 8263, 8273, 1, 8275, 8277, 2, 8278, 8286, 1, 11513, 11516, 1, 11518, 11519, 1, 11632, 11776, 144, 11777, 11782, 5, 11783, 11784, 1, 11787, 11790, 3, 11791, 11798, 1, 11800, 11801, 1, 11803, 11806, 3, 11807, 11818, 11, 11819, 11822, 1, 11824, 11833, 1, 11836, 11839, 1, 11841, 11843, 2, 11844, 11855, 1, 11858, 11860, 1, 12289, 12291, 1, 12349, 12539, 190, 42238, 42239, 1, 42509, 42511, 1, 42611, 42622, 11, 42738, 42743, 1, 43124, 43127, 1, 43214, 43215, 1, 43256, 43258, 1, 43260, 43310, 50, 43311, 43359, 48, 43457, 43469, 1, 43486, 43487, 1, 43612, 43615, 1, 43742, 43743, 1, 43760, 43761, 1, 44011, 65040, 21029, 65041, 65046, 1, 65049, 65072, 23, 65093, 65094, 1, 65097, 65100, 1, 65104, 65106, 1, 65108, 65111, 1, 65119, 65121, 1, 65128, 65130, 2, 65131, 65281, 150, 65282, 65283, 1, 65285, 65287, 1, 65290, 65294, 2, 65295, 65306, 11, 65307, 65311, 4, 65312, 65340, 28, 65377, 65380, 3, 65381, 65792, 411, 65793, 65794, 1, 66463, 66512, 49, 66927, 67671, 744, 67871, 67903, 32, 68176, 68184, 1, 68223, 68336, 113, 68337, 68342, 1, 68409, 68415, 1, 68505, 68508, 1, 69461, 69465, 1, 69510, 69513, 1, 69703, 69709, 1, 69819, 69820, 1, 69822, 69825, 1, 69952, 69955, 1, 70004, 70005, 1, 70085, 70088, 1, 70093, 70107, 14, 70109, 70111, 1, 70200, 70205, 1, 70313, 70612, 299, 70613, 70615, 2, 70616, 70731, 115, 70732, 70735, 1, 70746, 70747, 1, 70749, 70854, 105, 71105, 71127, 1, 71233, 71235, 1, 71264, 71276, 1, 71353, 71484, 131, 71485, 71486, 1, 71739, 72004, 265, 72005, 72006, 1, 72162, 72255, 93, 72256, 72262, 1, 72346, 72348, 1, 72350, 72354, 1, 72448, 72457, 1, 72673, 72769, 96, 72770, 72773, 1, 72816, 72817, 1, 73463, 73464, 1, 73539, 73551, 1, 73727, 74864, 1137, 74865, 74868, 1, 77809, 77810, 1, 92782, 92783, 1, 92917, 92983, 66, 92984, 92987, 1, 92996, 93549, 553, 93550, 93551, 1, 93847, 93850, 1, 94178, 113823, 19645, 121479, 121483, 1, 124415, 125278, 863, 125279, 125279, 1]));
156
- static Ps = new UnicodeRangeTable(new Uint32Array([40, 91, 51, 123, 3898, 3775, 3900, 5787, 1887, 8218, 8222, 4, 8261, 8317, 56, 8333, 8968, 635, 8970, 9001, 31, 10088, 10100, 2, 10181, 10214, 33, 10216, 10222, 2, 10627, 10647, 2, 10712, 10714, 2, 10748, 11810, 1062, 11812, 11816, 2, 11842, 11861, 19, 11863, 11867, 2, 12296, 12304, 2, 12308, 12314, 2, 12317, 64831, 52514, 65047, 65077, 30, 65079, 65091, 2, 65095, 65113, 18, 65115, 65117, 2, 65288, 65339, 51, 65371, 65375, 4, 65378, 65378, 1]));
157
- static S = new UnicodeRangeTable(new Uint32Array([36, 43, 7, 60, 62, 1, 94, 96, 2, 124, 126, 2, 162, 166, 1, 168, 169, 1, 172, 174, 2, 175, 177, 1, 180, 184, 4, 215, 247, 32, 706, 709, 1, 722, 735, 1, 741, 747, 1, 749, 751, 2, 752, 767, 1, 885, 900, 15, 901, 1014, 113, 1154, 1421, 267, 1422, 1423, 1, 1542, 1544, 1, 1547, 1550, 3, 1551, 1758, 207, 1769, 1789, 20, 1790, 2038, 248, 2046, 2047, 1, 2184, 2546, 362, 2547, 2554, 7, 2555, 2801, 246, 2928, 3059, 131, 3060, 3066, 1, 3199, 3407, 208, 3449, 3647, 198, 3841, 3843, 1, 3859, 3861, 2, 3862, 3863, 1, 3866, 3871, 1, 3892, 3896, 2, 4030, 4037, 1, 4039, 4044, 1, 4046, 4047, 1, 4053, 4056, 1, 4254, 4255, 1, 5008, 5017, 1, 5741, 6107, 366, 6464, 6622, 158, 6623, 6655, 1, 7009, 7018, 1, 7028, 7036, 1, 8125, 8127, 2, 8128, 8129, 1, 8141, 8143, 1, 8157, 8159, 1, 8173, 8175, 1, 8189, 8190, 1, 8260, 8274, 14, 8314, 8316, 1, 8330, 8332, 1, 8352, 8384, 1, 8448, 8449, 1, 8451, 8454, 1, 8456, 8457, 1, 8468, 8470, 2, 8471, 8472, 1, 8478, 8483, 1, 8485, 8489, 2, 8494, 8506, 12, 8507, 8512, 5, 8513, 8516, 1, 8522, 8525, 1, 8527, 8586, 59, 8587, 8592, 5, 8593, 8967, 1, 8972, 9000, 1, 9003, 9257, 1, 9280, 9290, 1, 9372, 9449, 1, 9472, 10087, 1, 10132, 10180, 1, 10183, 10213, 1, 10224, 10626, 1, 10649, 10711, 1, 10716, 10747, 1, 10750, 11123, 1, 11126, 11157, 1, 11159, 11263, 1, 11493, 11498, 1, 11856, 11857, 1, 11904, 11929, 1, 11931, 12019, 1, 12032, 12245, 1, 12272, 12287, 1, 12292, 12306, 14, 12307, 12320, 13, 12342, 12343, 1, 12350, 12351, 1, 12443, 12444, 1, 12688, 12689, 1, 12694, 12703, 1, 12736, 12773, 1, 12783, 12800, 17, 12801, 12830, 1, 12842, 12871, 1, 12880, 12896, 16, 12897, 12927, 1, 12938, 12976, 1, 12992, 13311, 1, 19904, 19967, 1, 42128, 42182, 1, 42752, 42774, 1, 42784, 42785, 1, 42889, 42890, 1, 43048, 43051, 1, 43062, 43065, 1, 43639, 43641, 1, 43867, 43882, 15, 43883, 64297, 20414, 64434, 64450, 1, 64832, 64847, 1, 64975, 65020, 45, 65021, 65023, 1, 65122, 65124, 2, 65125, 65126, 1, 65129, 65284, 155, 65291, 65308, 17, 65309, 65310, 1, 65342, 65344, 2, 65372, 65374, 2, 65504, 65510, 1, 65512, 65518, 1, 65532, 65533, 1, 65847, 65855, 1, 65913, 65929, 1, 65932, 65934, 1, 65936, 65948, 1, 65952, 66000, 48, 66001, 66044, 1, 67703, 67704, 1, 68296, 69006, 710, 69007, 71487, 2480, 73685, 73713, 1, 92988, 92991, 1, 92997, 113820, 20823, 117760, 117999, 1, 118016, 118451, 1, 118608, 118723, 1, 118784, 119029, 1, 119040, 119078, 1, 119081, 119140, 1, 119146, 119148, 1, 119171, 119172, 1, 119180, 119209, 1, 119214, 119274, 1, 119296, 119361, 1, 119365, 119552, 187, 119553, 119638, 1, 120513, 120539, 26, 120571, 120597, 26, 120629, 120655, 26, 120687, 120713, 26, 120745, 120771, 26, 120832, 121343, 1, 121399, 121402, 1, 121453, 121460, 1, 121462, 121475, 1, 121477, 121478, 1, 123215, 123647, 432, 126124, 126128, 4, 126254, 126704, 450, 126705, 126976, 271, 126977, 127019, 1, 127024, 127123, 1, 127136, 127150, 1, 127153, 127167, 1, 127169, 127183, 1, 127185, 127221, 1, 127245, 127405, 1, 127462, 127490, 1, 127504, 127547, 1, 127552, 127560, 1, 127568, 127569, 1, 127584, 127589, 1, 127744, 128727, 1, 128732, 128748, 1, 128752, 128764, 1, 128768, 128886, 1, 128891, 128985, 1, 128992, 129003, 1, 129008, 129024, 16, 129025, 129035, 1, 129040, 129095, 1, 129104, 129113, 1, 129120, 129159, 1, 129168, 129197, 1, 129200, 129211, 1, 129216, 129217, 1, 129280, 129619, 1, 129632, 129645, 1, 129648, 129660, 1, 129664, 129673, 1, 129679, 129734, 1, 129742, 129756, 1, 129759, 129769, 1, 129776, 129784, 1, 129792, 129938, 1, 129940, 130031, 1]));
158
- static Sc = new UnicodeRangeTable(new Uint32Array([36, 162, 126, 163, 165, 1, 1423, 1547, 124, 2046, 2047, 1, 2546, 2547, 1, 2555, 2801, 246, 3065, 3647, 582, 6107, 8352, 2245, 8353, 8384, 1, 43064, 65020, 21956, 65129, 65284, 155, 65504, 65505, 1, 65509, 65510, 1, 73693, 73696, 1, 123647, 126128, 2481]));
159
- static Sk = new UnicodeRangeTable(new Uint32Array([94, 96, 2, 168, 175, 7, 180, 184, 4, 706, 709, 1, 722, 735, 1, 741, 747, 1, 749, 751, 2, 752, 767, 1, 885, 900, 15, 901, 2184, 1283, 8125, 8127, 2, 8128, 8129, 1, 8141, 8143, 1, 8157, 8159, 1, 8173, 8175, 1, 8189, 8190, 1, 12443, 12444, 1, 42752, 42774, 1, 42784, 42785, 1, 42889, 42890, 1, 43867, 43882, 15, 43883, 64434, 20551, 64435, 64450, 1, 65342, 65344, 2, 65507, 127995, 62488, 127996, 127999, 1]));
160
- static Sm = new UnicodeRangeTable(new Uint32Array([43, 60, 17, 61, 62, 1, 124, 126, 2, 172, 177, 5, 215, 247, 32, 1014, 1542, 528, 1543, 1544, 1, 8260, 8274, 14, 8314, 8316, 1, 8330, 8332, 1, 8472, 8512, 40, 8513, 8516, 1, 8523, 8592, 69, 8593, 8596, 1, 8602, 8603, 1, 8608, 8614, 3, 8622, 8654, 32, 8655, 8658, 3, 8660, 8692, 32, 8693, 8959, 1, 8992, 8993, 1, 9084, 9115, 31, 9116, 9139, 1, 9180, 9185, 1, 9655, 9665, 10, 9720, 9727, 1, 9839, 10176, 337, 10177, 10180, 1, 10183, 10213, 1, 10224, 10239, 1, 10496, 10626, 1, 10649, 10711, 1, 10716, 10747, 1, 10750, 11007, 1, 11056, 11076, 1, 11079, 11084, 1, 64297, 65122, 825, 65124, 65126, 1, 65291, 65308, 17, 65309, 65310, 1, 65372, 65374, 2, 65506, 65513, 7, 65514, 65516, 1, 69006, 69007, 1, 120513, 120539, 26, 120571, 120597, 26, 120629, 120655, 26, 120687, 120713, 26, 120745, 120771, 26, 126704, 126705, 1]));
161
- static So = new UnicodeRangeTable(new Uint32Array([166, 169, 3, 174, 176, 2, 1154, 1421, 267, 1422, 1550, 128, 1551, 1758, 207, 1769, 1789, 20, 1790, 2038, 248, 2554, 2928, 374, 3059, 3064, 1, 3066, 3199, 133, 3407, 3449, 42, 3841, 3843, 1, 3859, 3861, 2, 3862, 3863, 1, 3866, 3871, 1, 3892, 3896, 2, 4030, 4037, 1, 4039, 4044, 1, 4046, 4047, 1, 4053, 4056, 1, 4254, 4255, 1, 5008, 5017, 1, 5741, 6464, 723, 6622, 6655, 1, 7009, 7018, 1, 7028, 7036, 1, 8448, 8449, 1, 8451, 8454, 1, 8456, 8457, 1, 8468, 8470, 2, 8471, 8478, 7, 8479, 8483, 1, 8485, 8489, 2, 8494, 8506, 12, 8507, 8522, 15, 8524, 8525, 1, 8527, 8586, 59, 8587, 8597, 10, 8598, 8601, 1, 8604, 8607, 1, 8609, 8610, 1, 8612, 8613, 1, 8615, 8621, 1, 8623, 8653, 1, 8656, 8657, 1, 8659, 8661, 2, 8662, 8691, 1, 8960, 8967, 1, 8972, 8991, 1, 8994, 9000, 1, 9003, 9083, 1, 9085, 9114, 1, 9140, 9179, 1, 9186, 9257, 1, 9280, 9290, 1, 9372, 9449, 1, 9472, 9654, 1, 9656, 9664, 1, 9666, 9719, 1, 9728, 9838, 1, 9840, 10087, 1, 10132, 10175, 1, 10240, 10495, 1, 11008, 11055, 1, 11077, 11078, 1, 11085, 11123, 1, 11126, 11157, 1, 11159, 11263, 1, 11493, 11498, 1, 11856, 11857, 1, 11904, 11929, 1, 11931, 12019, 1, 12032, 12245, 1, 12272, 12287, 1, 12292, 12306, 14, 12307, 12320, 13, 12342, 12343, 1, 12350, 12351, 1, 12688, 12689, 1, 12694, 12703, 1, 12736, 12773, 1, 12783, 12800, 17, 12801, 12830, 1, 12842, 12871, 1, 12880, 12896, 16, 12897, 12927, 1, 12938, 12976, 1, 12992, 13311, 1, 19904, 19967, 1, 42128, 42182, 1, 43048, 43051, 1, 43062, 43063, 1, 43065, 43639, 574, 43640, 43641, 1, 64832, 64847, 1, 64975, 65021, 46, 65022, 65023, 1, 65508, 65512, 4, 65517, 65518, 1, 65532, 65533, 1, 65847, 65855, 1, 65913, 65929, 1, 65932, 65934, 1, 65936, 65948, 1, 65952, 66000, 48, 66001, 66044, 1, 67703, 67704, 1, 68296, 71487, 3191, 73685, 73692, 1, 73697, 73713, 1, 92988, 92991, 1, 92997, 113820, 20823, 117760, 117999, 1, 118016, 118451, 1, 118608, 118723, 1, 118784, 119029, 1, 119040, 119078, 1, 119081, 119140, 1, 119146, 119148, 1, 119171, 119172, 1, 119180, 119209, 1, 119214, 119274, 1, 119296, 119361, 1, 119365, 119552, 187, 119553, 119638, 1, 120832, 121343, 1, 121399, 121402, 1, 121453, 121460, 1, 121462, 121475, 1, 121477, 121478, 1, 123215, 126124, 2909, 126254, 126976, 722, 126977, 127019, 1, 127024, 127123, 1, 127136, 127150, 1, 127153, 127167, 1, 127169, 127183, 1, 127185, 127221, 1, 127245, 127405, 1, 127462, 127490, 1, 127504, 127547, 1, 127552, 127560, 1, 127568, 127569, 1, 127584, 127589, 1, 127744, 127994, 1, 128000, 128727, 1, 128732, 128748, 1, 128752, 128764, 1, 128768, 128886, 1, 128891, 128985, 1, 128992, 129003, 1, 129008, 129024, 16, 129025, 129035, 1, 129040, 129095, 1, 129104, 129113, 1, 129120, 129159, 1, 129168, 129197, 1, 129200, 129211, 1, 129216, 129217, 1, 129280, 129619, 1, 129632, 129645, 1, 129648, 129660, 1, 129664, 129673, 1, 129679, 129734, 1, 129742, 129756, 1, 129759, 129769, 1, 129776, 129784, 1, 129792, 129938, 1, 129940, 130031, 1]));
162
- static Z = new UnicodeRangeTable(new Uint32Array([32, 160, 128, 5760, 8192, 2432, 8193, 8202, 1, 8232, 8233, 1, 8239, 8287, 48, 12288, 12288, 1]));
163
- static Zl = new UnicodeRangeTable(new Uint32Array([8232, 8232, 1]));
164
- static Zp = new UnicodeRangeTable(new Uint32Array([8233, 8233, 1]));
165
- static Zs = new UnicodeRangeTable(new Uint32Array([32, 160, 128, 5760, 8192, 2432, 8193, 8202, 1, 8239, 8287, 48, 12288, 12288, 1]));
166
- static Adlam = new UnicodeRangeTable(new Uint32Array([125184, 125259, 1, 125264, 125273, 1, 125278, 125279, 1]));
167
- static Ahom = new UnicodeRangeTable(new Uint32Array([71424, 71450, 1, 71453, 71467, 1, 71472, 71494, 1]));
168
- static Anatolian_Hieroglyphs = new UnicodeRangeTable(new Uint32Array([82944, 83526, 1]));
169
- static Arabic = new UnicodeRangeTable(new Uint32Array([1536, 1540, 1, 1542, 1547, 1, 1549, 1562, 1, 1564, 1566, 1, 1568, 1599, 1, 1601, 1610, 1, 1622, 1647, 1, 1649, 1756, 1, 1758, 1791, 1, 1872, 1919, 1, 2160, 2190, 1, 2192, 2193, 1, 2199, 2273, 1, 2275, 2303, 1, 64336, 64450, 1, 64467, 64829, 1, 64832, 64911, 1, 64914, 64967, 1, 64975, 65008, 33, 65009, 65023, 1, 65136, 65140, 1, 65142, 65276, 1, 69216, 69246, 1, 69314, 69316, 1, 69372, 69375, 1, 126464, 126467, 1, 126469, 126495, 1, 126497, 126498, 1, 126500, 126503, 3, 126505, 126514, 1, 126516, 126519, 1, 126521, 126523, 2, 126530, 126535, 5, 126537, 126541, 2, 126542, 126543, 1, 126545, 126546, 1, 126548, 126551, 3, 126553, 126561, 2, 126562, 126564, 2, 126567, 126570, 1, 126572, 126578, 1, 126580, 126583, 1, 126585, 126588, 1, 126590, 126592, 2, 126593, 126601, 1, 126603, 126619, 1, 126625, 126627, 1, 126629, 126633, 1, 126635, 126651, 1, 126704, 126705, 1]));
170
- static Armenian = new UnicodeRangeTable(new Uint32Array([1329, 1366, 1, 1369, 1418, 1, 1421, 1423, 1, 64275, 64279, 1]));
171
- static Avestan = new UnicodeRangeTable(new Uint32Array([68352, 68405, 1, 68409, 68415, 1]));
172
- static Balinese = new UnicodeRangeTable(new Uint32Array([6912, 6988, 1, 6990, 7039, 1]));
173
- static Bamum = new UnicodeRangeTable(new Uint32Array([42656, 42743, 1, 92160, 92728, 1]));
174
- static Bassa_Vah = new UnicodeRangeTable(new Uint32Array([92880, 92909, 1, 92912, 92917, 1]));
175
- static Batak = new UnicodeRangeTable(new Uint32Array([7104, 7155, 1, 7164, 7167, 1]));
176
- static Bengali = new UnicodeRangeTable(new Uint32Array([2432, 2435, 1, 2437, 2444, 1, 2447, 2448, 1, 2451, 2472, 1, 2474, 2480, 1, 2482, 2486, 4, 2487, 2489, 1, 2492, 2500, 1, 2503, 2504, 1, 2507, 2510, 1, 2519, 2524, 5, 2525, 2527, 2, 2528, 2531, 1, 2534, 2558, 1]));
177
- static Bhaiksuki = new UnicodeRangeTable(new Uint32Array([72704, 72712, 1, 72714, 72758, 1, 72760, 72773, 1, 72784, 72812, 1]));
178
- static Bopomofo = new UnicodeRangeTable(new Uint32Array([746, 747, 1, 12549, 12591, 1, 12704, 12735, 1]));
179
- static Brahmi = new UnicodeRangeTable(new Uint32Array([69632, 69709, 1, 69714, 69749, 1, 69759, 69759, 1]));
180
- static Braille = new UnicodeRangeTable(new Uint32Array([10240, 10495, 1]));
181
- static Buginese = new UnicodeRangeTable(new Uint32Array([6656, 6683, 1, 6686, 6687, 1]));
182
- static Buhid = new UnicodeRangeTable(new Uint32Array([5952, 5971, 1]));
183
- static Canadian_Aboriginal = new UnicodeRangeTable(new Uint32Array([5120, 5759, 1, 6320, 6389, 1, 72368, 72383, 1]));
184
- static Carian = new UnicodeRangeTable(new Uint32Array([66208, 66256, 1]));
185
- static Caucasian_Albanian = new UnicodeRangeTable(new Uint32Array([66864, 66915, 1, 66927, 66927, 1]));
186
- static Chakma = new UnicodeRangeTable(new Uint32Array([69888, 69940, 1, 69942, 69959, 1]));
187
- static Cham = new UnicodeRangeTable(new Uint32Array([43520, 43574, 1, 43584, 43597, 1, 43600, 43609, 1, 43612, 43615, 1]));
188
- static Cherokee = new UnicodeRangeTable(new Uint32Array([5024, 5109, 1, 5112, 5117, 1, 43888, 43967, 1]));
189
- static Chorasmian = new UnicodeRangeTable(new Uint32Array([69552, 69579, 1]));
190
- static Common = new UnicodeRangeTable(new Uint32Array([0, 64, 1, 91, 96, 1, 123, 169, 1, 171, 185, 1, 187, 191, 1, 215, 247, 32, 697, 735, 1, 741, 745, 1, 748, 767, 1, 884, 894, 10, 901, 903, 2, 1541, 1548, 7, 1563, 1567, 4, 1600, 1757, 157, 2274, 2404, 130, 2405, 3647, 1242, 4053, 4056, 1, 4347, 5867, 1520, 5868, 5869, 1, 5941, 5942, 1, 6146, 6147, 1, 6149, 7379, 1230, 7393, 7401, 8, 7402, 7404, 1, 7406, 7411, 1, 7413, 7415, 1, 7418, 8192, 774, 8193, 8203, 1, 8206, 8292, 1, 8294, 8304, 1, 8308, 8318, 1, 8320, 8334, 1, 8352, 8384, 1, 8448, 8485, 1, 8487, 8489, 1, 8492, 8497, 1, 8499, 8525, 1, 8527, 8543, 1, 8585, 8587, 1, 8592, 9257, 1, 9280, 9290, 1, 9312, 10239, 1, 10496, 11123, 1, 11126, 11157, 1, 11159, 11263, 1, 11776, 11869, 1, 12272, 12292, 1, 12294, 12296, 2, 12297, 12320, 1, 12336, 12343, 1, 12348, 12351, 1, 12443, 12444, 1, 12448, 12539, 91, 12540, 12688, 148, 12689, 12703, 1, 12736, 12773, 1, 12783, 12832, 49, 12833, 12895, 1, 12927, 13007, 1, 13055, 13144, 89, 13145, 13311, 1, 19904, 19967, 1, 42752, 42785, 1, 42888, 42890, 1, 43056, 43065, 1, 43310, 43471, 161, 43867, 43882, 15, 43883, 64830, 20947, 64831, 65040, 209, 65041, 65049, 1, 65072, 65106, 1, 65108, 65126, 1, 65128, 65131, 1, 65279, 65281, 2, 65282, 65312, 1, 65339, 65344, 1, 65371, 65381, 1, 65392, 65438, 46, 65439, 65504, 65, 65505, 65510, 1, 65512, 65518, 1, 65529, 65533, 1, 65792, 65794, 1, 65799, 65843, 1, 65847, 65855, 1, 65936, 65948, 1, 66000, 66044, 1, 66273, 66299, 1, 113824, 113827, 1, 117760, 118009, 1, 118016, 118451, 1, 118608, 118723, 1, 118784, 119029, 1, 119040, 119078, 1, 119081, 119142, 1, 119146, 119162, 1, 119171, 119172, 1, 119180, 119209, 1, 119214, 119274, 1, 119488, 119507, 1, 119520, 119539, 1, 119552, 119638, 1, 119648, 119672, 1, 119808, 119892, 1, 119894, 119964, 1, 119966, 119967, 1, 119970, 119973, 3, 119974, 119977, 3, 119978, 119980, 1, 119982, 119993, 1, 119995, 119997, 2, 119998, 120003, 1, 120005, 120069, 1, 120071, 120074, 1, 120077, 120084, 1, 120086, 120092, 1, 120094, 120121, 1, 120123, 120126, 1, 120128, 120132, 1, 120134, 120138, 4, 120139, 120144, 1, 120146, 120485, 1, 120488, 120779, 1, 120782, 120831, 1, 126065, 126132, 1, 126209, 126269, 1, 126976, 127019, 1, 127024, 127123, 1, 127136, 127150, 1, 127153, 127167, 1, 127169, 127183, 1, 127185, 127221, 1, 127232, 127405, 1, 127462, 127487, 1, 127489, 127490, 1, 127504, 127547, 1, 127552, 127560, 1, 127568, 127569, 1, 127584, 127589, 1, 127744, 128727, 1, 128732, 128748, 1, 128752, 128764, 1, 128768, 128886, 1, 128891, 128985, 1, 128992, 129003, 1, 129008, 129024, 16, 129025, 129035, 1, 129040, 129095, 1, 129104, 129113, 1, 129120, 129159, 1, 129168, 129197, 1, 129200, 129211, 1, 129216, 129217, 1, 129280, 129619, 1, 129632, 129645, 1, 129648, 129660, 1, 129664, 129673, 1, 129679, 129734, 1, 129742, 129756, 1, 129759, 129769, 1, 129776, 129784, 1, 129792, 129938, 1, 129940, 130041, 1, 917505, 917536, 31, 917537, 917631, 1]));
191
- static foldCommon = new UnicodeRangeTable(new Uint32Array([924, 956, 32]));
192
- static Coptic = new UnicodeRangeTable(new Uint32Array([994, 1007, 1, 11392, 11507, 1, 11513, 11519, 1]));
193
- static Cuneiform = new UnicodeRangeTable(new Uint32Array([73728, 74649, 1, 74752, 74862, 1, 74864, 74868, 1, 74880, 75075, 1]));
194
- static Cypriot = new UnicodeRangeTable(new Uint32Array([67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3]));
195
- static Cypro_Minoan = new UnicodeRangeTable(new Uint32Array([77712, 77810, 1]));
196
- static Cyrillic = new UnicodeRangeTable(new Uint32Array([1024, 1156, 1, 1159, 1327, 1, 7296, 7306, 1, 7467, 7544, 77, 11744, 11775, 1, 42560, 42655, 1, 65070, 65071, 1, 122928, 122989, 1, 123023, 123023, 1]));
197
- static Deseret = new UnicodeRangeTable(new Uint32Array([66560, 66639, 1]));
198
- static Devanagari = new UnicodeRangeTable(new Uint32Array([2304, 2384, 1, 2389, 2403, 1, 2406, 2431, 1, 43232, 43263, 1, 72448, 72457, 1]));
199
- static Dives_Akuru = new UnicodeRangeTable(new Uint32Array([71936, 71942, 1, 71945, 71948, 3, 71949, 71955, 1, 71957, 71958, 1, 71960, 71989, 1, 71991, 71992, 1, 71995, 72006, 1, 72016, 72025, 1]));
200
- static Dogra = new UnicodeRangeTable(new Uint32Array([71680, 71739, 1]));
201
- static Duployan = new UnicodeRangeTable(new Uint32Array([113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 113820, 113823, 1]));
202
- static Egyptian_Hieroglyphs = new UnicodeRangeTable(new Uint32Array([77824, 78933, 1, 78944, 82938, 1]));
203
- static Elbasan = new UnicodeRangeTable(new Uint32Array([66816, 66855, 1]));
204
- static Elymaic = new UnicodeRangeTable(new Uint32Array([69600, 69622, 1]));
205
- static Ethiopic = new UnicodeRangeTable(new Uint32Array([4608, 4680, 1, 4682, 4685, 1, 4688, 4694, 1, 4696, 4698, 2, 4699, 4701, 1, 4704, 4744, 1, 4746, 4749, 1, 4752, 4784, 1, 4786, 4789, 1, 4792, 4798, 1, 4800, 4802, 2, 4803, 4805, 1, 4808, 4822, 1, 4824, 4880, 1, 4882, 4885, 1, 4888, 4954, 1, 4957, 4988, 1, 4992, 5017, 1, 11648, 11670, 1, 11680, 11686, 1, 11688, 11694, 1, 11696, 11702, 1, 11704, 11710, 1, 11712, 11718, 1, 11720, 11726, 1, 11728, 11734, 1, 11736, 11742, 1, 43777, 43782, 1, 43785, 43790, 1, 43793, 43798, 1, 43808, 43814, 1, 43816, 43822, 1, 124896, 124902, 1, 124904, 124907, 1, 124909, 124910, 1, 124912, 124926, 1]));
206
- static Garay = new UnicodeRangeTable(new Uint32Array([68928, 68965, 1, 68969, 68997, 1, 69006, 69007, 1]));
207
- static Georgian = new UnicodeRangeTable(new Uint32Array([4256, 4293, 1, 4295, 4301, 6, 4304, 4346, 1, 4348, 4351, 1, 7312, 7354, 1, 7357, 7359, 1, 11520, 11557, 1, 11559, 11565, 6]));
208
- static Glagolitic = new UnicodeRangeTable(new Uint32Array([11264, 11359, 1, 122880, 122886, 1, 122888, 122904, 1, 122907, 122913, 1, 122915, 122916, 1, 122918, 122922, 1]));
209
- static Gothic = new UnicodeRangeTable(new Uint32Array([66352, 66378, 1]));
210
- static Grantha = new UnicodeRangeTable(new Uint32Array([70400, 70403, 1, 70405, 70412, 1, 70415, 70416, 1, 70419, 70440, 1, 70442, 70448, 1, 70450, 70451, 1, 70453, 70457, 1, 70460, 70468, 1, 70471, 70472, 1, 70475, 70477, 1, 70480, 70487, 7, 70493, 70499, 1, 70502, 70508, 1, 70512, 70516, 1]));
211
- static Greek = new UnicodeRangeTable(new Uint32Array([880, 883, 1, 885, 887, 1, 890, 893, 1, 895, 900, 5, 902, 904, 2, 905, 906, 1, 908, 910, 2, 911, 929, 1, 931, 993, 1, 1008, 1023, 1, 7462, 7466, 1, 7517, 7521, 1, 7526, 7530, 1, 7615, 7936, 321, 7937, 7957, 1, 7960, 7965, 1, 7968, 8005, 1, 8008, 8013, 1, 8016, 8023, 1, 8025, 8031, 2, 8032, 8061, 1, 8064, 8116, 1, 8118, 8132, 1, 8134, 8147, 1, 8150, 8155, 1, 8157, 8175, 1, 8178, 8180, 1, 8182, 8190, 1, 8486, 43877, 35391, 65856, 65934, 1, 65952, 119296, 53344, 119297, 119365, 1]));
212
- static foldGreek = new UnicodeRangeTable(new Uint32Array([181, 837, 656]));
213
- static Gujarati = new UnicodeRangeTable(new Uint32Array([2689, 2691, 1, 2693, 2701, 1, 2703, 2705, 1, 2707, 2728, 1, 2730, 2736, 1, 2738, 2739, 1, 2741, 2745, 1, 2748, 2757, 1, 2759, 2761, 1, 2763, 2765, 1, 2768, 2784, 16, 2785, 2787, 1, 2790, 2801, 1, 2809, 2815, 1]));
214
- static Gunjala_Gondi = new UnicodeRangeTable(new Uint32Array([73056, 73061, 1, 73063, 73064, 1, 73066, 73102, 1, 73104, 73105, 1, 73107, 73112, 1, 73120, 73129, 1]));
215
- static Gurmukhi = new UnicodeRangeTable(new Uint32Array([2561, 2563, 1, 2565, 2570, 1, 2575, 2576, 1, 2579, 2600, 1, 2602, 2608, 1, 2610, 2611, 1, 2613, 2614, 1, 2616, 2617, 1, 2620, 2622, 2, 2623, 2626, 1, 2631, 2632, 1, 2635, 2637, 1, 2641, 2649, 8, 2650, 2652, 1, 2654, 2662, 8, 2663, 2678, 1]));
216
- static Gurung_Khema = new UnicodeRangeTable(new Uint32Array([90368, 90425, 1]));
217
- static Han = new UnicodeRangeTable(new Uint32Array([11904, 11929, 1, 11931, 12019, 1, 12032, 12245, 1, 12293, 12295, 2, 12321, 12329, 1, 12344, 12347, 1, 13312, 19903, 1, 19968, 40959, 1, 63744, 64109, 1, 64112, 64217, 1, 94178, 94179, 1, 94192, 94193, 1, 131072, 173791, 1, 173824, 177977, 1, 177984, 178205, 1, 178208, 183969, 1, 183984, 191456, 1, 191472, 192093, 1, 194560, 195101, 1, 196608, 201546, 1, 201552, 205743, 1]));
218
- static Hangul = new UnicodeRangeTable(new Uint32Array([4352, 4607, 1, 12334, 12335, 1, 12593, 12686, 1, 12800, 12830, 1, 12896, 12926, 1, 43360, 43388, 1, 44032, 55203, 1, 55216, 55238, 1, 55243, 55291, 1, 65440, 65470, 1, 65474, 65479, 1, 65482, 65487, 1, 65490, 65495, 1, 65498, 65500, 1]));
219
- static Hanifi_Rohingya = new UnicodeRangeTable(new Uint32Array([68864, 68903, 1, 68912, 68921, 1]));
220
- static Hanunoo = new UnicodeRangeTable(new Uint32Array([5920, 5940, 1]));
221
- static Hatran = new UnicodeRangeTable(new Uint32Array([67808, 67826, 1, 67828, 67829, 1, 67835, 67839, 1]));
222
- static Hebrew = new UnicodeRangeTable(new Uint32Array([1425, 1479, 1, 1488, 1514, 1, 1519, 1524, 1, 64285, 64310, 1, 64312, 64316, 1, 64318, 64320, 2, 64321, 64323, 2, 64324, 64326, 2, 64327, 64335, 1]));
223
- static Hiragana = new UnicodeRangeTable(new Uint32Array([12353, 12438, 1, 12445, 12447, 1, 110593, 110879, 1, 110898, 110928, 30, 110929, 110930, 1, 127488, 127488, 1]));
224
- static Imperial_Aramaic = new UnicodeRangeTable(new Uint32Array([67648, 67669, 1, 67671, 67679, 1]));
225
- static Inherited = new UnicodeRangeTable(new Uint32Array([768, 879, 1, 1157, 1158, 1, 1611, 1621, 1, 1648, 2385, 737, 2386, 2388, 1, 6832, 6862, 1, 7376, 7378, 1, 7380, 7392, 1, 7394, 7400, 1, 7405, 7412, 7, 7416, 7417, 1, 7616, 7679, 1, 8204, 8205, 1, 8400, 8432, 1, 12330, 12333, 1, 12441, 12442, 1, 65024, 65039, 1, 65056, 65069, 1, 66045, 66272, 227, 70459, 118528, 48069, 118529, 118573, 1, 118576, 118598, 1, 119143, 119145, 1, 119163, 119170, 1, 119173, 119179, 1, 119210, 119213, 1, 917760, 917999, 1]));
226
- static foldInherited = new UnicodeRangeTable(new Uint32Array([921, 953, 32, 8126, 8126, 1]));
227
- static Inscriptional_Pahlavi = new UnicodeRangeTable(new Uint32Array([68448, 68466, 1, 68472, 68479, 1]));
228
- static Inscriptional_Parthian = new UnicodeRangeTable(new Uint32Array([68416, 68437, 1, 68440, 68447, 1]));
229
- static Javanese = new UnicodeRangeTable(new Uint32Array([43392, 43469, 1, 43472, 43481, 1, 43486, 43487, 1]));
230
- static Kaithi = new UnicodeRangeTable(new Uint32Array([69760, 69826, 1, 69837, 69837, 1]));
231
- static Kannada = new UnicodeRangeTable(new Uint32Array([3200, 3212, 1, 3214, 3216, 1, 3218, 3240, 1, 3242, 3251, 1, 3253, 3257, 1, 3260, 3268, 1, 3270, 3272, 1, 3274, 3277, 1, 3285, 3286, 1, 3293, 3294, 1, 3296, 3299, 1, 3302, 3311, 1, 3313, 3315, 1]));
232
- static Katakana = new UnicodeRangeTable(new Uint32Array([12449, 12538, 1, 12541, 12543, 1, 12784, 12799, 1, 13008, 13054, 1, 13056, 13143, 1, 65382, 65391, 1, 65393, 65437, 1, 110576, 110579, 1, 110581, 110587, 1, 110589, 110590, 1, 110592, 110880, 288, 110881, 110882, 1, 110933, 110948, 15, 110949, 110951, 1]));
233
- static Kawi = new UnicodeRangeTable(new Uint32Array([73472, 73488, 1, 73490, 73530, 1, 73534, 73562, 1]));
234
- static Kayah_Li = new UnicodeRangeTable(new Uint32Array([43264, 43309, 1, 43311, 43311, 1]));
235
- static Kharoshthi = new UnicodeRangeTable(new Uint32Array([68096, 68099, 1, 68101, 68102, 1, 68108, 68115, 1, 68117, 68119, 1, 68121, 68149, 1, 68152, 68154, 1, 68159, 68168, 1, 68176, 68184, 1]));
236
- static Khitan_Small_Script = new UnicodeRangeTable(new Uint32Array([94180, 101120, 6940, 101121, 101589, 1, 101631, 101631, 1]));
237
- static Khmer = new UnicodeRangeTable(new Uint32Array([6016, 6109, 1, 6112, 6121, 1, 6128, 6137, 1, 6624, 6655, 1]));
238
- static Khojki = new UnicodeRangeTable(new Uint32Array([70144, 70161, 1, 70163, 70209, 1]));
239
- static Khudawadi = new UnicodeRangeTable(new Uint32Array([70320, 70378, 1, 70384, 70393, 1]));
240
- static Kirat_Rai = new UnicodeRangeTable(new Uint32Array([93504, 93561, 1]));
241
- static Lao = new UnicodeRangeTable(new Uint32Array([3713, 3714, 1, 3716, 3718, 2, 3719, 3722, 1, 3724, 3747, 1, 3749, 3751, 2, 3752, 3773, 1, 3776, 3780, 1, 3782, 3784, 2, 3785, 3790, 1, 3792, 3801, 1, 3804, 3807, 1]));
242
- static Latin = new UnicodeRangeTable(new Uint32Array([65, 90, 1, 97, 122, 1, 170, 186, 16, 192, 214, 1, 216, 246, 1, 248, 696, 1, 736, 740, 1, 7424, 7461, 1, 7468, 7516, 1, 7522, 7525, 1, 7531, 7543, 1, 7545, 7614, 1, 7680, 7935, 1, 8305, 8319, 14, 8336, 8348, 1, 8490, 8491, 1, 8498, 8526, 28, 8544, 8584, 1, 11360, 11391, 1, 42786, 42887, 1, 42891, 42957, 1, 42960, 42961, 1, 42963, 42965, 2, 42966, 42972, 1, 42994, 43007, 1, 43824, 43866, 1, 43868, 43876, 1, 43878, 43881, 1, 64256, 64262, 1, 65313, 65338, 1, 65345, 65370, 1, 67456, 67461, 1, 67463, 67504, 1, 67506, 67514, 1, 122624, 122654, 1, 122661, 122666, 1]));
243
- static Lepcha = new UnicodeRangeTable(new Uint32Array([7168, 7223, 1, 7227, 7241, 1, 7245, 7247, 1]));
244
- static Limbu = new UnicodeRangeTable(new Uint32Array([6400, 6430, 1, 6432, 6443, 1, 6448, 6459, 1, 6464, 6468, 4, 6469, 6479, 1]));
245
- static Linear_A = new UnicodeRangeTable(new Uint32Array([67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1]));
246
- static Linear_B = new UnicodeRangeTable(new Uint32Array([65536, 65547, 1, 65549, 65574, 1, 65576, 65594, 1, 65596, 65597, 1, 65599, 65613, 1, 65616, 65629, 1, 65664, 65786, 1]));
247
- static Lisu = new UnicodeRangeTable(new Uint32Array([42192, 42239, 1, 73648, 73648, 1]));
248
- static Lycian = new UnicodeRangeTable(new Uint32Array([66176, 66204, 1]));
249
- static Lydian = new UnicodeRangeTable(new Uint32Array([67872, 67897, 1, 67903, 67903, 1]));
250
- static Mahajani = new UnicodeRangeTable(new Uint32Array([69968, 70006, 1]));
251
- static Makasar = new UnicodeRangeTable(new Uint32Array([73440, 73464, 1]));
252
- static Malayalam = new UnicodeRangeTable(new Uint32Array([3328, 3340, 1, 3342, 3344, 1, 3346, 3396, 1, 3398, 3400, 1, 3402, 3407, 1, 3412, 3427, 1, 3430, 3455, 1]));
253
- static Mandaic = new UnicodeRangeTable(new Uint32Array([2112, 2139, 1, 2142, 2142, 1]));
254
- static Manichaean = new UnicodeRangeTable(new Uint32Array([68288, 68326, 1, 68331, 68342, 1]));
255
- static Marchen = new UnicodeRangeTable(new Uint32Array([72816, 72847, 1, 72850, 72871, 1, 72873, 72886, 1]));
256
- static Masaram_Gondi = new UnicodeRangeTable(new Uint32Array([72960, 72966, 1, 72968, 72969, 1, 72971, 73014, 1, 73018, 73020, 2, 73021, 73023, 2, 73024, 73031, 1, 73040, 73049, 1]));
257
- static Medefaidrin = new UnicodeRangeTable(new Uint32Array([93760, 93850, 1]));
258
- static Meetei_Mayek = new UnicodeRangeTable(new Uint32Array([43744, 43766, 1, 43968, 44013, 1, 44016, 44025, 1]));
259
- static Mende_Kikakui = new UnicodeRangeTable(new Uint32Array([124928, 125124, 1, 125127, 125142, 1]));
260
- static Meroitic_Cursive = new UnicodeRangeTable(new Uint32Array([68000, 68023, 1, 68028, 68047, 1, 68050, 68095, 1]));
261
- static Meroitic_Hieroglyphs = new UnicodeRangeTable(new Uint32Array([67968, 67999, 1]));
262
- static Miao = new UnicodeRangeTable(new Uint32Array([93952, 94026, 1, 94031, 94087, 1, 94095, 94111, 1]));
263
- static Modi = new UnicodeRangeTable(new Uint32Array([71168, 71236, 1, 71248, 71257, 1]));
264
- static Mongolian = new UnicodeRangeTable(new Uint32Array([6144, 6145, 1, 6148, 6150, 2, 6151, 6169, 1, 6176, 6264, 1, 6272, 6314, 1, 71264, 71276, 1]));
265
- static Mro = new UnicodeRangeTable(new Uint32Array([92736, 92766, 1, 92768, 92777, 1, 92782, 92783, 1]));
266
- static Multani = new UnicodeRangeTable(new Uint32Array([70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70313, 1]));
267
- static Myanmar = new UnicodeRangeTable(new Uint32Array([4096, 4255, 1, 43488, 43518, 1, 43616, 43647, 1, 71376, 71395, 1]));
268
- static Nabataean = new UnicodeRangeTable(new Uint32Array([67712, 67742, 1, 67751, 67759, 1]));
269
- static Nag_Mundari = new UnicodeRangeTable(new Uint32Array([124112, 124153, 1]));
270
- static Nandinagari = new UnicodeRangeTable(new Uint32Array([72096, 72103, 1, 72106, 72151, 1, 72154, 72164, 1]));
271
- static New_Tai_Lue = new UnicodeRangeTable(new Uint32Array([6528, 6571, 1, 6576, 6601, 1, 6608, 6618, 1, 6622, 6623, 1]));
272
- static Newa = new UnicodeRangeTable(new Uint32Array([70656, 70747, 1, 70749, 70753, 1]));
273
- static Nko = new UnicodeRangeTable(new Uint32Array([1984, 2042, 1, 2045, 2047, 1]));
274
- static Nushu = new UnicodeRangeTable(new Uint32Array([94177, 110960, 16783, 110961, 111355, 1]));
275
- static Nyiakeng_Puachue_Hmong = new UnicodeRangeTable(new Uint32Array([123136, 123180, 1, 123184, 123197, 1, 123200, 123209, 1, 123214, 123215, 1]));
276
- static Ogham = new UnicodeRangeTable(new Uint32Array([5760, 5788, 1]));
277
- static Ol_Chiki = new UnicodeRangeTable(new Uint32Array([7248, 7295, 1]));
278
- static Ol_Onal = new UnicodeRangeTable(new Uint32Array([124368, 124410, 1, 124415, 124415, 1]));
279
- static Old_Hungarian = new UnicodeRangeTable(new Uint32Array([68736, 68786, 1, 68800, 68850, 1, 68858, 68863, 1]));
280
- static Old_Italic = new UnicodeRangeTable(new Uint32Array([66304, 66339, 1, 66349, 66351, 1]));
281
- static Old_North_Arabian = new UnicodeRangeTable(new Uint32Array([68224, 68255, 1]));
282
- static Old_Permic = new UnicodeRangeTable(new Uint32Array([66384, 66426, 1]));
283
- static Old_Persian = new UnicodeRangeTable(new Uint32Array([66464, 66499, 1, 66504, 66517, 1]));
284
- static Old_Sogdian = new UnicodeRangeTable(new Uint32Array([69376, 69415, 1]));
285
- static Old_South_Arabian = new UnicodeRangeTable(new Uint32Array([68192, 68223, 1]));
286
- static Old_Turkic = new UnicodeRangeTable(new Uint32Array([68608, 68680, 1]));
287
- static Old_Uyghur = new UnicodeRangeTable(new Uint32Array([69488, 69513, 1]));
288
- static Oriya = new UnicodeRangeTable(new Uint32Array([2817, 2819, 1, 2821, 2828, 1, 2831, 2832, 1, 2835, 2856, 1, 2858, 2864, 1, 2866, 2867, 1, 2869, 2873, 1, 2876, 2884, 1, 2887, 2888, 1, 2891, 2893, 1, 2901, 2903, 1, 2908, 2909, 1, 2911, 2915, 1, 2918, 2935, 1]));
289
- static Osage = new UnicodeRangeTable(new Uint32Array([66736, 66771, 1, 66776, 66811, 1]));
290
- static Osmanya = new UnicodeRangeTable(new Uint32Array([66688, 66717, 1, 66720, 66729, 1]));
291
- static Pahawh_Hmong = new UnicodeRangeTable(new Uint32Array([92928, 92997, 1, 93008, 93017, 1, 93019, 93025, 1, 93027, 93047, 1, 93053, 93071, 1]));
292
- static Palmyrene = new UnicodeRangeTable(new Uint32Array([67680, 67711, 1]));
293
- static Pau_Cin_Hau = new UnicodeRangeTable(new Uint32Array([72384, 72440, 1]));
294
- static Phags_Pa = new UnicodeRangeTable(new Uint32Array([43072, 43127, 1]));
295
- static Phoenician = new UnicodeRangeTable(new Uint32Array([67840, 67867, 1, 67871, 67871, 1]));
296
- static Psalter_Pahlavi = new UnicodeRangeTable(new Uint32Array([68480, 68497, 1, 68505, 68508, 1, 68521, 68527, 1]));
297
- static Rejang = new UnicodeRangeTable(new Uint32Array([43312, 43347, 1, 43359, 43359, 1]));
298
- static Runic = new UnicodeRangeTable(new Uint32Array([5792, 5866, 1, 5870, 5880, 1]));
299
- static Samaritan = new UnicodeRangeTable(new Uint32Array([2048, 2093, 1, 2096, 2110, 1]));
300
- static Saurashtra = new UnicodeRangeTable(new Uint32Array([43136, 43205, 1, 43214, 43225, 1]));
301
- static Sharada = new UnicodeRangeTable(new Uint32Array([70016, 70111, 1]));
302
- static Shavian = new UnicodeRangeTable(new Uint32Array([66640, 66687, 1]));
303
- static Siddham = new UnicodeRangeTable(new Uint32Array([71040, 71093, 1, 71096, 71133, 1]));
304
- static SignWriting = new UnicodeRangeTable(new Uint32Array([120832, 121483, 1, 121499, 121503, 1, 121505, 121519, 1]));
305
- static Sinhala = new UnicodeRangeTable(new Uint32Array([3457, 3459, 1, 3461, 3478, 1, 3482, 3505, 1, 3507, 3515, 1, 3517, 3520, 3, 3521, 3526, 1, 3530, 3535, 5, 3536, 3540, 1, 3542, 3544, 2, 3545, 3551, 1, 3558, 3567, 1, 3570, 3572, 1, 70113, 70132, 1]));
306
- static Sogdian = new UnicodeRangeTable(new Uint32Array([69424, 69465, 1]));
307
- static Sora_Sompeng = new UnicodeRangeTable(new Uint32Array([69840, 69864, 1, 69872, 69881, 1]));
308
- static Soyombo = new UnicodeRangeTable(new Uint32Array([72272, 72354, 1]));
309
- static Sundanese = new UnicodeRangeTable(new Uint32Array([7040, 7103, 1, 7360, 7367, 1]));
310
- static Sunuwar = new UnicodeRangeTable(new Uint32Array([72640, 72673, 1, 72688, 72697, 1]));
311
- static Syloti_Nagri = new UnicodeRangeTable(new Uint32Array([43008, 43052, 1]));
312
- static Syriac = new UnicodeRangeTable(new Uint32Array([1792, 1805, 1, 1807, 1866, 1, 1869, 1871, 1, 2144, 2154, 1]));
313
- static Tagalog = new UnicodeRangeTable(new Uint32Array([5888, 5909, 1, 5919, 5919, 1]));
314
- static Tagbanwa = new UnicodeRangeTable(new Uint32Array([5984, 5996, 1, 5998, 6000, 1, 6002, 6003, 1]));
315
- static Tai_Le = new UnicodeRangeTable(new Uint32Array([6480, 6509, 1, 6512, 6516, 1]));
316
- static Tai_Tham = new UnicodeRangeTable(new Uint32Array([6688, 6750, 1, 6752, 6780, 1, 6783, 6793, 1, 6800, 6809, 1, 6816, 6829, 1]));
317
- static Tai_Viet = new UnicodeRangeTable(new Uint32Array([43648, 43714, 1, 43739, 43743, 1]));
318
- static Takri = new UnicodeRangeTable(new Uint32Array([71296, 71353, 1, 71360, 71369, 1]));
319
- static Tamil = new UnicodeRangeTable(new Uint32Array([2946, 2947, 1, 2949, 2954, 1, 2958, 2960, 1, 2962, 2965, 1, 2969, 2970, 1, 2972, 2974, 2, 2975, 2979, 4, 2980, 2984, 4, 2985, 2986, 1, 2990, 3001, 1, 3006, 3010, 1, 3014, 3016, 1, 3018, 3021, 1, 3024, 3031, 7, 3046, 3066, 1, 73664, 73713, 1, 73727, 73727, 1]));
320
- static Tangsa = new UnicodeRangeTable(new Uint32Array([92784, 92862, 1, 92864, 92873, 1]));
321
- static Tangut = new UnicodeRangeTable(new Uint32Array([94176, 94208, 32, 94209, 100343, 1, 100352, 101119, 1, 101632, 101640, 1]));
322
- static Telugu = new UnicodeRangeTable(new Uint32Array([3072, 3084, 1, 3086, 3088, 1, 3090, 3112, 1, 3114, 3129, 1, 3132, 3140, 1, 3142, 3144, 1, 3146, 3149, 1, 3157, 3158, 1, 3160, 3162, 1, 3165, 3168, 3, 3169, 3171, 1, 3174, 3183, 1, 3191, 3199, 1]));
323
- static Thaana = new UnicodeRangeTable(new Uint32Array([1920, 1969, 1]));
324
- static Thai = new UnicodeRangeTable(new Uint32Array([3585, 3642, 1, 3648, 3675, 1]));
325
- static Tibetan = new UnicodeRangeTable(new Uint32Array([3840, 3911, 1, 3913, 3948, 1, 3953, 3991, 1, 3993, 4028, 1, 4030, 4044, 1, 4046, 4052, 1, 4057, 4058, 1]));
326
- static Tifinagh = new UnicodeRangeTable(new Uint32Array([11568, 11623, 1, 11631, 11632, 1, 11647, 11647, 1]));
327
- static Tirhuta = new UnicodeRangeTable(new Uint32Array([70784, 70855, 1, 70864, 70873, 1]));
328
- static Todhri = new UnicodeRangeTable(new Uint32Array([67008, 67059, 1]));
329
- static Toto = new UnicodeRangeTable(new Uint32Array([123536, 123566, 1]));
330
- static Tulu_Tigalari = new UnicodeRangeTable(new Uint32Array([70528, 70537, 1, 70539, 70542, 3, 70544, 70581, 1, 70583, 70592, 1, 70594, 70597, 3, 70599, 70602, 1, 70604, 70613, 1, 70615, 70616, 1, 70625, 70626, 1]));
331
- static Ugaritic = new UnicodeRangeTable(new Uint32Array([66432, 66461, 1, 66463, 66463, 1]));
332
- static Vai = new UnicodeRangeTable(new Uint32Array([42240, 42539, 1]));
333
- static Vithkuqi = new UnicodeRangeTable(new Uint32Array([66928, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1]));
334
- static Wancho = new UnicodeRangeTable(new Uint32Array([123584, 123641, 1, 123647, 123647, 1]));
335
- static Warang_Citi = new UnicodeRangeTable(new Uint32Array([71840, 71922, 1, 71935, 71935, 1]));
336
- static Yezidi = new UnicodeRangeTable(new Uint32Array([69248, 69289, 1, 69291, 69293, 1, 69296, 69297, 1]));
337
- static Yi = new UnicodeRangeTable(new Uint32Array([40960, 42124, 1, 42128, 42182, 1]));
338
- static Zanabazar_Square = new UnicodeRangeTable(new Uint32Array([72192, 72263, 1]));
339
- static CATEGORIES = new Map([['C', UnicodeTables.C], ['Cc', UnicodeTables.Cc], ['Cf', UnicodeTables.Cf], ['Co', UnicodeTables.Co], ['Cs', UnicodeTables.Cs], ['L', UnicodeTables.L], ['Ll', UnicodeTables.Ll], ['Lm', UnicodeTables.Lm], ['Lo', UnicodeTables.Lo], ['Lt', UnicodeTables.Lt], ['Lu', UnicodeTables.Lu], ['M', UnicodeTables.M], ['Mc', UnicodeTables.Mc], ['Me', UnicodeTables.Me], ['Mn', UnicodeTables.Mn], ['N', UnicodeTables.N], ['Nd', UnicodeTables.Nd], ['Nl', UnicodeTables.Nl], ['No', UnicodeTables.No], ['P', UnicodeTables.P], ['Pc', UnicodeTables.Pc], ['Pd', UnicodeTables.Pd], ['Pe', UnicodeTables.Pe], ['Pf', UnicodeTables.Pf], ['Pi', UnicodeTables.Pi], ['Po', UnicodeTables.Po], ['Ps', UnicodeTables.Ps], ['S', UnicodeTables.S], ['Sc', UnicodeTables.Sc], ['Sk', UnicodeTables.Sk], ['Sm', UnicodeTables.Sm], ['So', UnicodeTables.So], ['Z', UnicodeTables.Z], ['Zl', UnicodeTables.Zl], ['Zp', UnicodeTables.Zp], ['Zs', UnicodeTables.Zs]]);
340
- static SCRIPTS = new Map([['Adlam', UnicodeTables.Adlam], ['Ahom', UnicodeTables.Ahom], ['Anatolian_Hieroglyphs', UnicodeTables.Anatolian_Hieroglyphs], ['Arabic', UnicodeTables.Arabic], ['Armenian', UnicodeTables.Armenian], ['Avestan', UnicodeTables.Avestan], ['Balinese', UnicodeTables.Balinese], ['Bamum', UnicodeTables.Bamum], ['Bassa_Vah', UnicodeTables.Bassa_Vah], ['Batak', UnicodeTables.Batak], ['Bengali', UnicodeTables.Bengali], ['Bhaiksuki', UnicodeTables.Bhaiksuki], ['Bopomofo', UnicodeTables.Bopomofo], ['Brahmi', UnicodeTables.Brahmi], ['Braille', UnicodeTables.Braille], ['Buginese', UnicodeTables.Buginese], ['Buhid', UnicodeTables.Buhid], ['Canadian_Aboriginal', UnicodeTables.Canadian_Aboriginal], ['Carian', UnicodeTables.Carian], ['Caucasian_Albanian', UnicodeTables.Caucasian_Albanian], ['Chakma', UnicodeTables.Chakma], ['Cham', UnicodeTables.Cham], ['Cherokee', UnicodeTables.Cherokee], ['Chorasmian', UnicodeTables.Chorasmian], ['Common', UnicodeTables.Common], ['Coptic', UnicodeTables.Coptic], ['Cuneiform', UnicodeTables.Cuneiform], ['Cypriot', UnicodeTables.Cypriot], ['Cypro_Minoan', UnicodeTables.Cypro_Minoan], ['Cyrillic', UnicodeTables.Cyrillic], ['Deseret', UnicodeTables.Deseret], ['Devanagari', UnicodeTables.Devanagari], ['Dives_Akuru', UnicodeTables.Dives_Akuru], ['Dogra', UnicodeTables.Dogra], ['Duployan', UnicodeTables.Duployan], ['Egyptian_Hieroglyphs', UnicodeTables.Egyptian_Hieroglyphs], ['Elbasan', UnicodeTables.Elbasan], ['Elymaic', UnicodeTables.Elymaic], ['Ethiopic', UnicodeTables.Ethiopic], ['Garay', UnicodeTables.Garay], ['Georgian', UnicodeTables.Georgian], ['Glagolitic', UnicodeTables.Glagolitic], ['Gothic', UnicodeTables.Gothic], ['Grantha', UnicodeTables.Grantha], ['Greek', UnicodeTables.Greek], ['Gujarati', UnicodeTables.Gujarati], ['Gunjala_Gondi', UnicodeTables.Gunjala_Gondi], ['Gurmukhi', UnicodeTables.Gurmukhi], ['Gurung_Khema', UnicodeTables.Gurung_Khema], ['Han', UnicodeTables.Han], ['Hangul', UnicodeTables.Hangul], ['Hanifi_Rohingya', UnicodeTables.Hanifi_Rohingya], ['Hanunoo', UnicodeTables.Hanunoo], ['Hatran', UnicodeTables.Hatran], ['Hebrew', UnicodeTables.Hebrew], ['Hiragana', UnicodeTables.Hiragana], ['Imperial_Aramaic', UnicodeTables.Imperial_Aramaic], ['Inherited', UnicodeTables.Inherited], ['Inscriptional_Pahlavi', UnicodeTables.Inscriptional_Pahlavi], ['Inscriptional_Parthian', UnicodeTables.Inscriptional_Parthian], ['Javanese', UnicodeTables.Javanese], ['Kaithi', UnicodeTables.Kaithi], ['Kannada', UnicodeTables.Kannada], ['Katakana', UnicodeTables.Katakana], ['Kawi', UnicodeTables.Kawi], ['Kayah_Li', UnicodeTables.Kayah_Li], ['Kharoshthi', UnicodeTables.Kharoshthi], ['Khitan_Small_Script', UnicodeTables.Khitan_Small_Script], ['Khmer', UnicodeTables.Khmer], ['Khojki', UnicodeTables.Khojki], ['Khudawadi', UnicodeTables.Khudawadi], ['Kirat_Rai', UnicodeTables.Kirat_Rai], ['Lao', UnicodeTables.Lao], ['Latin', UnicodeTables.Latin], ['Lepcha', UnicodeTables.Lepcha], ['Limbu', UnicodeTables.Limbu], ['Linear_A', UnicodeTables.Linear_A], ['Linear_B', UnicodeTables.Linear_B], ['Lisu', UnicodeTables.Lisu], ['Lycian', UnicodeTables.Lycian], ['Lydian', UnicodeTables.Lydian], ['Mahajani', UnicodeTables.Mahajani], ['Makasar', UnicodeTables.Makasar], ['Malayalam', UnicodeTables.Malayalam], ['Mandaic', UnicodeTables.Mandaic], ['Manichaean', UnicodeTables.Manichaean], ['Marchen', UnicodeTables.Marchen], ['Masaram_Gondi', UnicodeTables.Masaram_Gondi], ['Medefaidrin', UnicodeTables.Medefaidrin], ['Meetei_Mayek', UnicodeTables.Meetei_Mayek], ['Mende_Kikakui', UnicodeTables.Mende_Kikakui], ['Meroitic_Cursive', UnicodeTables.Meroitic_Cursive], ['Meroitic_Hieroglyphs', UnicodeTables.Meroitic_Hieroglyphs], ['Miao', UnicodeTables.Miao], ['Modi', UnicodeTables.Modi], ['Mongolian', UnicodeTables.Mongolian], ['Mro', UnicodeTables.Mro], ['Multani', UnicodeTables.Multani], ['Myanmar', UnicodeTables.Myanmar], ['Nabataean', UnicodeTables.Nabataean], ['Nag_Mundari', UnicodeTables.Nag_Mundari], ['Nandinagari', UnicodeTables.Nandinagari], ['New_Tai_Lue', UnicodeTables.New_Tai_Lue], ['Newa', UnicodeTables.Newa], ['Nko', UnicodeTables.Nko], ['Nushu', UnicodeTables.Nushu], ['Nyiakeng_Puachue_Hmong', UnicodeTables.Nyiakeng_Puachue_Hmong], ['Ogham', UnicodeTables.Ogham], ['Ol_Chiki', UnicodeTables.Ol_Chiki], ['Ol_Onal', UnicodeTables.Ol_Onal], ['Old_Hungarian', UnicodeTables.Old_Hungarian], ['Old_Italic', UnicodeTables.Old_Italic], ['Old_North_Arabian', UnicodeTables.Old_North_Arabian], ['Old_Permic', UnicodeTables.Old_Permic], ['Old_Persian', UnicodeTables.Old_Persian], ['Old_Sogdian', UnicodeTables.Old_Sogdian], ['Old_South_Arabian', UnicodeTables.Old_South_Arabian], ['Old_Turkic', UnicodeTables.Old_Turkic], ['Old_Uyghur', UnicodeTables.Old_Uyghur], ['Oriya', UnicodeTables.Oriya], ['Osage', UnicodeTables.Osage], ['Osmanya', UnicodeTables.Osmanya], ['Pahawh_Hmong', UnicodeTables.Pahawh_Hmong], ['Palmyrene', UnicodeTables.Palmyrene], ['Pau_Cin_Hau', UnicodeTables.Pau_Cin_Hau], ['Phags_Pa', UnicodeTables.Phags_Pa], ['Phoenician', UnicodeTables.Phoenician], ['Psalter_Pahlavi', UnicodeTables.Psalter_Pahlavi], ['Rejang', UnicodeTables.Rejang], ['Runic', UnicodeTables.Runic], ['Samaritan', UnicodeTables.Samaritan], ['Saurashtra', UnicodeTables.Saurashtra], ['Sharada', UnicodeTables.Sharada], ['Shavian', UnicodeTables.Shavian], ['Siddham', UnicodeTables.Siddham], ['SignWriting', UnicodeTables.SignWriting], ['Sinhala', UnicodeTables.Sinhala], ['Sogdian', UnicodeTables.Sogdian], ['Sora_Sompeng', UnicodeTables.Sora_Sompeng], ['Soyombo', UnicodeTables.Soyombo], ['Sundanese', UnicodeTables.Sundanese], ['Sunuwar', UnicodeTables.Sunuwar], ['Syloti_Nagri', UnicodeTables.Syloti_Nagri], ['Syriac', UnicodeTables.Syriac], ['Tagalog', UnicodeTables.Tagalog], ['Tagbanwa', UnicodeTables.Tagbanwa], ['Tai_Le', UnicodeTables.Tai_Le], ['Tai_Tham', UnicodeTables.Tai_Tham], ['Tai_Viet', UnicodeTables.Tai_Viet], ['Takri', UnicodeTables.Takri], ['Tamil', UnicodeTables.Tamil], ['Tangsa', UnicodeTables.Tangsa], ['Tangut', UnicodeTables.Tangut], ['Telugu', UnicodeTables.Telugu], ['Thaana', UnicodeTables.Thaana], ['Thai', UnicodeTables.Thai], ['Tibetan', UnicodeTables.Tibetan], ['Tifinagh', UnicodeTables.Tifinagh], ['Tirhuta', UnicodeTables.Tirhuta], ['Todhri', UnicodeTables.Todhri], ['Toto', UnicodeTables.Toto], ['Tulu_Tigalari', UnicodeTables.Tulu_Tigalari], ['Ugaritic', UnicodeTables.Ugaritic], ['Vai', UnicodeTables.Vai], ['Vithkuqi', UnicodeTables.Vithkuqi], ['Wancho', UnicodeTables.Wancho], ['Warang_Citi', UnicodeTables.Warang_Citi], ['Yezidi', UnicodeTables.Yezidi], ['Yi', UnicodeTables.Yi], ['Zanabazar_Square', UnicodeTables.Zanabazar_Square]]);
341
- static FOLD_CATEGORIES = new Map([['L', UnicodeTables.foldL], ['Ll', UnicodeTables.foldLl], ['Lt', UnicodeTables.foldLt], ['Lu', UnicodeTables.foldLu], ['M', UnicodeTables.foldM], ['Mn', UnicodeTables.foldMn]]);
342
- static FOLD_SCRIPT = new Map([['Common', UnicodeTables.foldCommon], ['Greek', UnicodeTables.foldGreek], ['Inherited', UnicodeTables.foldInherited]]);
343
- static Print = new UnicodeRangeTable(new Uint32Array([33, 126, 1, 161, 172, 1, 174, 887, 1, 890, 895, 1, 900, 906, 1, 908, 910, 2, 911, 929, 1, 931, 1327, 1, 1329, 1366, 1, 1369, 1418, 1, 1421, 1423, 1, 1425, 1479, 1, 1488, 1514, 1, 1519, 1524, 1, 1542, 1563, 1, 1565, 1756, 1, 1758, 1805, 1, 1808, 1866, 1, 1869, 1969, 1, 1984, 2042, 1, 2045, 2093, 1, 2096, 2110, 1, 2112, 2139, 1, 2142, 2144, 2, 2145, 2154, 1, 2160, 2190, 1, 2199, 2273, 1, 2275, 2435, 1, 2437, 2444, 1, 2447, 2448, 1, 2451, 2472, 1, 2474, 2480, 1, 2482, 2486, 4, 2487, 2489, 1, 2492, 2500, 1, 2503, 2504, 1, 2507, 2510, 1, 2519, 2524, 5, 2525, 2527, 2, 2528, 2531, 1, 2534, 2558, 1, 2561, 2563, 1, 2565, 2570, 1, 2575, 2576, 1, 2579, 2600, 1, 2602, 2608, 1, 2610, 2611, 1, 2613, 2614, 1, 2616, 2617, 1, 2620, 2622, 2, 2623, 2626, 1, 2631, 2632, 1, 2635, 2637, 1, 2641, 2649, 8, 2650, 2652, 1, 2654, 2662, 8, 2663, 2678, 1, 2689, 2691, 1, 2693, 2701, 1, 2703, 2705, 1, 2707, 2728, 1, 2730, 2736, 1, 2738, 2739, 1, 2741, 2745, 1, 2748, 2757, 1, 2759, 2761, 1, 2763, 2765, 1, 2768, 2784, 16, 2785, 2787, 1, 2790, 2801, 1, 2809, 2815, 1, 2817, 2819, 1, 2821, 2828, 1, 2831, 2832, 1, 2835, 2856, 1, 2858, 2864, 1, 2866, 2867, 1, 2869, 2873, 1, 2876, 2884, 1, 2887, 2888, 1, 2891, 2893, 1, 2901, 2903, 1, 2908, 2909, 1, 2911, 2915, 1, 2918, 2935, 1, 2946, 2947, 1, 2949, 2954, 1, 2958, 2960, 1, 2962, 2965, 1, 2969, 2970, 1, 2972, 2974, 2, 2975, 2979, 4, 2980, 2984, 4, 2985, 2986, 1, 2990, 3001, 1, 3006, 3010, 1, 3014, 3016, 1, 3018, 3021, 1, 3024, 3031, 7, 3046, 3066, 1, 3072, 3084, 1, 3086, 3088, 1, 3090, 3112, 1, 3114, 3129, 1, 3132, 3140, 1, 3142, 3144, 1, 3146, 3149, 1, 3157, 3158, 1, 3160, 3162, 1, 3165, 3168, 3, 3169, 3171, 1, 3174, 3183, 1, 3191, 3212, 1, 3214, 3216, 1, 3218, 3240, 1, 3242, 3251, 1, 3253, 3257, 1, 3260, 3268, 1, 3270, 3272, 1, 3274, 3277, 1, 3285, 3286, 1, 3293, 3294, 1, 3296, 3299, 1, 3302, 3311, 1, 3313, 3315, 1, 3328, 3340, 1, 3342, 3344, 1, 3346, 3396, 1, 3398, 3400, 1, 3402, 3407, 1, 3412, 3427, 1, 3430, 3455, 1, 3457, 3459, 1, 3461, 3478, 1, 3482, 3505, 1, 3507, 3515, 1, 3517, 3520, 3, 3521, 3526, 1, 3530, 3535, 5, 3536, 3540, 1, 3542, 3544, 2, 3545, 3551, 1, 3558, 3567, 1, 3570, 3572, 1, 3585, 3642, 1, 3647, 3675, 1, 3713, 3714, 1, 3716, 3718, 2, 3719, 3722, 1, 3724, 3747, 1, 3749, 3751, 2, 3752, 3773, 1, 3776, 3780, 1, 3782, 3784, 2, 3785, 3790, 1, 3792, 3801, 1, 3804, 3807, 1, 3840, 3911, 1, 3913, 3948, 1, 3953, 3991, 1, 3993, 4028, 1, 4030, 4044, 1, 4046, 4058, 1, 4096, 4293, 1, 4295, 4301, 6, 4304, 4680, 1, 4682, 4685, 1, 4688, 4694, 1, 4696, 4698, 2, 4699, 4701, 1, 4704, 4744, 1, 4746, 4749, 1, 4752, 4784, 1, 4786, 4789, 1, 4792, 4798, 1, 4800, 4802, 2, 4803, 4805, 1, 4808, 4822, 1, 4824, 4880, 1, 4882, 4885, 1, 4888, 4954, 1, 4957, 4988, 1, 4992, 5017, 1, 5024, 5109, 1, 5112, 5117, 1, 5120, 5759, 1, 5761, 5788, 1, 5792, 5880, 1, 5888, 5909, 1, 5919, 5942, 1, 5952, 5971, 1, 5984, 5996, 1, 5998, 6000, 1, 6002, 6003, 1, 6016, 6109, 1, 6112, 6121, 1, 6128, 6137, 1, 6144, 6157, 1, 6159, 6169, 1, 6176, 6264, 1, 6272, 6314, 1, 6320, 6389, 1, 6400, 6430, 1, 6432, 6443, 1, 6448, 6459, 1, 6464, 6468, 4, 6469, 6509, 1, 6512, 6516, 1, 6528, 6571, 1, 6576, 6601, 1, 6608, 6618, 1, 6622, 6683, 1, 6686, 6750, 1, 6752, 6780, 1, 6783, 6793, 1, 6800, 6809, 1, 6816, 6829, 1, 6832, 6862, 1, 6912, 6988, 1, 6990, 7155, 1, 7164, 7223, 1, 7227, 7241, 1, 7245, 7306, 1, 7312, 7354, 1, 7357, 7367, 1, 7376, 7418, 1, 7424, 7957, 1, 7960, 7965, 1, 7968, 8005, 1, 8008, 8013, 1, 8016, 8023, 1, 8025, 8031, 2, 8032, 8061, 1, 8064, 8116, 1, 8118, 8132, 1, 8134, 8147, 1, 8150, 8155, 1, 8157, 8175, 1, 8178, 8180, 1, 8182, 8190, 1, 8208, 8231, 1, 8240, 8286, 1, 8304, 8305, 1, 8308, 8334, 1, 8336, 8348, 1, 8352, 8384, 1, 8400, 8432, 1, 8448, 8587, 1, 8592, 9257, 1, 9280, 9290, 1, 9312, 11123, 1, 11126, 11157, 1, 11159, 11507, 1, 11513, 11557, 1, 11559, 11565, 6, 11568, 11623, 1, 11631, 11632, 1, 11647, 11670, 1, 11680, 11686, 1, 11688, 11694, 1, 11696, 11702, 1, 11704, 11710, 1, 11712, 11718, 1, 11720, 11726, 1, 11728, 11734, 1, 11736, 11742, 1, 11744, 11869, 1, 11904, 11929, 1, 11931, 12019, 1, 12032, 12245, 1, 12272, 12287, 1, 12289, 12351, 1, 12353, 12438, 1, 12441, 12543, 1, 12549, 12591, 1, 12593, 12686, 1, 12688, 12773, 1, 12783, 12830, 1, 12832, 42124, 1, 42128, 42182, 1, 42192, 42539, 1, 42560, 42743, 1, 42752, 42957, 1, 42960, 42961, 1, 42963, 42965, 2, 42966, 42972, 1, 42994, 43052, 1, 43056, 43065, 1, 43072, 43127, 1, 43136, 43205, 1, 43214, 43225, 1, 43232, 43347, 1, 43359, 43388, 1, 43392, 43469, 1, 43471, 43481, 1, 43486, 43518, 1, 43520, 43574, 1, 43584, 43597, 1, 43600, 43609, 1, 43612, 43714, 1, 43739, 43766, 1, 43777, 43782, 1, 43785, 43790, 1, 43793, 43798, 1, 43808, 43814, 1, 43816, 43822, 1, 43824, 43883, 1, 43888, 44013, 1, 44016, 44025, 1, 44032, 55203, 1, 55216, 55238, 1, 55243, 55291, 1, 63744, 64109, 1, 64112, 64217, 1, 64256, 64262, 1, 64275, 64279, 1, 64285, 64310, 1, 64312, 64316, 1, 64318, 64320, 2, 64321, 64323, 2, 64324, 64326, 2, 64327, 64450, 1, 64467, 64911, 1, 64914, 64967, 1, 64975, 65008, 33, 65009, 65049, 1, 65056, 65106, 1, 65108, 65126, 1, 65128, 65131, 1, 65136, 65140, 1, 65142, 65276, 1, 65281, 65470, 1, 65474, 65479, 1, 65482, 65487, 1, 65490, 65495, 1, 65498, 65500, 1, 65504, 65510, 1, 65512, 65518, 1, 65532, 65533, 1, 65536, 65547, 1, 65549, 65574, 1, 65576, 65594, 1, 65596, 65597, 1, 65599, 65613, 1, 65616, 65629, 1, 65664, 65786, 1, 65792, 65794, 1, 65799, 65843, 1, 65847, 65934, 1, 65936, 65948, 1, 65952, 66000, 48, 66001, 66045, 1, 66176, 66204, 1, 66208, 66256, 1, 66272, 66299, 1, 66304, 66339, 1, 66349, 66378, 1, 66384, 66426, 1, 66432, 66461, 1, 66463, 66499, 1, 66504, 66517, 1, 66560, 66717, 1, 66720, 66729, 1, 66736, 66771, 1, 66776, 66811, 1, 66816, 66855, 1, 66864, 66915, 1, 66927, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1, 67008, 67059, 1, 67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1, 67456, 67461, 1, 67463, 67504, 1, 67506, 67514, 1, 67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3, 67648, 67669, 1, 67671, 67742, 1, 67751, 67759, 1, 67808, 67826, 1, 67828, 67829, 1, 67835, 67867, 1, 67871, 67897, 1, 67903, 67968, 65, 67969, 68023, 1, 68028, 68047, 1, 68050, 68099, 1, 68101, 68102, 1, 68108, 68115, 1, 68117, 68119, 1, 68121, 68149, 1, 68152, 68154, 1, 68159, 68168, 1, 68176, 68184, 1, 68192, 68255, 1, 68288, 68326, 1, 68331, 68342, 1, 68352, 68405, 1, 68409, 68437, 1, 68440, 68466, 1, 68472, 68497, 1, 68505, 68508, 1, 68521, 68527, 1, 68608, 68680, 1, 68736, 68786, 1, 68800, 68850, 1, 68858, 68903, 1, 68912, 68921, 1, 68928, 68965, 1, 68969, 68997, 1, 69006, 69007, 1, 69216, 69246, 1, 69248, 69289, 1, 69291, 69293, 1, 69296, 69297, 1, 69314, 69316, 1, 69372, 69415, 1, 69424, 69465, 1, 69488, 69513, 1, 69552, 69579, 1, 69600, 69622, 1, 69632, 69709, 1, 69714, 69749, 1, 69759, 69820, 1, 69822, 69826, 1, 69840, 69864, 1, 69872, 69881, 1, 69888, 69940, 1, 69942, 69959, 1, 69968, 70006, 1, 70016, 70111, 1, 70113, 70132, 1, 70144, 70161, 1, 70163, 70209, 1, 70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70313, 1, 70320, 70378, 1, 70384, 70393, 1, 70400, 70403, 1, 70405, 70412, 1, 70415, 70416, 1, 70419, 70440, 1, 70442, 70448, 1, 70450, 70451, 1, 70453, 70457, 1, 70459, 70468, 1, 70471, 70472, 1, 70475, 70477, 1, 70480, 70487, 7, 70493, 70499, 1, 70502, 70508, 1, 70512, 70516, 1, 70528, 70537, 1, 70539, 70542, 3, 70544, 70581, 1, 70583, 70592, 1, 70594, 70597, 3, 70599, 70602, 1, 70604, 70613, 1, 70615, 70616, 1, 70625, 70626, 1, 70656, 70747, 1, 70749, 70753, 1, 70784, 70855, 1, 70864, 70873, 1, 71040, 71093, 1, 71096, 71133, 1, 71168, 71236, 1, 71248, 71257, 1, 71264, 71276, 1, 71296, 71353, 1, 71360, 71369, 1, 71376, 71395, 1, 71424, 71450, 1, 71453, 71467, 1, 71472, 71494, 1, 71680, 71739, 1, 71840, 71922, 1, 71935, 71942, 1, 71945, 71948, 3, 71949, 71955, 1, 71957, 71958, 1, 71960, 71989, 1, 71991, 71992, 1, 71995, 72006, 1, 72016, 72025, 1, 72096, 72103, 1, 72106, 72151, 1, 72154, 72164, 1, 72192, 72263, 1, 72272, 72354, 1, 72368, 72440, 1, 72448, 72457, 1, 72640, 72673, 1, 72688, 72697, 1, 72704, 72712, 1, 72714, 72758, 1, 72760, 72773, 1, 72784, 72812, 1, 72816, 72847, 1, 72850, 72871, 1, 72873, 72886, 1, 72960, 72966, 1, 72968, 72969, 1, 72971, 73014, 1, 73018, 73020, 2, 73021, 73023, 2, 73024, 73031, 1, 73040, 73049, 1, 73056, 73061, 1, 73063, 73064, 1, 73066, 73102, 1, 73104, 73105, 1, 73107, 73112, 1, 73120, 73129, 1, 73440, 73464, 1, 73472, 73488, 1, 73490, 73530, 1, 73534, 73562, 1, 73648, 73664, 16, 73665, 73713, 1, 73727, 74649, 1, 74752, 74862, 1, 74864, 74868, 1, 74880, 75075, 1, 77712, 77810, 1, 77824, 78895, 1, 78912, 78933, 1, 78944, 82938, 1, 82944, 83526, 1, 90368, 90425, 1, 92160, 92728, 1, 92736, 92766, 1, 92768, 92777, 1, 92782, 92862, 1, 92864, 92873, 1, 92880, 92909, 1, 92912, 92917, 1, 92928, 92997, 1, 93008, 93017, 1, 93019, 93025, 1, 93027, 93047, 1, 93053, 93071, 1, 93504, 93561, 1, 93760, 93850, 1, 93952, 94026, 1, 94031, 94087, 1, 94095, 94111, 1, 94176, 94180, 1, 94192, 94193, 1, 94208, 100343, 1, 100352, 101589, 1, 101631, 101640, 1, 110576, 110579, 1, 110581, 110587, 1, 110589, 110590, 1, 110592, 110882, 1, 110898, 110928, 30, 110929, 110930, 1, 110933, 110948, 15, 110949, 110951, 1, 110960, 111355, 1, 113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 113820, 113823, 1, 117760, 118009, 1, 118016, 118451, 1, 118528, 118573, 1, 118576, 118598, 1, 118608, 118723, 1, 118784, 119029, 1, 119040, 119078, 1, 119081, 119154, 1, 119163, 119274, 1, 119296, 119365, 1, 119488, 119507, 1, 119520, 119539, 1, 119552, 119638, 1, 119648, 119672, 1, 119808, 119892, 1, 119894, 119964, 1, 119966, 119967, 1, 119970, 119973, 3, 119974, 119977, 3, 119978, 119980, 1, 119982, 119993, 1, 119995, 119997, 2, 119998, 120003, 1, 120005, 120069, 1, 120071, 120074, 1, 120077, 120084, 1, 120086, 120092, 1, 120094, 120121, 1, 120123, 120126, 1, 120128, 120132, 1, 120134, 120138, 4, 120139, 120144, 1, 120146, 120485, 1, 120488, 120779, 1, 120782, 121483, 1, 121499, 121503, 1, 121505, 121519, 1, 122624, 122654, 1, 122661, 122666, 1, 122880, 122886, 1, 122888, 122904, 1, 122907, 122913, 1, 122915, 122916, 1, 122918, 122922, 1, 122928, 122989, 1, 123023, 123136, 113, 123137, 123180, 1, 123184, 123197, 1, 123200, 123209, 1, 123214, 123215, 1, 123536, 123566, 1, 123584, 123641, 1, 123647, 124112, 465, 124113, 124153, 1, 124368, 124410, 1, 124415, 124896, 481, 124897, 124902, 1, 124904, 124907, 1, 124909, 124910, 1, 124912, 124926, 1, 124928, 125124, 1, 125127, 125142, 1, 125184, 125259, 1, 125264, 125273, 1, 125278, 125279, 1, 126065, 126132, 1, 126209, 126269, 1, 126464, 126467, 1, 126469, 126495, 1, 126497, 126498, 1, 126500, 126503, 3, 126505, 126514, 1, 126516, 126519, 1, 126521, 126523, 2, 126530, 126535, 5, 126537, 126541, 2, 126542, 126543, 1, 126545, 126546, 1, 126548, 126551, 3, 126553, 126561, 2, 126562, 126564, 2, 126567, 126570, 1, 126572, 126578, 1, 126580, 126583, 1, 126585, 126588, 1, 126590, 126592, 2, 126593, 126601, 1, 126603, 126619, 1, 126625, 126627, 1, 126629, 126633, 1, 126635, 126651, 1, 126704, 126705, 1, 126976, 127019, 1, 127024, 127123, 1, 127136, 127150, 1, 127153, 127167, 1, 127169, 127183, 1, 127185, 127221, 1, 127232, 127405, 1, 127462, 127490, 1, 127504, 127547, 1, 127552, 127560, 1, 127568, 127569, 1, 127584, 127589, 1, 127744, 128727, 1, 128732, 128748, 1, 128752, 128764, 1, 128768, 128886, 1, 128891, 128985, 1, 128992, 129003, 1, 129008, 129024, 16, 129025, 129035, 1, 129040, 129095, 1, 129104, 129113, 1, 129120, 129159, 1, 129168, 129197, 1, 129200, 129211, 1, 129216, 129217, 1, 129280, 129619, 1, 129632, 129645, 1, 129648, 129660, 1, 129664, 129673, 1, 129679, 129734, 1, 129742, 129756, 1, 129759, 129769, 1, 129776, 129784, 1, 129792, 129938, 1, 129940, 130041, 1, 131072, 173791, 1, 173824, 177977, 1, 177984, 178205, 1, 178208, 183969, 1, 183984, 191456, 1, 191472, 192093, 1, 194560, 195101, 1, 196608, 201546, 1, 201552, 205743, 1, 917760, 917999, 1]));
201
+ static _CASE_ORBIT = null;
202
+ static get CASE_ORBIT() {
203
+ if (!this._CASE_ORBIT) {
204
+ this._CASE_ORBIT = decodeOrbit('rCrDIzDYqpII-LiC8cQlHa+0HGrpI6EzClClOBmOBkOBoOBpOBnOBrOBsOBqOlByPBzPBxPyK5crCz+HCydD1dD4dB5dB6dC8dEgeBheCieDmeDpeHj-HCweD1fDxeB+9HBwfC1FE2eBxfBjeBjdD1eDmpIHycB0fEmdBgda6cBhdD4cB1cdyhBC0hBK+hBDhiBBiiBIqiBIgkHChkHKikHDjkHBkkHImkHYjjBBnkH9gGygBB0gBB+gBBhhBBlkHBihBBqhBBijBBqypB4OhzHB70H6BgzHD-GiHo8HBp8HBq8HBr8HBs8HBt8HBu8HBv8HBg8HBh8HBi8HBj8HBk8HBl8HBm8HBn8HB48HB58HB68HB78HB88HB98HB+8HB-8HBw8HBx8HBy8HBz8HB08HB18HB28HB38HBo9HBp9HBq9HBr9HBs9HBt9HBu9HBv9HBg9HBh9HBi9HBj9HBk9HBl9HBm9HBn9HE89HJz9HClaFs+HJj+HHwcQwdQ8-HJz-HqJpdErCBlG-ohBrypBBokH6lVm4+BBl4+B6nCohhCBphhCBqhhCBrhhCBshhCBthhCBuhhCBvhhCBwhhCBxhhCByhhCBzhhCB0hhCB1hhCB2hhCB3hhCB4hhCB5hhCB6hhCB7hhCB8hhCB9hhCB+hhCB-hhCBgihCBhihCBiihCBjihCBkihCBlihCBmihCBnihCBoihCBpihCBqihCBrihCBsihCBtihCBuihCBvihCBgghCBhghCBighCBjghCBkghCBlghCBmghCBnghCBoghCBpghCBqghCBrghCBsghCBtghCBughCBvghCBwghCBxghCByghCBzghCB0ghCB1ghCB2ghCB3ghCB4ghCB5ghCB6ghCB7ghCB8ghCB9ghCB+ghCB-ghCBghhCBhhhCBihhCBjhhCBkhhCBlhhCBmhhCBnhhChD4mhCB5mhCB6mhCB7mhCB8mhCB9mhCB+mhCB-mhCBgnhCBhnhCBinhCBjnhCBknhCBlnhCBmnhCBnnhCBonhCBpnhCBqnhCBrnhCBsnhCBtnhCBunhCBvnhCBwnhCBxnhCBynhCBznhCB0nhCB1nhCB2nhCB3nhCB4nhCB5nhCB6nhCB7nhCFwlhCBxlhCBylhCBzlhCB0lhCB1lhCB2lhCB3lhCB4lhCB5lhCB6lhCB7lhCB8lhCB9lhCB+lhCB-lhCBgmhCBhmhCBimhCBjmhCBkmhCBlmhCBmmhCBnmhCBomhCBpmhCBqmhCBrmhCBsmhCBtmhCBumhCBvmhCBwmhCBxmhCBymhCBzmhC1D3shCB4shCB5shCB6shCB7shCB8shCB9shCB+shCB-shCBgthCBhthCCjthCBkthCBlthCBmthCBnthCBothCBpthCBqthCBrthCBsthCBtthCButhCBvthCBwthCBxthCCzthCB0thCB1thCB2thCB3thCB4thCB5thCC7thCB8thCCwrhCBxrhCByrhCBzrhCB0rhCB1rhCB2rhCB3rhCB4rhCB5rhCB6rhCC8rhCB9rhCB+rhCB-rhCBgshCBhshCBishCBjshCBkshCBlshCBmshCBnshCBoshCBpshCBqshCCsshCBtshCBushCBvshCBwshCBxshCByshCC0shCB1shCk2BgmjCBhmjCBimjCBjmjCBkmjCBlmjCBmmjCBnmjCBomjCBpmjCBqmjCBrmjCBsmjCBtmjCBumjCBvmjCBwmjCBxmjCBymjCBzmjCB0mjCB1mjCB2mjCB3mjCB4mjCB5mjCB6mjCB7mjCB8mjCB9mjCB+mjCB-mjCBgnjCBhnjCBinjCBjnjCBknjCBlnjCBmnjCBnnjCBonjCBpnjCBqnjCBrnjCBsnjCBtnjCBunjCBvnjCBwnjCBxnjCBynjCOgkjCBhkjCBikjCBjkjCBkkjCBlkjCBmkjCBnkjCBokjCBpkjCBqkjCBrkjCBskjCBtkjCBukjCBvkjCBwkjCBxkjCBykjCBzkjCB0kjCB1kjCB2kjCB3kjCB4kjCB5kjCB6kjCB7kjCB8kjCB9kjCB+kjCB-kjCBgljCBhljCBiljCBjljCBkljCBlljCBmljCBnljCBoljCBpljCBqljCBrljCBsljCBtljCBuljCBvljCBwljCBxljCByljC+CwrjCBxrjCByrjCBzrjCB0rjCB1rjCB2rjCB3rjCB4rjCB5rjCB6rjCB7rjCB8rjCB9rjCB+rjCB-rjCBgsjCBhsjCBisjCBjsjCBksjCBlsjCLwqjCBxqjCByqjCBzqjCB0qjCB1qjCB2qjCB3qjCB4qjCB5qjCB6qjCB7qjCB8qjCB9qjCB+qjCB-qjCBgrjCBhrjCBirjCBjrjCBkrjCBlrjC74CgmmCBhmmCBimmCBjmmCBkmmCBlmmCBmmmCBnmmCBommCBpmmCBqmmCBrmmCBsmmCBtmmCBummCBvmmCBwmmCBxmmCBymmCBzmmCB0mmCB1mmCB2mmCB3mmCB4mmCB5mmCB6mmCB7mmCB8mmCB9mmCB+mmCB-mmCBglmCBhlmCBilmCBjlmCBklmCBllmCBmlmCBnlmCBolmCBplmCBqlmCBrlmCBslmCBtlmCBulmCBvlmCBwlmCBxlmCBylmCBzlmCB0lmCB1lmCB2lmCB3lmCB4lmCB5lmCB6lmCB7lmCB8lmCB9lmCB+lmCB-lmChrVgz7CBhz7CBiz7CBjz7CBkz7CBlz7CBmz7CBnz7CBoz7CBpz7CBqz7CBrz7CBsz7CBtz7CBuz7CBvz7CBwz7CBxz7CByz7CBzz7CB0z7CB1z7CB2z7CB3z7CB4z7CB5z7CB6z7CB7z7CB8z7CB9z7CB+z7CB-z7CBgy7CBhy7CBiy7CBjy7CBky7CBly7CBmy7CBny7CBoy7CBpy7CBqy7CBry7CBsy7CBty7CBuy7CBvy7CBwy7CBxy7CByy7CBzy7CB0y7CB1y7CB2y7CB3y7CB4y7CB5y7CB6y7CB7y7CB8y7CB9y7CB+y7CB-y7Ch0eip6DBjp6DBkp6DBlp6DBmp6DBnp6DBop6DBpp6DBqp6DBrp6DBsp6DBtp6DBup6DBvp6DBwp6DBxp6DByp6DBzp6DB0p6DB1p6DB2p6DB3p6DB4p6DB5p6DB6p6DB7p6DB8p6DB9p6DB+p6DB-p6DBgq6DBhq6DBiq6DBjq6DBgo6DBho6DBio6DBjo6DBko6DBlo6DBmo6DBno6DBoo6DBpo6DBqo6DBro6DBso6DBto6DBuo6DBvo6DBwo6DBxo6DByo6DBzo6DB0o6DB1o6DB2o6DB3o6DB4o6DB5o6DB6o6DB7o6DB8o6DB9o6DB+o6DB-o6DBgp6DBhp6D');
205
+ }
206
+ return this._CASE_ORBIT;
207
+ }
208
+ static _Print = null;
209
+ static get Print() {
210
+ if (!this._Print) {
211
+ this._Print = new UnicodeRangeTable(decodeRanges('hB9CBjBLBCpWBDFBFGBCCCBSBCsMBClBBDxBBDCBC2BBJaBFFBSVBC-FBCvBBD6BBDkDBP6BBDwBBDOBCbBDCCBJBGeBJqCBCgFBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYBDCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPBLCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGBCCBCHBDBBDVBCGBCBBCEBDIBDBBDCBICBFBBCEBDRBLBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBGMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIVBCCBCWBCJBCEBDIBCCBCDBIBBHBBCDBDJBCCBNMBCCBCyBBCCBCFBFPBDZBCCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBN5BBFcBmBBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDBhBnCBCjBBFmBBCjBBCOBCMBmBlGBCGGD4LBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBH1CBDFBD-TBCbBE4CBIVBKXBKTBNMBCCBCBBN9CBDJBHJBHNBCKBH4CBIqBBGlCBLeBCLBFLBFEEBoBBDEBMrBBFZBHKBE9BBDgCBCcBDKBHJBHNBDeByBsCBClFBJ7BBEOBE9BBGqBBDKBJqBBG1QBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBSXBJuBBSBBDaBCMBEgBBQgBBQrEBF5UBXKBWz4BBDfBC8KBGsBBCGGD3BBIBBPXBKGBCGBCGBCGBCGBCGBCGBCGBC9DBjBZBC4CBN1GBbPBC+BBC1CBDmDBGqBBC9CBC1CBKvBBCszcBE2BBK7KBV3FBJtGBDBBCCCBGBW6BBEJBH3BBJlCBJLBHzDBMdBEtCBCKBFgBBC2BBKNBDJBDmDBZbBLFBDFBDFBKGBCGBC7BBF9DBDJBHj9KBNWBFwBBloItLBDpDBnBGBNEBGZBCEBCCCBCCBCCB7DBR8NBD1BBIhBhBBoBBHyBBCSBCDBFEBCmEBF9FBEFBDFBDFBDCBEGBCGBOBBDLBCZBCSBCBBCOBDNBjB6DBGCBFsBBE3CBCMBEwBwBBsBBjEcBEwBBQbBFjBBKdBGqBBGdBCkBBFNBrB9EBDJBHjBBFjBBFnBBJzBBMLBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBCnCBJIBxBSBCBBGgBBEaBGhChCB2BBFTBDxBBCBBGHBCCBCcBDCBFJBIIBI-BBhBmBBFLBK1BBEcBDaBGZBIDBNGBxCoCB4ByBBOyBBItBBJJBHlBBEcBJBBxGeBCpBBCCBDBBRCB4BrBBJpBBXZBnBbBVWBKtCBFjBBK9BBCEBOYBIJBH0BBCRBJmBBK-CBCTBMRBCuBB-BGBCCCBCBCOBCKBH6BBGJBHDBCHBDBBDVBCGBCBBCEBCJBDBBDCBDHHGGBDGBEEBMJBCDDClBBCJBCDDCDBCJBCBBJBBe7CBCEBfnCBJJBnF1BBDlBBjBkCBMJBHMBU5BBHJBHTBdaBDOBFWB6F7BBlDyCBNHBDDDBGBCBBCdBCBBDLBKJBnCHBDtBBDKBcnCBJyCBOoCBIJB3FhBBPJBHIBCsBBCNBLcBEfBDVBCNBqCGBCBBCrBBECCBCCBHBJJBHFBCBBCkBBCBBCFBIJB3JYBIQBCoBBEcB2CQQBwBBO6cBnDuDBCEBMjGBtyCiDBOvhBBRVBL68DBGmSB61G5BBn2B4RBIeBCJBFwCBCJBHdBDFBLlCBLJBCGBCUBGSBxN5BBnG6CBmDqCBF4BBIQBhCEBMBBP3-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBDDBh7D5HBHzNBtCtBBDWBKzDB9B1HBLmBBDpCBJvDBWlCB7DTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBD9VBQEBCOBxiBeBHFB2GGBCQBDGBCBBCEBG9BBiBxDxDBrBBENBDJBFBBhKeBS5BBGxOxOBoBB3GqBBFhPhPBFBCDBCBBCOBCkGBDPBqBrCBFJBFBByYjCBtC8BBjGDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBBvIrBBFjDBNOBDOBCOBCkBBLtFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBngB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEBxq3VvHB', false));
212
+ }
213
+ return this._Print;
214
+ }
215
+ static CATEGORIES = new LazyMap({
216
+ C: () => new UnicodeRangeTable(decodeRanges('AfBgDgBBOrWrWBHHBCBICCVuMuMnBBBzBBBE4B4BBGBcDBHQBXhGhGxBBB8BBBmDNB8BBByBBBQddBCCMEBgBHBsCiFiFJBBDBBXIICCBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBPMMBEB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKMMBDBbEByBPBDBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBjoIBvLBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCB-FCBHBBHBBHBBECBIIIBLBDBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIB-BGGBLBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMBxhBPBXJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBF-6DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBrCHBxDUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEvq3VBxHvw-FB', false)),
217
+ Cc: () => new UnicodeRangeTable(decodeRanges('AfgDgB', true)),
218
+ Cf: () => new UnicodeRangeTable(decodeRanges('tFzqBzqBBEBXhGhGyBhMhMBxCxCs5D9-B9-BBDBbEByBEBCJBw03B6H6HBBBimEQQj7IPBhjiBDBwmFHBn0rYffB+CB', false)),
219
+ Cn: () => new UnicodeRangeTable(decodeRanges('4bBBHDBICCVuMuMnBBBzBBBE4B4BBGBcDBHKBvI9B9BBmDmDBMB8BBByBBBQddBCCMEBgBDDBDBuHJJBDDBXXICCBBBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBbFB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKmDmDNBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBDBvzIBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCC-FCBHBBHBBHBBECBIIIBIBGBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIBlCJBCBBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMB3iBJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBJ76DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBjGUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEwi3VBCdBhD-DBxHvw-BB---BBB---BBB', false)),
220
+ Co: () => new UnicodeRangeTable(decodeRanges('gg4B-nGh4hc9--BD9--B', true)),
221
+ Cs: () => new UnicodeRangeTable(decodeRanges('gg2B--B', true)),
222
+ L: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBLLFGGBVBCeBCpOBFLBPEBICCiEEBCBBDDBCHHCCBCCCBSBCyCBCqEBJlFBClBBDHHBnBBoCaBFDBuBqBBkBBBCiDBCQQBIIBLLBBBDRRCdBe4CBMZZBfBKBBFGGBUBFKKEYYBXBIKBGXBCFBSpBB7B1BBETTIJBQPBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNGB7BBBCCCBDBCXBCCCBIBCBBKDDBDBCWWBCBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNSSBkBBCGGDqBBCsKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPBR1CBDFBErTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBkBFFkC4CBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBzC+C+CBtBBSHB3BdBOBBLrBBbjBBqBCBLjBBDKBGqBBDCBqBDBCFBCBBEGGB+FBhC1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGB1DOORMBmDFFDJBCEEBDBHGCBCBCKBDDBGEBF1B1BB8zC8zCBjHBHDBEBBNlBBCGGD3BBIRRBVBKGBCGBCGBCGBCGBCGBCGBCGBxC2O2OBrBrBBDBGBBF1CBHCBC5CBCDBGqBBC9CBSfBxBPBhQ-tGBhCs0VBkCtBBDsIBEPBLBBVuBBReBDlCByBIBDmDBDiCBDBBCCCBGBWPBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBdRRBDBCJBLEBCoBBYCBCHBVWBEEEBwBBCEEBDDBDBDCCZCBDKBICBNFBDFBDFBKGBCGBCqBBCNBHyDBej9KBNWBFwBBloItLBDpDBnBGBNEBGCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBlBZBHZBM4CBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBxB9EBTjBBFjBBFnBBJzBBNKBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4ByBBOyBBOjBBnBbBKWB7HpBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB1D-BBgBHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBBRDBgBUBGSBxNsBB0G-BBhEqCBGjCjCBLBhCBBCddB2-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBn7F0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BeBHFBmI9BBzEsBBLGBRiKiKBcBTrBBlPbBlHdBDwPwPBFBCDBCBBCOBCkGB8BjCBI1lB1lBBCBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
223
+ LC: () => new UnicodeRangeTable(decodeRanges('hCZBHZB7BLLBVBCeBCiGBCDBFvGBCaBhGDBDBBECBCHHCCBCCCBSBCyCBCqEBJlFBClBBKoBB44ClBBCGGDqBBDCBhV1CBDFBjkCKBGqBBDCBhCrBBgCMBChBBmD1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGBmIFFDJBCEEBDBHGCBCBCFBFDDBCBGEBF1B1BB8zC8zCB6DBDmDBHDBEBBNlBBCGGzoetBBTbBnEtCBCWBEDBC9BBDBBCCCBGBZBBE2Z2ZBpBBGIBIvCBh6TGBNEBqgBZBHZBmlBvCBhDjBBFjBB1DKBCOBCGBCBBCKBCOBCGBCBBk2ByBBOyBB+CVBLVB74C-BBhrV-BBhsZ0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BJBCTBHFB2uCjCB', false)),
224
+ Ll: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBC2BCBQCBuBCDECBBBDCCDEEBFFDEEBBBDDDCCCDCCBCCDEECDDBDDBBBHGDCOCBSCBDDCEEC4BCBFBDDDBCCFICBjCBCaBiGCCEEEBBBTccBhBBCBBECBCWCBDBCGDB0B0BBuBBCgBCK0BCDMCBgDCxBoBBo6CqBBDCB5XFBjkCIBC2D2DBqBBgCMBChBBnD0ECBHBCgDCBHBJFBLHBJHBJFBLHBJHBJNBDHBJHBJHBJEBCBBHEEBBBCBBJDBDBBJHBLCBCBBzIEEBEEcKFDBBJDBF2B2Bs1CvBBCEEBGCFCCBCCBEBGiDCBIICFFNlBBCGG0oesBCUaCoEMCBBBC+BCBGBCCCDICFCCDCCBBBCSCGGGCMCFCCDEECICbEE2ZqBBGIBIvCBh6TGBNEBqhBZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfB7sZZBbGBCRBbZBbDBCCCBFBCKBbZBbZBbZBbZBbZBbZBbZBbZBbbBdYBCFBbYBCFBbYBCFBbYBCFBbYBCFBC15B15BBIBCTBHFB4vChBB', false)),
225
+ Lm: () => new UnicodeRangeTable(decodeRanges('wVRBFLBPEBICCmEGG-OnHnHlFBBuIBBFgBgBKEEhFoFoF1mBgEgE2R72B72BsDkTkTxOFBvF+BBOjBjBBjBByVOORMBg-CBByHgGgG2OsBsBBDBGiDiDB+C+CBBB34bjnBjnBBEBvIzDzDdBB6DIBxCYYqDCBEBB2OXXqEtDtDWBBoDDBKngVngVuBBBh-BFBCpBBCIB0sBhBhBxuXDB9PCBpBBBnRMBhCBBCtgQtgQBCBCGBCBByhM9BBqGGBudgjBgjB', false)),
226
+ Lo: () => new UnicodeRangeTable(decodeRanges('qFQQhIFFBCBxG8Z8ZBZBFDBuBfBCJBkBBBCiDBCZZBLLBBBDRRCdBe4CBMZZBfBWVBrBYBIKBGXBCFBSoBB8B1BBETTIJBROBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNFB8BBBCCCBDBCXBCCCBIBCBBKDDBDBYDBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNyDyDBnKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPByDrTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBpBkCkCBhBBC0BBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBxFuBBSHB3BdBOBBLrBBbjBBqBCBLdByDDBCFBCBBE7hB7hBBCB4-C3BBZWBKGBCGBCGBCGBCGBCGBCGBCGBoR2B2BF1CBJCCB4CBFGGBpBBC9CBSfBxBPBhQ-tGBhC0wUBC2jBBkCnBBJrIBFPBLBBjCyByBBkCBqFoDoDEGBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBuBEBDIBLEBCoBBYCBCHBVPBCFBEEEBwBBCEEBDDBDBDCCZBBEKBIPPBEBDFBDFBKGBCGByEiBBej9KBNWBFwBBloItLBDpDBkCCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBqDJBCsBBDeBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBhEtCBjDnBBJzBB9CzBBN2JBKVBLHB5EFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4FjBBnBDBCxJxJBoBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB0GHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBB0BUBGSB0NnBB2MqCBGwFwFB2-FBJ1mBBqBJB43IiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBxzI2P2PBrBBiBiKiKBcBTrBBlPaBmHdBDwPwPBFBCDBCBBCOBCkGB8pBDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
227
+ Lt: () => new UnicodeRangeTable(decodeRanges('lOGDnB2sH2sHBGBJHBJHBNQQwBAB', false)),
228
+ Lu: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiB2BCDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIJDCMCDQCDDDCCBC4BCIBBCBBDCCBCBCGCiJCCEJJHCCBBBCCCBCCBPBCIBkBDDBBBEWCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBpCDBNDBNDBNEBMDBnIFFECBDCBDEEBDBHGCBCBDDBLBBG+B+B9zCvBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEEGGCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBhtZZBbZBbZBbCCBGDBDDBCBCHBbZBbBBCDBDHBCGBcBBCDBCEBCEEBFBcZBbZBbZBbZBbZBbZBfYBiBYBiBYBiBYBiBYBiB2pE2pEBgBB', false)),
229
+ M: () => new UnicodeRangeTable(decodeRanges('gYvDB0IGBoIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCgBB3BCBCRBCGBLBBeCB5BCCBFBDBBDCBKLLBbbDCB5BCCBDBFBBDCBEffBEEMCB5BCCBGBCCBCCBVBBXFBCCB5BCCBFBDBBDCBICBLBBf8B8BBDBECBCDBKpBpBBDB4BCCBFBCCBCDBIBBMBBeCB5BCCBFBCCBCDBIBBMBBQNNBCB4BBBCGBCCBCDBKLLBeeBBBnCFFBEBCCCBGBTBB+BDDBFBNHBjDDDBHBMGBqCBBcECFBByBTBCBBGKBCjBBKlDlDBSBYDBFCBCCBDGBEDBOLBCLLBCBgWCBzdDBdCBeBBfBBhCfBKuBuBBBBC2D2DBjBjB3DLBFLB8GEB6BJBCcBDxBxBBdByBEBwBQBnBIBNCBfMB5BNBxBTB5ECBCUBFHHDCBnG-BBxWgBB--CCBuEhDhDBeBrRFBqDBB1udDBCJBhBBBxCBBxIEEFYYBDBF0C0CBzBzBBQBbRBOnBnBBGBaMBtBDBwBNBlBkCkCBMBNJJBuBuBBBBzBCCBBBDBBGBBCqBqBBDBGBBtHHBCBBx5TiXiXBOBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB7DCB2BOBqBDDBLLBCBuBKBI+B+BBBBlBNBRBBtBNNBBBxBNBJDBCBB9CLBHDD+ELBWDB4BBBCGBDBBDCBKLLBDDBFBEEBkCIBCDDCDBCEBCPPBzCzCBQBYyCyCBSBsHGBDIBcBBzCQBrDMBmDOBhIOB2HFBCBBDDBCCCBuEuEBFBDGBEddBIBpBGBCDBJKKBJBvBPB2MHBCHBzCVBCNB7DFBECCBCCBFBCjCjCBDBCBBCEB8KDBKBBCxBxBBFBEEBYmnFmnFHOBpmLRBhuCEB8BGB5gBCCB1BBIDByCMMBslTslTBizEizEBsBBDWB-QEBEFBJHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
230
+ Mc: () => new UnicodeRangeTable(decodeRanges('joC4B4BDCBJDBCBBzBBB7BCBHBBDBBLsBsB7BCBjC7B7BBBBJCCB2B2BB7B7BCHHBDDBLLnDBBCBBECBCCBLqBqBBBB+BDB+BBB7BCCBDBDBBCBBKBBdPPB7B7BBBBGCBCCBLrBrBBsCsCBBBHHBTBBrKBBgCsFsFBFFHDDBaaBLLBBBDGBWBBDFBDLLBBB5zBffiEIIBGBCBB7KDBDCBFBBCFBhHBB7BCCKCCBJJBEByExBxBGCCBDBCBB+BffFBBD9B9BDCBCEEBxBxBBGBJBBsFWW35EBB0-dBBD5C5CBzBzBBOBvEBBwBxBxBBFFBDDBBBvDBBDBBZuBuBCuDuDDBBGuHuHBCCBCCBCC0gZCCgEuBuBBBBFBB0DZZB8B8BxBCBKBBO+C+CBBBEBBCrFrFBBBgBBB7BBBCDBDBBDCBKLLB1C1CBBBIDDCDBCBBCmDmDBBBJBBErDrDBBBHCCBCBDuHuHBBBHDBDyDyDBBBJBBCuDuDCBBHoDoDCBBFmImIBBBK4H4HBEBCBBFDDCvEvEBBBJDBF1C1CeBB-B4M4MPrDrDIDD2GEBFBBC-K-KBNNxBBBJBBCpvQpvQBBBlxD2BBpDBB0rYBBHFB', false)),
231
+ Me: () => new UnicodeRangeTable(decodeRanges('okBBB1xF-wB-wBBCBCCBsshBCB', false)),
232
+ Mn: () => new UnicodeRangeTable(decodeRanges('gYvDB0IEBqIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCfB4BCCFHBFEEBFBLBBe7B7BFDBJVVBbbDBB6BFFBFFBDDBBBEffBEEMBB6BFFBDBCBBFVVBXXBEBC7B7BDCCBCBJIIBMMBff+BNNzBEE4BCCBBBGCBCDBIBBMBBe7B7BDHHGBBVBBdBB6BBBFDBJVVBeepCIIBBBC7C7CDGBNHBjDDDBHBMGBqCBBcEC4BNBCEBCBBGKBCjBBKnDnDBCBCFBCBBDBBaBBFCBRDBODDBHHQgWgWBBBzdCBeBBfBBfBBhCBBCGBJDDBJBKuBuBBBBC2D2DBjBjB3DCBFBBKHHBBB8GBBD7B7BCGBCCCDHBHJBDxBxBBMBCPByBDBxBCCBDBCGGpBIBNBBhBDBDBBCCB5BCCBEECCB7BHBDBB5ECBCMBCGBFHHEBBnG-BBxWMBFEEBKB--CCBuEhDhDBeBrRDBsDBB1udFFBIBhBBBxCBBxIEEFaaBGG4EBBbRBOnBnBBGBaKBvBCBxBDDBCBDBBoBkCkCBEBDBBDBBNJJwB0B0BCCBDBBGBBCrBrBBJJvHDDFx5Tx5TiXPBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB8D3B3BBNBqBDDBLLBBByBDBDBBI+B+BBBBlBEBCHB-BNNB1B1BBHBLDBDgDgDBBBDCCBHHD+E+EEHBWBB6BBBEmBmBBFBEEBnCFBOECPBB2CHBDCBCYY1CFBCFFBCCBvHvHBCBHBBCBBcBB2CHBDCCBrDrDCDDBEBCmDmDCDDBCBCEBkIIBCBBhIBBCFFxEDBDBBFhBhBBIBpBFBDDBJKKBEBDCBvBMBCBB3MGBCFBCzCzCBUBDGBCBBCBB7DFBECCBCCBFBCpCpCBEEC8K8KBMMB1B1BBDBGCCYmnFmnFHOBpmLLBECBhuCEB8BGB5gBgCgCBCByC5lT5lTBizEizEBsBBDWBhRCBSHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
233
+ N: () => new UnicodeRangeTable(decodeRanges('wBJB5DBBGDDBBBitBJBnEJBnGJB9MJB3DJBFFBtDJB3DJB3DJBDFBvDMB0DJBJGBoDJBpDGBISBuDJBhDJB3DJBnCTBtIJBnCJBwWTBybCBwHJBHJBXJBtJJBhEKBmFJBHJB3FJB3CJBnEJBHJB3gBEEBEBHJBnGyBBDEB3W7BBvCVB3TdBqrBqYqYaIBPCB4KDBrEJBfHBCOBhBJBoBOBh7cJB9FJBhKFB7EJBnBJBnGJBXJB3CJB3MJB34UJBuPsBBN4BBSBB2KaBlBDBeJJnEEBrGJBvdHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBxBJBHJB3IeB-EJBrBDBxDGBnEdBhEJB9BJBxEJBITB8HJB3KJB3DJB3LJBnDJBHTBtCLBlNSB+CJB3UJB3CcBkHJBnCJBnNJBnDUBshBuDBimPJBnpCJB3CJBnEJBCGBvQJBnIWB6yXJBnuBTBNTBtDYB2iBxBBhqCJBnNJB3PJB4HJBtWIBhEJB4Y6BBCCBCDBtCsBBCOBjeMBk3CJB', false)),
234
+ Nd: () => new UnicodeRangeTable(decodeRanges('wBJnxBJnEJnGJ9MJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJhDJ3DJnCJ3IJnCJn6BJnBJtJJhEJnFJHJ3FJ3CJnEJHJnuiBJnVJnBJnGJXJ3CJ3MJ34UJnsBJnkCJHJ9YJhEJ9BJxEJ3IJ3KJ3DJ3LJnDJHTtCJnNJnDJ3UJ3CJ3HJnCJnNJ3uQJnpCJ3CJnEJ3QJ37XJ12CxBhqCJnNJ3PJ4HJ2aJ30EJ', true)),
235
+ Nl: () => new UnicodeRangeTable(decodeRanges('u3FCBwzCiBBDDB-zDaaBHBPCBs1dJBxyW0BBtOJJnEEBrhIuDB', false)),
236
+ No: () => new UnicodeRangeTable(decodeRanges('yFBBGDDBBB2pCFB5LFB5DCBmEGB6GGBSIByNJB2hBTB0jBJBhP20B20BEFBHJBnGPBqB3W3WB6BBvCVB3TdBqrB1kB1kBBCBrEJBfHBCOBhBJBoBOBxrdFBymWsBBiCDBSBB2KaBlBDB1pBHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBhLeB-EJBrBDBxDGBnETB8LTBmqBBBvNIBobSB0aUBn8SGB-YWBqhZTBNTBtDYBvqFIBid6BBCCBCDBtCsBBCOBjeMB', false)),
237
+ P: () => new UnicodeRangeTable(decodeRanges('hBCBCFBCDBLBBEBBbCBCccCkBkBGEELBBEEE-VJJzOFBqBBB0BCCDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCmBmBBCBoCrCrCBDBFBBwDFBsFlTlTBHB4EuTuTtBBBvCCBoCBB+ECBCCBmBKB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBM9Z9ZBWBJTBCMBCLBfBBPBB6TDBeBB+hBNBwCBBgBJB0MVBgCDBhBBB8XDBCBBxDwEwEBtBBCfBDLBkNCBFJBDLBRNNjD7C7CjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HzqUzqUBxGxGBIBXiBBCNBCFFCBB2ECBCFBCDBLBBEBBbCBCccCCCBFB7MCB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDByO-J-JoFEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
238
+ Pc: () => new UnicodeRangeTable(decodeRanges('-Cg-Hg-HBUU-u3BBBZCBwHAB', false)),
239
+ Pd: () => new UnicodeRangeTable(decodeRanges('tB9qB9qB0BiyDiyDmgBqgCqgCBEBiwDDDgBBBFdd-NUUwDxszBxszBBmBmBLqFqFhzD-J-J', false)),
240
+ Pe: () => new UnicodeRangeTable(decodeRanges('pB0B0BgB+1D+1DC-6B-6BqtC4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECtBGCtNICEGCDBB-ozB6G6GeOCESSCCCrF0B0BgBGD', false)),
241
+ Pf: () => new UnicodeRangeTable(decodeRanges('7F+6H+6HEddpuDCCFDDQEE', false)),
242
+ Pi: () => new UnicodeRangeTable(decodeRanges('rFt7Ht7HDBBDaapuDCCFDDQEE', false)),
243
+ Po: () => new UnicodeRangeTable(decodeRanges('hBCBCCBDECBLLBEEBcclCGGPBBI-V-VJzOzOBEBqB3B3BDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCxDxDrCEBFBBwDFBsFlTlTBHBmY9D9DBBBoCBB+ECBCCBmBFBCDB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBMjajaBJJBGBJIBDDBDCBEKBCCCBIB7kDDBCBBxDwEwEBFFBBBDDDBHBCBBCDDBLLBDBCJBDDBCCCBLBDCBtNCB6B+F+FjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HlxUlxUBFBDXXVBBDDBECBCDBICBHCCB2E2EBBBCCBDECBLLBEEBcclBDDB7M7MBBB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDB5dEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
244
+ Ps: () => new UnicodeRangeTable(decodeRanges('oBzBzBgB-1D-1DC-6B-6B-rCEEnB4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECaTTCECtNICEGCDipzBipzB4GeeCMCESSCCCrFzBzBgBEEDAB', false)),
245
+ S: () => new UnicodeRangeTable(decodeRanges('kBHHRCBgBCCcCCkBEBCBBDCCBCBDEEfgBgBrODBNNBGGBCCCBPB2DPPBxDxDsErIrIBBB3DCBDDDBvGvGLUUB4H4HIBBpEqLqLBHHB2H2H-DjEjEBGBlEwGwGqBmGmGiGCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WuLuLlL+E+EBgBBiLJBKIBhiBCCBBBMCBOCBOCBOBBmCOOoBCBOCBUgBBgCBBCDBCBBLCCBBBGFBCECFMMBFFBDBGDBC7B7BBFFB2LBFcBD+HBXKByCtCBXnTBtBwBBDeBLyMBX+BBFfBD1LBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBB8CBB0HBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BB6RWBKBBoDBB+EDBLDB+RCBiHPPB+9T+9TpEQB+LPBgEtBtBBCBjDCCBBBD7E7EHRRBBBgBCCcCCiEGBCGBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwSmWmWBwtCwtC2kCcBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBrbaagBaagBaagBaagBaa9B-PB4BDBzBHBCNBCBBp2BwNwNttCEE+DiOiOBvIvIBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
246
+ Sc: () => new UnicodeRangeTable(decodeRanges('kB+D+DBCBqnB8D8DzPBBzPBBI2H2HoImSmS8sClmClmCBfB47hBkuVkuVtD7E7E8GBBEBB3-HDB-4wBxtCxtC', false)),
247
+ Sk: () => new UnicodeRangeTable(decodeRanges('+CCCoCHHFEEqQDBNNBGGBCCCBPB2DPPBjoBjoB15FCCBBBMCBOCBOCBOBB9kEBBkzdWBKBBoDBBxePPBniUniUBPB8bCCjF4g9B4g9BBDB', false)),
248
+ Sm: () => new UnicodeRangeTable(decodeRanges('rBRRBBB+BCCuBFFmBgBgB-XwQwQBBB8xGOOoBCBOCBsEoBoBBDBHlClCBDBGBBFGDIgBgBBDDCgBgBBqIBhBBB7CffBXBpBFB2OKK3BHBwDxKxKBDBDeBLPBhIiEBX+BBFfBDhIBxBUBDFB9+zB5Z5ZCCBlFRRBBB+BCCkEHHBCBitDBBypyBaagBaagBaagBaagBaat5FBB', false)),
249
+ So: () => new UnicodeRangeTable(decodeRanges('mFDDFCCyerIrIBgEgEBvGvGLUUB4H4HkQ2L2LjEFBClElEwGqBqBoMCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WzWzW+EhBBiLJBKIBksBBBCDBCBBLCCBHHBEBCECFMMBPPCBBC7B7BBKKBDBDDBCBBCBBCGBCeBDBBCCCBdBtIHBFTBDGBDwCBCdBanBBHnCBXKByCtCBX2FBCIBC1BBJuDBC3HBtBrBBhC-HBhQvBBWBBHmBBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBBxKBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BBibDBLBBC+R+RBBBn2UPBgEuBuBBBBlPEEFBBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwS3jD3jD2kCHBFQBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBqlB-PB4BDBzBHBCNBCBBp2B96C96CiEyWyWBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E6HBG3WBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
250
+ Z: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBeBBGwBwBh9DAB', false)),
251
+ Zl: () => new UnicodeRangeTable(decodeRanges('ohIA', true)),
252
+ Zp: () => new UnicodeRangeTable(decodeRanges('phIA', true)),
253
+ Zs: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBlBwBwBh9DAB', false))
254
+ });
255
+ static get Upper() {
256
+ return this.CATEGORIES.get('Lu');
257
+ }
258
+ static SCRIPTS = new LazyMap({
259
+ Adlam: () => new UnicodeRangeTable(decodeRanges('go6DrCFJFB', true)),
260
+ Ahom: () => new UnicodeRangeTable(decodeRanges('g4lCaDOFW', true)),
261
+ Anatolian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggxCmS', true)),
262
+ Arabic: () => new UnicodeRangeTable(decodeRanges('gwBEBCFBCNBCCBCfBCJBMZBCrDBChBBxCvBBxHeBCBBGqCBCcBxy8ByDBRqLBDvCBD1BBIhBhBBOBxDEBCmEBk7DeBkCCB4BDBh43BDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBB', false)),
263
+ Armenian: () => new UnicodeRangeTable(decodeRanges('xpBlBDxBDCks9BE', true)),
264
+ Avestan: () => new UnicodeRangeTable(decodeRanges('g4iC1BEG', true)),
265
+ Balinese: () => new UnicodeRangeTable(decodeRanges('g4GsCCxB', true)),
266
+ Bamum: () => new UnicodeRangeTable(decodeRanges('g1pB3CpowB4R', true)),
267
+ Bassa_Vah: () => new UnicodeRangeTable(decodeRanges('w26CdDF', true)),
268
+ Batak: () => new UnicodeRangeTable(decodeRanges('g+GzBJD', true)),
269
+ Bengali: () => new UnicodeRangeTable(decodeRanges('gsCDBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYB', false)),
270
+ Bhaiksuki: () => new UnicodeRangeTable(decodeRanges('ggnCICsBCNLc', true)),
271
+ Bopomofo: () => new UnicodeRangeTable(decodeRanges('qXB6wLqBxDf', true)),
272
+ Brahmi: () => new UnicodeRangeTable(decodeRanges('ggkCtCFjBKA', true)),
273
+ Braille: () => new UnicodeRangeTable(decodeRanges('ggK-H', true)),
274
+ Buginese: () => new UnicodeRangeTable(decodeRanges('gwGbDB', true)),
275
+ Buhid: () => new UnicodeRangeTable(decodeRanges('g6FT', true)),
276
+ Canadian_Aboriginal: () => new UnicodeRangeTable(decodeRanges('ggF-TxRlC7tgCP', true)),
277
+ Carian: () => new UnicodeRangeTable(decodeRanges('g1gCwB', true)),
278
+ Caucasian_Albanian: () => new UnicodeRangeTable(decodeRanges('wphCzBMA', true)),
279
+ Chakma: () => new UnicodeRangeTable(decodeRanges('gokC0BCR', true)),
280
+ Cham: () => new UnicodeRangeTable(decodeRanges('gwqB2BKNDJDD', true)),
281
+ Cherokee: () => new UnicodeRangeTable(decodeRanges('g9E1CDFz7lBvC', true)),
282
+ Chorasmian: () => new UnicodeRangeTable(decodeRanges('w9jCb', true)),
283
+ Common: () => new UnicodeRangeTable(decodeRanges('AgCBbFBbuBBCOBCEBYgBgBiOmBBGEBDTB1DKKHCC+THHPEEhB9E9ElQiEiEB6mB6mB2MDBjJwvBwvBBBBoCBBsGBBCumBumBOIIBCBCFBCCBDmYmYBKBD2CBCKBEKBCOBSgBBgClBBCCBDFBCaBCQBqBCBF5UBXKBW-cBhIzTBDfBCoDBhQ9CBzMUBCCCBXBQHBFDB8CBBE7C7CB0E0EBOBhBlBBKxBxBB+BBgBwCBwB5C5CBmFBhuG-BBhoWhBBnDCBmFJB1HhFhFsMPPBzuUzuUBxGxGBIBXiBBCSBCDB0ECCBeBbFBbKBLuBuBBhChCBFBCGBLEBjICBFsBBEIBxCMB0BsBBlHaBltuBDB96D5HBHzNB9EzDB9B1HBLmBBD9BBEQBJBBIdBF8BB2GTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBDxBByjFjCBtC8BBjWrBBFjDBNOBDOBCOBCkBBLtFB5BZBCBBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBoghYffB+CB', false)),
284
+ Coptic: () => new UnicodeRangeTable(decodeRanges('ifNxkKzDGG', true)),
285
+ Cuneiform: () => new UnicodeRangeTable(decodeRanges('ggoC5cnDuDCEMjG', true)),
286
+ Cypriot: () => new UnicodeRangeTable(decodeRanges('ggiCFBDCCBqBBCBBEDD', false)),
287
+ Cypro_Minoan: () => new UnicodeRangeTable(decodeRanges('w8rCiD', true)),
288
+ Cyrillic: () => new UnicodeRangeTable(decodeRanges('ggBkEBDoFBx6FKBhFtCtCojEfBhie-CBv8VBBhw4B9BBiBAB', false)),
289
+ Deseret: () => new UnicodeRangeTable(decodeRanges('gghCvC', true)),
290
+ Devanagari: () => new UnicodeRangeTable(decodeRanges('goCwCFODZh7nBfhwcJ', true)),
291
+ Dives_Akuru: () => new UnicodeRangeTable(decodeRanges('gomCGBDDDBGBCBBCdBCBBDLBKJB', false)),
292
+ Dogra: () => new UnicodeRangeTable(decodeRanges('ggmC7B', true)),
293
+ Duployan: () => new UnicodeRangeTable(decodeRanges('ggvDqDGMEIIJDD', true)),
294
+ Egyptian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggsC1iBL68D', true)),
295
+ Elbasan: () => new UnicodeRangeTable(decodeRanges('gohCnB', true)),
296
+ Elymaic: () => new UnicodeRangeTable(decodeRanges('g-jCW', true)),
297
+ Ethiopic: () => new UnicodeRangeTable(decodeRanges('gwEoCBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBnvGWBKGBCGBCGBCGBCGBCGBCGBCGBjpfFBDFBDFBKGBCGBylvCGBCDBCBBCOB', false)),
298
+ Garay: () => new UnicodeRangeTable(decodeRanges('gqjClBEcJB', true)),
299
+ Georgian: () => new UnicodeRangeTable(decodeRanges('glElBBCGGDqBBCDBx8CqBBDCBhiElBBCGG', false)),
300
+ Glagolitic: () => new UnicodeRangeTable(decodeRanges('ggL-Ch9sDGCQDGCBCE', true)),
301
+ Gothic: () => new UnicodeRangeTable(decodeRanges('w5gCa', true)),
302
+ Grantha: () => new UnicodeRangeTable(decodeRanges('g4kCDBCHBDBBDVBCGBCBBCEBDIBDBBDCBDHHGGBDGBEEB', false)),
303
+ Greek: () => new UnicodeRangeTable(decodeRanges('wbDBCCBDDBCFFCCCBBBCCCBSBC+BBPPBnpGEBzBEBFEB1ChKhKBUBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBoJ-xiB-xiB7uVuCBSgj0Bgj0BBkCB', false)),
304
+ Gujarati: () => new UnicodeRangeTable(decodeRanges('h0CCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGB', false)),
305
+ Gunjala_Gondi: () => new UnicodeRangeTable(decodeRanges('grnCFCBCkBCBCFIJ', true)),
306
+ Gurmukhi: () => new UnicodeRangeTable(decodeRanges('hwCCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPB', false)),
307
+ Gurung_Khema: () => new UnicodeRangeTable(decodeRanges('go4C5B', true)),
308
+ Han: () => new UnicodeRangeTable(decodeRanges('g0LZBC4CBN1GBwBCCaIBPDBle-tGBhC-vUBhoWtLBDpDBpodBBNBBvgkB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
309
+ Hangul: () => new UnicodeRangeTable(decodeRanges('goE-HvxHBiI9CyDeiCei3dckUj9KNWFwBl9JeEFDFDFDC', true)),
310
+ Hanifi_Rohingya: () => new UnicodeRangeTable(decodeRanges('gojCnBJJ', true)),
311
+ Hanunoo: () => new UnicodeRangeTable(decodeRanges('g5FU', true)),
312
+ Hatran: () => new UnicodeRangeTable(decodeRanges('gniCSCBGE', true)),
313
+ Hebrew: () => new UnicodeRangeTable(decodeRanges('xsB2BBJaBFFBpp9BZBCEBCCCBCCBCCBIB', false)),
314
+ Hiragana: () => new UnicodeRangeTable(decodeRanges('hiM1CBHCBi7-C+IBTeeBBBulQAB', false)),
315
+ Imperial_Aramaic: () => new UnicodeRangeTable(decodeRanges('giiCVCI', true)),
316
+ Inherited: () => new UnicodeRangeTable(decodeRanges('gYvDB2IBBlOKBbhXhXBCB8qEeBiQCBCMBCGBFHHEBBnG-BBtQBBjGgBB65DDBsDBBmrzBPBRNBwejHjH7iEl+uBl+uBBsBBDWBhRCBSHBDGBfDBz6rYvHB', false)),
317
+ Inscriptional_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g7iCSGH', true)),
318
+ Inscriptional_Parthian: () => new UnicodeRangeTable(decodeRanges('g6iCVDH', true)),
319
+ Javanese: () => new UnicodeRangeTable(decodeRanges('gsqBtCDJFB', true)),
320
+ Kaithi: () => new UnicodeRangeTable(decodeRanges('gkkCiCLA', true)),
321
+ Kannada: () => new UnicodeRangeTable(decodeRanges('gkDMCCCWCJCEDICCCDIBHBCDDJCC', true)),
322
+ Katakana: () => new UnicodeRangeTable(decodeRanges('hlM5CBDCBxHPBxGuBBC3CBvgzBJBCsBBzisBDBCGBCBBCgJgJBBBzBPPBCB', false)),
323
+ Kawi: () => new UnicodeRangeTable(decodeRanges('g4nCQCoBEc', true)),
324
+ Kayah_Li: () => new UnicodeRangeTable(decodeRanges('goqBtBCA', true)),
325
+ Kharoshthi: () => new UnicodeRangeTable(decodeRanges('gwiCDCBGHCCCcDCFJII', true)),
326
+ Khitan_Small_Script: () => new UnicodeRangeTable(decodeRanges('k-7C84G84GB0OBqBAB', false)),
327
+ Khmer: () => new UnicodeRangeTable(decodeRanges('g8F9CDJHJnPf', true)),
328
+ Khojki: () => new UnicodeRangeTable(decodeRanges('gwkCRCuB', true)),
329
+ Khudawadi: () => new UnicodeRangeTable(decodeRanges('w1kC6BGJ', true)),
330
+ Kirat_Rai: () => new UnicodeRangeTable(decodeRanges('gq7C5B', true)),
331
+ Lao: () => new UnicodeRangeTable(decodeRanges('h0DBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDB', false)),
332
+ Latin: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBQQGWBCeBCgOBoBEB8wGlBBHwBBGDBGMBClCBiC-HByLOORMBuEBBHccSoBB42CfBj1elDBEiCBDBBCCCBGBWNBxZqBBCIBCDB38TGB7gBZBHZBmhCFBCpBBCIBm61BeBHFB', false)),
333
+ Lepcha: () => new UnicodeRangeTable(decodeRanges('ggH3BEOEC', true)),
334
+ Limbu: () => new UnicodeRangeTable(decodeRanges('goGeBCLBFLBFEEBKB', false)),
335
+ Linear_A: () => new UnicodeRangeTable(decodeRanges('gwhC2JKVLH', true)),
336
+ Linear_B: () => new UnicodeRangeTable(decodeRanges('gggCLCZCSCBCODNjB6D', true)),
337
+ Lisu: () => new UnicodeRangeTable(decodeRanges('wmpBvBx1eA', true)),
338
+ Lycian: () => new UnicodeRangeTable(decodeRanges('g0gCc', true)),
339
+ Lydian: () => new UnicodeRangeTable(decodeRanges('gpiCZGA', true)),
340
+ Mahajani: () => new UnicodeRangeTable(decodeRanges('wqkCmB', true)),
341
+ Makasar: () => new UnicodeRangeTable(decodeRanges('g3nCY', true)),
342
+ Malayalam: () => new UnicodeRangeTable(decodeRanges('goDMCCCyBCCCFFPDZ', true)),
343
+ Mandaic: () => new UnicodeRangeTable(decodeRanges('giCbDA', true)),
344
+ Manichaean: () => new UnicodeRangeTable(decodeRanges('g2iCmBFL', true)),
345
+ Marchen: () => new UnicodeRangeTable(decodeRanges('wjnCfDVCN', true)),
346
+ Masaram_Gondi: () => new UnicodeRangeTable(decodeRanges('gonCGBCBBCrBBECCBCCBHBJJB', false)),
347
+ Medefaidrin: () => new UnicodeRangeTable(decodeRanges('gy7C6C', true)),
348
+ Meetei_Mayek: () => new UnicodeRangeTable(decodeRanges('g3qBWqGtBDJ', true)),
349
+ Mende_Kikakui: () => new UnicodeRangeTable(decodeRanges('gg6DkGDP', true)),
350
+ Meroitic_Cursive: () => new UnicodeRangeTable(decodeRanges('gtiCXFTDtB', true)),
351
+ Meroitic_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('gsiCf', true)),
352
+ Miao: () => new UnicodeRangeTable(decodeRanges('g47CqCF4BIQ', true)),
353
+ Modi: () => new UnicodeRangeTable(decodeRanges('gwlCkCMJ', true)),
354
+ Mongolian: () => new UnicodeRangeTable(decodeRanges('ggGBBDCCBSBH4CBIqBB2t-BMB', false)),
355
+ Mro: () => new UnicodeRangeTable(decodeRanges('gy6CeCJFB', true)),
356
+ Multani: () => new UnicodeRangeTable(decodeRanges('g0kCGBCCCBCBCOBCKB', false)),
357
+ Myanmar: () => new UnicodeRangeTable(decodeRanges('ggE-EhqmBeiDfxibT', true)),
358
+ Nabataean: () => new UnicodeRangeTable(decodeRanges('gkiCeJI', true)),
359
+ Nag_Mundari: () => new UnicodeRangeTable(decodeRanges('wm5DpB', true)),
360
+ Nandinagari: () => new UnicodeRangeTable(decodeRanges('gtmCHDtBDK', true)),
361
+ New_Tai_Lue: () => new UnicodeRangeTable(decodeRanges('gsGrBFZHKEB', true)),
362
+ Newa: () => new UnicodeRangeTable(decodeRanges('gglC7CCE', true)),
363
+ Nko: () => new UnicodeRangeTable(decodeRanges('g+B6BDC', true)),
364
+ Nushu: () => new UnicodeRangeTable(decodeRanges('h-7CvsQvsQBqMB', false)),
365
+ Nyiakeng_Puachue_Hmong: () => new UnicodeRangeTable(decodeRanges('go4DsBENDJFB', true)),
366
+ Ogham: () => new UnicodeRangeTable(decodeRanges('g0Fc', true)),
367
+ Ol_Chiki: () => new UnicodeRangeTable(decodeRanges('wiHvB', true)),
368
+ Ol_Onal: () => new UnicodeRangeTable(decodeRanges('wu5DqBFA', true)),
369
+ Old_Hungarian: () => new UnicodeRangeTable(decodeRanges('gkjCyBOyBIF', true)),
370
+ Old_Italic: () => new UnicodeRangeTable(decodeRanges('g4gCjBKC', true)),
371
+ Old_North_Arabian: () => new UnicodeRangeTable(decodeRanges('g0iCf', true)),
372
+ Old_Permic: () => new UnicodeRangeTable(decodeRanges('w6gCqB', true)),
373
+ Old_Persian: () => new UnicodeRangeTable(decodeRanges('g9gCjBFN', true)),
374
+ Old_Sogdian: () => new UnicodeRangeTable(decodeRanges('g4jCnB', true)),
375
+ Old_South_Arabian: () => new UnicodeRangeTable(decodeRanges('gziCf', true)),
376
+ Old_Turkic: () => new UnicodeRangeTable(decodeRanges('ggjCoC', true)),
377
+ Old_Uyghur: () => new UnicodeRangeTable(decodeRanges('w7jCZ', true)),
378
+ Oriya: () => new UnicodeRangeTable(decodeRanges('h4CCCHDBDVCGCBCEDIDBDCICFBCEDR', true)),
379
+ Osage: () => new UnicodeRangeTable(decodeRanges('wlhCjBFjB', true)),
380
+ Osmanya: () => new UnicodeRangeTable(decodeRanges('gkhCdDJ', true)),
381
+ Pahawh_Hmong: () => new UnicodeRangeTable(decodeRanges('g46ClCLJCGCUGS', true)),
382
+ Palmyrene: () => new UnicodeRangeTable(decodeRanges('gjiCf', true)),
383
+ Pau_Cin_Hau: () => new UnicodeRangeTable(decodeRanges('g2mC4B', true)),
384
+ Phags_Pa: () => new UnicodeRangeTable(decodeRanges('giqB3B', true)),
385
+ Phoenician: () => new UnicodeRangeTable(decodeRanges('goiCbEA', true)),
386
+ Psalter_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g8iCRIDNG', true)),
387
+ Rejang: () => new UnicodeRangeTable(decodeRanges('wpqBjBMA', true)),
388
+ Runic: () => new UnicodeRangeTable(decodeRanges('g1FqCEK', true)),
389
+ Samaritan: () => new UnicodeRangeTable(decodeRanges('ggCtBDO', true)),
390
+ Saurashtra: () => new UnicodeRangeTable(decodeRanges('gkqBlCJL', true)),
391
+ Sharada: () => new UnicodeRangeTable(decodeRanges('gskC-C', true)),
392
+ Shavian: () => new UnicodeRangeTable(decodeRanges('wihCvB', true)),
393
+ Siddham: () => new UnicodeRangeTable(decodeRanges('gslC1BDlB', true)),
394
+ SignWriting: () => new UnicodeRangeTable(decodeRanges('gg2DrUQECO', true)),
395
+ Sinhala: () => new UnicodeRangeTable(decodeRanges('hsDCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBt-gCTB', false)),
396
+ Sogdian: () => new UnicodeRangeTable(decodeRanges('w5jCpB', true)),
397
+ Sora_Sompeng: () => new UnicodeRangeTable(decodeRanges('wmkCYIJ', true)),
398
+ Soyombo: () => new UnicodeRangeTable(decodeRanges('wymCyC', true)),
399
+ Sundanese: () => new UnicodeRangeTable(decodeRanges('g8G-BhIH', true)),
400
+ Sunuwar: () => new UnicodeRangeTable(decodeRanges('g+mChBPJ', true)),
401
+ Syloti_Nagri: () => new UnicodeRangeTable(decodeRanges('ggqBsB', true)),
402
+ Syriac: () => new UnicodeRangeTable(decodeRanges('g4BNC7BDCxIK', true)),
403
+ Tagalog: () => new UnicodeRangeTable(decodeRanges('g4FVKA', true)),
404
+ Tagbanwa: () => new UnicodeRangeTable(decodeRanges('g7FMCCCB', true)),
405
+ Tai_Le: () => new UnicodeRangeTable(decodeRanges('wqGdDE', true)),
406
+ Tai_Tham: () => new UnicodeRangeTable(decodeRanges('gxG+BCcDKHJHN', true)),
407
+ Tai_Viet: () => new UnicodeRangeTable(decodeRanges('g0qBiCZE', true)),
408
+ Takri: () => new UnicodeRangeTable(decodeRanges('g0lC5BHJ', true)),
409
+ Tamil: () => new UnicodeRangeTable(decodeRanges('i8CBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBm+kCxBBOAB', false)),
410
+ Tangsa: () => new UnicodeRangeTable(decodeRanges('wz6CuCCJ', true)),
411
+ Tangut: () => new UnicodeRangeTable(decodeRanges('g-7CgBgBB2-FBJ-XBhQIB', false)),
412
+ Telugu: () => new UnicodeRangeTable(decodeRanges('ggDMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIIB', false)),
413
+ Thaana: () => new UnicodeRangeTable(decodeRanges('g8BxB', true)),
414
+ Thai: () => new UnicodeRangeTable(decodeRanges('hwD5BGb', true)),
415
+ Tibetan: () => new UnicodeRangeTable(decodeRanges('g4DnCCjBFmBCjBCOCGFB', true)),
416
+ Tifinagh: () => new UnicodeRangeTable(decodeRanges('wpL3BIBPA', true)),
417
+ Tirhuta: () => new UnicodeRangeTable(decodeRanges('gklCnCJJ', true)),
418
+ Todhri: () => new UnicodeRangeTable(decodeRanges('guhCzB', true)),
419
+ Toto: () => new UnicodeRangeTable(decodeRanges('w04De', true)),
420
+ Tulu_Tigalari: () => new UnicodeRangeTable(decodeRanges('g8kCJBCDDClBBCJBCDDCDBCJBCBBJBB', false)),
421
+ Ugaritic: () => new UnicodeRangeTable(decodeRanges('g8gCdCA', true)),
422
+ Unknown: () => new UnicodeRangeTable(decodeRanges('4bBBHDBICCVuMuMnBBBzBBBE4B4BBGBcDBHKBvI9B9BBmDmDBMB8BBByBBBQddBCCMEBgBDDBDBuHJJBDDBXXICCBBBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBbFB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKmDmDNBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBjoIBvLBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCC-FCBHBBHBBHBBECBIIIBIBGBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIBlCJBCBBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMB3iBJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBJ76DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBjGUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEwi3VBCdBhD-DBxHvw-FB', false)),
423
+ Vai: () => new UnicodeRangeTable(decodeRanges('gopBrJ', true)),
424
+ Vithkuqi: () => new UnicodeRangeTable(decodeRanges('wrhCKCOCGCBCKCOCGCB', true)),
425
+ Wancho: () => new UnicodeRangeTable(decodeRanges('g24D5BGA', true)),
426
+ Warang_Citi: () => new UnicodeRangeTable(decodeRanges('glmCyCNA', true)),
427
+ Yezidi: () => new UnicodeRangeTable(decodeRanges('g0jCpBCCDB', true)),
428
+ Yi: () => new UnicodeRangeTable(decodeRanges('ggoBskBE2B', true)),
429
+ Zanabazar_Square: () => new UnicodeRangeTable(decodeRanges('gwmCnC', true))
430
+ });
431
+ static FOLD_CATEGORIES = new LazyMap({
432
+ C: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
433
+ Cn: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
434
+ L: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
435
+ LC: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
436
+ Ll: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiBuBCEECDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIBBCBBCBBCOCDQCDBBCCCBBBC4BCIBBCBBDCCBCBCGC3HrBrBCEEJHHCCBCCCBCCBPBCIBkBJJCUCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBZHBJHBJHBJEBMEBMDBNEBMEBqJEEBHHxC9zC9zCBuBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEECKCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBh1ehBB', false)),
437
+ Lt: () => new UnicodeRangeTable(decodeRanges('kOCCBCCBCClBCCtsHHBJHBJHBMQQwBAB', false)),
438
+ Lu: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBCuBCEECDOCDsBCDECBBBDCCDEEGDDECBDDDCCCDFFDEECDDECCGBBCBBCBBCOCBSCDBBCEECkBCEQCJDDBCCFICBEBCBBCCCBEEBCCBCBCEBDCCBDDIDDCBBEFBGLLBnFnFsBCCEEEBBBvBDBCdBCBBECBCWCBDBCGD1BvBBCgBCK0BCDMCBgDCyBlBBq6CqBBDCB5XFBjkCIBCvHvHERRzD0ECGGGC8CCBHBJFBLHBJHBJFBMGCJHBJNBzBBBNSSBPPBEEpL2B2Bs1CvBBCEEBGCHDDLiDCJCCFNNBkBBCGG0oesBCUaCoEMCE8BCLCCDICFFFCBBDSCMOCFCCDEEGECb9a9advCBi8UZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfBj1ehBB', false)),
439
+ M: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
440
+ Mn: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false))
441
+ });
442
+ static FOLD_SCRIPT = new LazyMap({
443
+ Common: () => new UnicodeRangeTable(decodeRanges('8cgBgB', false)),
444
+ Greek: () => new UnicodeRangeTable(decodeRanges('1FwUwU', false)),
445
+ Inherited: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
446
+ Latin: () => new UnicodeRangeTable(decodeRanges('y+pBCC', false)),
447
+ Unknown: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false))
448
+ });
344
449
  }
345
450
 
346
451
  /**
@@ -593,7 +698,7 @@ class Utils {
593
698
 
594
699
  // Returns the array of runes in the specified Java UTF-16 string.
595
700
  static stringToRunes(str) {
596
- return String(str).split('').map(s => s.codePointAt(0));
701
+ return Array.from(String(str)).map(s => s.codePointAt(0));
597
702
  }
598
703
 
599
704
  // Returns the Java UTF-16 string containing the single rune |r|.
@@ -864,6 +969,14 @@ class MachineInputBase {
864
969
  endPos() {
865
970
  return this.end;
866
971
  }
972
+ hasString() {
973
+ return false;
974
+ }
975
+
976
+ // Helper for the exact-literal fast-path execution router
977
+ prefixLength() {
978
+ return 0;
979
+ }
867
980
  }
868
981
 
869
982
  // An implementation of MachineInput for UTF-8 byte arrays.
@@ -875,6 +988,14 @@ class MachineUTF8Input extends MachineInputBase {
875
988
  this.start = start;
876
989
  this.end = end;
877
990
  }
991
+ hasString(prefilter, pos) {
992
+ const target = prefilter.bytes;
993
+ if (target.length === 0) return true;
994
+
995
+ // Reuse the high-speed indexOf method already implemented below
996
+ const idx = this.indexOf(this.bytes, target, this.start + pos);
997
+ return idx !== -1 && idx <= this.end - target.length;
998
+ }
878
999
 
879
1000
  // Returns the rune at the specified index; the units are
880
1001
  // unspecified, but could be UTF-8 byte, UTF-16 char, or rune
@@ -951,10 +1072,10 @@ class MachineUTF8Input extends MachineInputBase {
951
1072
  indexOf(source, target, fromIndex = 0) {
952
1073
  let targetLength = target.length;
953
1074
  if (targetLength === 0) {
954
- return -1;
1075
+ return fromIndex <= this.end ? fromIndex : -1;
955
1076
  }
956
- let sourceLength = source.length;
957
- for (let i = fromIndex; i <= sourceLength - targetLength; i++) {
1077
+ let limit = this.end - targetLength;
1078
+ for (let i = fromIndex; i <= limit; i++) {
958
1079
  for (let j = 0; j < targetLength; j++) {
959
1080
  if (source[i + j] !== target[j]) {
960
1081
  break;
@@ -965,6 +1086,9 @@ class MachineUTF8Input extends MachineInputBase {
965
1086
  }
966
1087
  return -1;
967
1088
  }
1089
+ prefixLength(re2) {
1090
+ return re2.prefixUTF8.length;
1091
+ }
968
1092
  }
969
1093
 
970
1094
  // |pos| and |width| are in JS "char" units.
@@ -975,6 +1099,10 @@ class MachineUTF16Input extends MachineInputBase {
975
1099
  this.start = start;
976
1100
  this.end = end;
977
1101
  }
1102
+ hasString(prefilter, pos) {
1103
+ const idx = this.charSequence.indexOf(prefilter.str, this.start + pos);
1104
+ return idx !== -1 && idx <= this.end - prefilter.str.length;
1105
+ }
978
1106
 
979
1107
  // Returns the rune at the specified index; the units are
980
1108
  // unspecified, but could be UTF-8 byte, UTF-16 char, or rune
@@ -1020,6 +1148,9 @@ class MachineUTF16Input extends MachineInputBase {
1020
1148
  const r2 = pos < this.charSequence.length ? this.charSequence.codePointAt(pos) : -1;
1021
1149
  return Utils.emptyOpContext(r1, r2);
1022
1150
  }
1151
+ prefixLength(re2) {
1152
+ return re2.prefix.length;
1153
+ }
1023
1154
  }
1024
1155
  class MachineInput {
1025
1156
  static fromUTF8(bytes, start = 0, end = bytes.length) {
@@ -1110,6 +1241,17 @@ class RE2JSFlagsException extends RE2JSException {
1110
1241
  }
1111
1242
  }
1112
1243
 
1244
+ /**
1245
+ * An exception thrown for internal engine errors, such as corrupted bytecodes.
1246
+ */
1247
+ class RE2JSInternalException extends RE2JSException {
1248
+ /** @param {string} message */
1249
+ constructor(message) {
1250
+ super(message);
1251
+ this.name = 'RE2JSInternalException';
1252
+ }
1253
+ }
1254
+
1113
1255
  /**
1114
1256
  * A stateful iterator that interprets a regex {@code RE2JS} on a specific input.
1115
1257
  *
@@ -1312,6 +1454,23 @@ class Matcher {
1312
1454
  }
1313
1455
  return this.substring(start, end);
1314
1456
  }
1457
+
1458
+ /**
1459
+ * Returns a dictionary map of all named capturing groups and their matched values.
1460
+ * If a group was not matched, its value will be `null`.
1461
+ * @returns {Record<string, string|null>}
1462
+ */
1463
+ getNamedGroups() {
1464
+ if (!this.hasMatch) {
1465
+ throw new RE2JSGroupException('perhaps no match attempted');
1466
+ }
1467
+ const result = {};
1468
+ for (const name of Object.keys(this.namedGroups)) {
1469
+ result[name] = this.group(name);
1470
+ }
1471
+ return result;
1472
+ }
1473
+
1315
1474
  /**
1316
1475
  * Returns the number of subgroups in this pattern.
1317
1476
  *
@@ -1736,16 +1895,20 @@ class Inst {
1736
1895
  }
1737
1896
  return r === r0;
1738
1897
  }
1739
- // Peek at the first few pairs.
1740
- // Should handle ASCII well.
1741
- for (let j = 0; j < this.runes.length && j <= 8; j += 2) {
1742
- if (r < this.runes[j]) {
1743
- return false;
1744
- }
1745
- if (r <= this.runes[j + 1]) {
1746
- return true;
1898
+ const len = this.runes.length;
1899
+ // If the array is exactly 2, 4, 6, or 8 items, DO NOT fall through to binary search
1900
+ if (len === 2 || len === 4 || len === 6 || len === 8) {
1901
+ for (let j = 0; j < len; j += 2) {
1902
+ if (r < this.runes[j]) {
1903
+ return false;
1904
+ }
1905
+ if (r <= this.runes[j + 1]) {
1906
+ return true;
1907
+ }
1747
1908
  }
1909
+ return false; // Stop here
1748
1910
  }
1911
+
1749
1912
  // Otherwise binary search.
1750
1913
  let lo = 0;
1751
1914
  let hi = this.runes.length / 2 | 0;
@@ -1763,6 +1926,40 @@ class Inst {
1763
1926
  }
1764
1927
  return false;
1765
1928
  }
1929
+
1930
+ // matchRunePos checks whether the instruction matches (and consumes) r.
1931
+ // If so, it returns the index of the matching rune pair.
1932
+ // If not, it returns -1.
1933
+ matchRunePos(r) {
1934
+ if (this.runes.length === 1) {
1935
+ const r0 = this.runes[0];
1936
+ if ((this.arg & RE2Flags.FOLD_CASE) !== 0) {
1937
+ return Unicode.equalsIgnoreCase(r0, r) ? 0 : -1;
1938
+ }
1939
+ return r === r0 ? 0 : -1;
1940
+ }
1941
+ const len = this.runes.length;
1942
+ if (len === 2 || len === 4 || len === 6 || len === 8) {
1943
+ for (let j = 0; j < len; j += 2) {
1944
+ if (r < this.runes[j]) return -1;
1945
+ if (r <= this.runes[j + 1]) return Math.floor(j / 2);
1946
+ }
1947
+ return -1;
1948
+ }
1949
+ let lo = 0;
1950
+ let hi = Math.floor(len / 2);
1951
+ while (lo < hi) {
1952
+ const m = lo + hi >> 1;
1953
+ const c = this.runes[2 * m];
1954
+ if (c <= r) {
1955
+ if (r <= this.runes[2 * m + 1]) return m;
1956
+ lo = m + 1;
1957
+ } else {
1958
+ hi = m;
1959
+ }
1960
+ }
1961
+ return -1;
1962
+ }
1766
1963
  /**
1767
1964
  *
1768
1965
  * @returns {string}
@@ -1778,7 +1975,7 @@ class Inst {
1778
1975
  case Inst.EMPTY_WIDTH:
1779
1976
  return `empty ${this.arg} -> ${this.out}`;
1780
1977
  case Inst.MATCH:
1781
- return 'match';
1978
+ return `match${this.arg !== 0 ? ` ${this.arg}` : ''}`;
1782
1979
  case Inst.FAIL:
1783
1980
  return 'fail';
1784
1981
  case Inst.NOP:
@@ -1804,7 +2001,7 @@ class Inst {
1804
2001
  class Thread {
1805
2002
  constructor() {
1806
2003
  this.inst = null;
1807
- this.cap = [];
2004
+ this.cap = null; // Initialized to Int32Array later
1808
2005
  }
1809
2006
  }
1810
2007
 
@@ -1832,9 +2029,11 @@ class Queue {
1832
2029
  return j;
1833
2030
  }
1834
2031
  clear() {
1835
- this.sparse = [];
1836
- this.densePcs = [];
1837
- this.denseThreads = [];
2032
+ // Prevent memory leaks by nulling out used object references
2033
+ for (let i = 0; i < this.size; i++) {
2034
+ this.denseThreads[i] = null;
2035
+ }
2036
+ // The sparse set logic safely ignores stale integers in Typed Arrays.
1838
2037
  this.size = 0;
1839
2038
  }
1840
2039
  toString() {
@@ -1863,22 +2062,13 @@ class Machine {
1863
2062
  m.pool = [];
1864
2063
  m.poolSize = 0;
1865
2064
  m.matched = false;
1866
- m.matchcap = Array(m.prog.numCap < 2 ? 2 : m.prog.numCap).fill(0);
2065
+ // Use Int32Array instead of standard JS array
2066
+ m.matchcap = new Int32Array(m.prog.numCap < 2 ? 2 : m.prog.numCap);
1867
2067
  m.ncap = 0;
1868
2068
  return m;
1869
2069
  }
1870
2070
  static fromMachine(machine) {
1871
- const m = new Machine();
1872
- m.re2 = machine.re2;
1873
- m.prog = machine.prog;
1874
- m.q0 = machine.q0;
1875
- m.q1 = machine.q1;
1876
- m.pool = machine.pool;
1877
- m.poolSize = machine.poolSize;
1878
- m.matched = machine.matched;
1879
- m.matchcap = machine.matchcap;
1880
- m.ncap = machine.ncap;
1881
- return m;
2071
+ return Machine.fromRE2(machine.re2);
1882
2072
  }
1883
2073
 
1884
2074
  // init() reinitializes an existing Machine for re-use on a new input.
@@ -1887,27 +2077,30 @@ class Machine {
1887
2077
  if (ncap > this.matchcap.length) {
1888
2078
  this.initNewCap(ncap);
1889
2079
  } else {
1890
- this.resetCap(ncap);
2080
+ this.resetCap();
1891
2081
  }
1892
2082
  }
1893
- resetCap(ncap) {
2083
+
2084
+ // Wipes existing typed array memory without reallocating
2085
+ resetCap() {
1894
2086
  for (let i = 0; i < this.poolSize; i++) {
1895
2087
  const t = this.pool[i];
1896
- t.cap = Array(ncap).fill(0);
2088
+ t.cap.fill(0);
1897
2089
  }
1898
2090
  }
1899
2091
  initNewCap(ncap) {
1900
2092
  for (let i = 0; i < this.poolSize; i++) {
1901
2093
  const t = this.pool[i];
1902
- t.cap = Array(ncap).fill(0);
2094
+ t.cap = new Int32Array(ncap);
1903
2095
  }
1904
- this.matchcap = Array(ncap).fill(0);
2096
+ this.matchcap = new Int32Array(ncap);
1905
2097
  }
1906
2098
  submatches() {
1907
2099
  if (this.ncap === 0) {
1908
2100
  return Utils.emptyInts();
1909
2101
  }
1910
- return this.matchcap.slice(0, this.ncap);
2102
+ // Use subarray() to create a zero-allocation view before converting
2103
+ return Array.from(this.matchcap.subarray(0, this.ncap));
1911
2104
  }
1912
2105
 
1913
2106
  // alloc() allocates a new thread with the given instruction.
@@ -1919,6 +2112,7 @@ class Machine {
1919
2112
  t = this.pool[this.poolSize];
1920
2113
  } else {
1921
2114
  t = new Thread();
2115
+ t.cap = new Int32Array(this.matchcap.length);
1922
2116
  }
1923
2117
  t.inst = inst;
1924
2118
  return t;
@@ -1926,16 +2120,10 @@ class Machine {
1926
2120
 
1927
2121
  // Frees all threads on the thread queue, returning them to the free pool.
1928
2122
  freeQueue(queue, from = 0) {
1929
- const numberOfThread = queue.size - from;
1930
- const requiredPoolLength = this.poolSize + numberOfThread;
1931
- if (this.pool.length < requiredPoolLength) {
1932
- this.pool = this.pool.slice(0, Math.max(this.pool.length * 2, requiredPoolLength));
1933
- }
1934
2123
  for (let i = from; i < queue.size; i++) {
1935
2124
  const t = queue.denseThreads[i];
1936
2125
  if (t !== null) {
1937
- this.pool[this.poolSize] = t;
1938
- this.poolSize++;
2126
+ this.pool[this.poolSize++] = t;
1939
2127
  }
1940
2128
  }
1941
2129
  queue.clear();
@@ -1943,11 +2131,7 @@ class Machine {
1943
2131
 
1944
2132
  // freeThread() returns t to the free pool.
1945
2133
  freeThread(t) {
1946
- if (this.pool.length <= this.poolSize) {
1947
- this.pool = this.pool.slice(0, this.pool.length * 2);
1948
- }
1949
- this.pool[this.poolSize] = t;
1950
- this.poolSize++;
2134
+ this.pool[this.poolSize++] = t;
1951
2135
  }
1952
2136
  match(input, pos, anchor) {
1953
2137
  const startCond = this.re2.cond;
@@ -1958,7 +2142,7 @@ class Machine {
1958
2142
  return false;
1959
2143
  }
1960
2144
  this.matched = false;
1961
- this.matchcap = Array(this.prog.numCap).fill(-1);
2145
+ this.matchcap.fill(-1);
1962
2146
  let runq = this.q0;
1963
2147
  let nextq = this.q1;
1964
2148
  let r = input.step(pos);
@@ -2029,6 +2213,85 @@ class Machine {
2029
2213
  this.freeQueue(nextq);
2030
2214
  return this.matched;
2031
2215
  }
2216
+ matchSet(input, pos, anchor) {
2217
+ const startCond = this.re2.cond;
2218
+ if (startCond === Utils.EMPTY_ALL) return [];
2219
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2220
+ return [];
2221
+ }
2222
+ let runq = this.q0;
2223
+ let nextq = this.q1;
2224
+ let r = input.step(pos);
2225
+ let rune = r >> 3;
2226
+ let width = r & 7;
2227
+ let rune1 = -1;
2228
+ let width1 = 0;
2229
+ if (r !== MachineInputBase.EOF()) {
2230
+ r = input.step(pos + width);
2231
+ rune1 = r >> 3;
2232
+ width1 = r & 7;
2233
+ }
2234
+ let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
2235
+ const matches = new Set();
2236
+ while (true) {
2237
+ if (runq.isEmpty()) {
2238
+ if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) break;
2239
+ }
2240
+ if (pos === 0 || anchor === RE2Flags.UNANCHORED) {
2241
+ this.add(runq, this.prog.start, pos, this.matchcap, flag, null);
2242
+ }
2243
+ const nextPos = pos + width;
2244
+ flag = input.context(nextPos);
2245
+ for (let j = 0; j < runq.size; j++) {
2246
+ let t = runq.denseThreads[j];
2247
+ if (t === null) continue;
2248
+ const i = t.inst;
2249
+ let add = false;
2250
+ switch (i.op) {
2251
+ case Inst.MATCH:
2252
+ if (anchor === RE2Flags.ANCHOR_BOTH && pos !== input.endPos()) break;
2253
+ matches.add(i.arg); // Record the matched Set ID
2254
+ break;
2255
+ case Inst.RUNE:
2256
+ add = i.matchRune(rune);
2257
+ break;
2258
+ case Inst.RUNE1:
2259
+ add = rune === i.runes[0];
2260
+ break;
2261
+ case Inst.RUNE_ANY:
2262
+ add = true;
2263
+ break;
2264
+ case Inst.RUNE_ANY_NOT_NL:
2265
+ add = rune !== Codepoint.CODES.get('\n');
2266
+ break;
2267
+ default:
2268
+ throw new RE2JSInternalException('bad inst');
2269
+ }
2270
+ if (add) {
2271
+ t = this.add(nextq, i.out, nextPos, t.cap, flag, t);
2272
+ }
2273
+ if (t !== null) {
2274
+ this.freeThread(t);
2275
+ runq.denseThreads[j] = null;
2276
+ }
2277
+ }
2278
+ runq.clear();
2279
+ if (width === 0) break;
2280
+ pos += width;
2281
+ rune = rune1;
2282
+ width = width1;
2283
+ if (rune !== -1) {
2284
+ r = input.step(pos + width);
2285
+ rune1 = r >> 3;
2286
+ width1 = r & 7;
2287
+ }
2288
+ const tmpq = runq;
2289
+ runq = nextq;
2290
+ nextq = tmpq;
2291
+ }
2292
+ this.freeQueue(nextq);
2293
+ return Array.from(matches).sort((a, b) => a - b);
2294
+ }
2032
2295
  step(runq, nextq, pos, nextPos, c, nextCond, anchor, atEnd) {
2033
2296
  const longest = this.re2.longest;
2034
2297
  for (let j = 0; j < runq.size; j++) {
@@ -2049,7 +2312,9 @@ class Machine {
2049
2312
  }
2050
2313
  if (this.ncap > 0 && (!longest || !this.matched || this.matchcap[1] < pos)) {
2051
2314
  t.cap[1] = pos;
2052
- this.matchcap = t.cap.slice(0, this.ncap);
2315
+ // Using subarray creates a fast view, avoiding a full array copy
2316
+ // until the submatches are finalized at the very end.
2317
+ this.matchcap.set(t.cap.subarray(0, this.ncap));
2053
2318
  }
2054
2319
  if (!longest) {
2055
2320
  this.freeQueue(runq, j + 1);
@@ -2069,7 +2334,7 @@ class Machine {
2069
2334
  add = c !== Codepoint.CODES.get('\n');
2070
2335
  break;
2071
2336
  default:
2072
- throw new Error('bad inst');
2337
+ throw new RE2JSInternalException('bad inst');
2073
2338
  }
2074
2339
  if (add) {
2075
2340
  t = this.add(nextq, i.out, nextPos, t.cap, nextCond, t);
@@ -2127,7 +2392,10 @@ class Machine {
2127
2392
  t.inst = inst;
2128
2393
  }
2129
2394
  if (this.ncap > 0 && t.cap !== cap) {
2130
- t.cap = cap.slice(0, this.ncap);
2395
+ // Direct assignment utilizing Typed Array performance
2396
+ for (let c = 0; c < this.ncap; c++) {
2397
+ t.cap[c] = cap[c];
2398
+ }
2131
2399
  }
2132
2400
  q.denseThreads[d] = t;
2133
2401
  t = null;
@@ -2159,20 +2427,24 @@ const arraysEqual = (a, b) => {
2159
2427
  return true;
2160
2428
  };
2161
2429
  class DFAState {
2162
- constructor(nfaStates, isMatch) {
2430
+ constructor(nfaStates, isMatch, matchIDs = []) {
2163
2431
  this.nfaStates = nfaStates; // Int32Array of Instruction PCs
2164
2432
  this.isMatch = isMatch; // Boolean
2433
+ this.matchIDs = matchIDs; // Array of integers indicating which Set patterns matched
2165
2434
  this.nextAscii = new Array(Unicode.MAX_ASCII + 1).fill(null); // Flat array for blisteringly fast ASCII lookups
2166
2435
  this.nextMap = new Map(); // Cache of Char -> DFAState
2167
2436
  }
2168
2437
  }
2169
2438
  class DFA {
2439
+ static MAX_CACHE_CLEARS = 5;
2170
2440
  constructor(prog) {
2171
2441
  this.prog = prog;
2172
2442
  this.stateCache = new Map(); // hash(number) -> DFAState[]
2173
2443
  this.stateCount = 0; // Tracks total states for memory limits
2174
2444
  this.startState = null;
2175
2445
  this.stateLimit = 10000; // Prevent memory explosion (ReDoS protection)
2446
+ this.cacheClears = 0; // Track thrashing
2447
+ this.failed = false; // mark if DFA cannot work with provided prog
2176
2448
  }
2177
2449
 
2178
2450
  // Follows epsilon (empty) transitions to find all reachable states without consuming a char
@@ -2180,6 +2452,7 @@ class DFA {
2180
2452
  const closure = new Set();
2181
2453
  const stack = [...pcs];
2182
2454
  let isMatch = false;
2455
+ const matchIDs = [];
2183
2456
  while (stack.length > 0) {
2184
2457
  const pc = stack.pop();
2185
2458
  if (closure.has(pc)) continue;
@@ -2188,6 +2461,7 @@ class DFA {
2188
2461
  switch (inst.op) {
2189
2462
  case Inst.MATCH:
2190
2463
  isMatch = true;
2464
+ if (!matchIDs.includes(inst.arg)) matchIDs.push(inst.arg);
2191
2465
  break;
2192
2466
  case Inst.ALT:
2193
2467
  case Inst.ALT_MATCH:
@@ -2205,9 +2479,11 @@ class DFA {
2205
2479
  }
2206
2480
  }
2207
2481
  const sortedPCs = Int32Array.from(closure).sort();
2482
+ matchIDs.sort((a, b) => a - b);
2208
2483
  return {
2209
2484
  pcs: sortedPCs,
2210
- isMatch
2485
+ isMatch,
2486
+ matchIDs
2211
2487
  };
2212
2488
  }
2213
2489
 
@@ -2234,17 +2510,27 @@ class DFA {
2234
2510
  this.stateCache.set(hash, bucket);
2235
2511
  }
2236
2512
 
2513
+ // DFA already failed once - exit
2514
+ if (this.failed) return null;
2515
+
2237
2516
  // Safety: prevent memory exhaustion from state explosion
2238
2517
  // We flush the cache and return null, which seamlessly routes execution to the NFA
2239
2518
  if (this.stateCount >= this.stateLimit) {
2240
2519
  this.stateCache.clear();
2241
2520
  this.stateCount = 0;
2242
2521
  this.startState = null;
2522
+ this.cacheClears++;
2523
+
2524
+ // If this regex causes continuous cache thrashing, permanently fall back to NFA
2525
+ // to avoid spending CPU cycles constantly rebuilding the DFA tree.
2526
+ if (this.cacheClears >= DFA.MAX_CACHE_CLEARS) {
2527
+ this.failed = true;
2528
+ }
2243
2529
  return null;
2244
2530
  }
2245
2531
 
2246
2532
  // State not found, create it and add to bucket
2247
- const state = new DFAState(sortedPCs, closureResult.isMatch);
2533
+ const state = new DFAState(sortedPCs, closureResult.isMatch, closureResult.matchIDs);
2248
2534
  bucket.push(state);
2249
2535
  this.stateCount++;
2250
2536
  return state;
@@ -2272,68 +2558,800 @@ class DFA {
2272
2558
  nextPCs.push(inst.out);
2273
2559
  }
2274
2560
  }
2275
- if (anchor === RE2Flags.UNANCHORED) {
2276
- nextPCs.push(this.prog.start);
2561
+ if (anchor === RE2Flags.UNANCHORED) {
2562
+ nextPCs.push(this.prog.start);
2563
+ }
2564
+ const nextState = this.getState(nextPCs);
2565
+
2566
+ // Cache the result
2567
+ if (anchor === RE2Flags.UNANCHORED && charCode <= Unicode.MAX_ASCII) {
2568
+ state.nextAscii[charCode] = nextState;
2569
+ } else {
2570
+ const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
2571
+ state.nextMap.set(key, nextState);
2572
+ }
2573
+ return nextState;
2574
+ }
2575
+
2576
+ // The hot loop: Execute the Lazy DFA
2577
+ match(input, pos, anchor) {
2578
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2579
+ return false;
2580
+ }
2581
+ if (!this.startState) {
2582
+ this.startState = this.getState([this.prog.start]);
2583
+ if (!this.startState) return null; // Fallback to NFA
2584
+ }
2585
+ let endPos = input.endPos();
2586
+ let currentState = this.startState;
2587
+ if (currentState.isMatch) {
2588
+ if (anchor === RE2Flags.ANCHOR_BOTH) {
2589
+ if (pos === endPos) return true;
2590
+ } else {
2591
+ return true;
2592
+ }
2593
+ }
2594
+ let i = pos;
2595
+ while (i < endPos) {
2596
+ const r = input.step(i);
2597
+ const rune = r >> 3;
2598
+ const width = r & 7;
2599
+
2600
+ // prevent infinite loop on EOF
2601
+ if (width === 0) {
2602
+ break;
2603
+ }
2604
+ currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
2605
+
2606
+ // If we hit an unrecoverable DFA error or bailout, signal fallback
2607
+ if (currentState === null) return null;
2608
+ if (currentState.isMatch) {
2609
+ if (anchor === RE2Flags.ANCHOR_BOTH) {
2610
+ if (i + width === endPos) return true;
2611
+ } else {
2612
+ return true;
2613
+ }
2614
+ }
2615
+
2616
+ // If we hit a dead end, and anchored, fail early
2617
+ if (currentState.nfaStates.length === 0) {
2618
+ if (anchor !== RE2Flags.UNANCHORED) return false;
2619
+ }
2620
+ i += width;
2621
+ }
2622
+ return false;
2623
+ }
2624
+
2625
+ // The hot loop for evaluating Multi-Pattern Sets
2626
+ matchSet(input, pos, anchor) {
2627
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2628
+ return [];
2629
+ }
2630
+ if (!this.startState) {
2631
+ this.startState = this.getState([this.prog.start]);
2632
+ if (!this.startState) return null; // Fallback to NFA
2633
+ }
2634
+ let endPos = input.endPos();
2635
+ let currentState = this.startState;
2636
+ const matches = new Set();
2637
+ const checkMatch = (state, currentPos) => {
2638
+ if (state.isMatch) {
2639
+ if (anchor === RE2Flags.ANCHOR_BOTH) {
2640
+ if (currentPos === endPos) {
2641
+ state.matchIDs.forEach(id => matches.add(id));
2642
+ }
2643
+ } else {
2644
+ state.matchIDs.forEach(id => matches.add(id));
2645
+ }
2646
+ }
2647
+ };
2648
+ checkMatch(currentState, pos);
2649
+ let i = pos;
2650
+ while (i < endPos) {
2651
+ const r = input.step(i);
2652
+ const rune = r >> 3;
2653
+ const width = r & 7;
2654
+ if (width === 0) break;
2655
+ currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
2656
+ if (currentState === null) return null; // Bailout to NFA
2657
+
2658
+ i += width;
2659
+ checkMatch(currentState, i);
2660
+ if (currentState.nfaStates.length === 0) {
2661
+ if (anchor !== RE2Flags.UNANCHORED) break;
2662
+ }
2663
+ }
2664
+ return Array.from(matches).sort((a, b) => a - b);
2665
+ }
2666
+ }
2667
+
2668
+ const VISITED_BITS = 32;
2669
+ const MAX_BACKTRACK_PROG = 500;
2670
+ const INITIAL_JOB_CAPACITY = 256; // Starting size for the job stack arrays
2671
+ const MAX_BACKTRACK_VECTOR = 256 * 1024; // 32 KB limit for the visited bit-mask
2672
+
2673
+ class BitState {
2674
+ constructor() {
2675
+ this.end = 0;
2676
+ this.cap = new Int32Array(0);
2677
+ this.matchcap = new Int32Array(0);
2678
+ this.ncap = 0;
2679
+
2680
+ // Parallel arrays acting as the backtrack job stack
2681
+ this.jobPc = new Int32Array(INITIAL_JOB_CAPACITY);
2682
+ this.jobArg = new Uint8Array(INITIAL_JOB_CAPACITY);
2683
+ this.jobPos = new Int32Array(INITIAL_JOB_CAPACITY);
2684
+ this.jobLen = 0;
2685
+ this.visited = new Uint32Array(0);
2686
+ }
2687
+ reset(prog, end, ncap) {
2688
+ this.end = end;
2689
+ this.jobLen = 0;
2690
+ this.ncap = ncap;
2691
+
2692
+ // Bitwise shift (>>> 5) instead of Math.floor( / 32)
2693
+ const visitedSize = prog.numInst() * (end + 1) + VISITED_BITS - 1 >>> 5;
2694
+ if (this.visited.length < visitedSize) {
2695
+ this.visited = new Uint32Array(Math.floor(MAX_BACKTRACK_VECTOR / VISITED_BITS));
2696
+ } else {
2697
+ this.visited.fill(0, 0, visitedSize);
2698
+ }
2699
+ if (this.cap.length < ncap) {
2700
+ // Must explicitly fill with -1 as Int32Array defaults to 0
2701
+ this.cap = new Int32Array(ncap).fill(-1);
2702
+ } else {
2703
+ this.cap.fill(-1, 0, ncap);
2704
+ }
2705
+ if (this.matchcap.length < ncap) {
2706
+ this.matchcap = new Int32Array(ncap).fill(-1);
2707
+ } else {
2708
+ this.matchcap.fill(-1, 0, ncap);
2709
+ }
2710
+ }
2711
+ shouldVisit(pc, pos) {
2712
+ const n = pc * (this.end + 1) + pos;
2713
+ const idx = n >>> 5; // Equivalent to Math.floor(n / 32)
2714
+ const mask = 1 << (n & 31); // Equivalent to n % 32
2715
+
2716
+ if ((this.visited[idx] & mask) !== 0) {
2717
+ return false;
2718
+ }
2719
+ this.visited[idx] |= mask;
2720
+ return true;
2721
+ }
2722
+ push(re2, pc, pos, arg) {
2723
+ if (re2.prog.getInst(pc).op !== Inst.FAIL && (arg || this.shouldVisit(pc, pos))) {
2724
+ if (this.jobLen >= this.jobPc.length) {
2725
+ const newSize = this.jobPc.length * 2;
2726
+ const newPc = new Int32Array(newSize);
2727
+ newPc.set(this.jobPc);
2728
+ this.jobPc = newPc;
2729
+ const newArg = new Uint8Array(newSize);
2730
+ newArg.set(this.jobArg);
2731
+ this.jobArg = newArg;
2732
+ const newPos = new Int32Array(newSize);
2733
+ newPos.set(this.jobPos);
2734
+ this.jobPos = newPos;
2735
+ }
2736
+ this.jobPc[this.jobLen] = pc;
2737
+ this.jobArg[this.jobLen] = arg ? 1 : 0;
2738
+ this.jobPos[this.jobLen] = pos;
2739
+ this.jobLen++;
2740
+ }
2741
+ }
2742
+ tryBacktrack(re2, input, pc, pos, anchor) {
2743
+ const longest = re2.longest;
2744
+ this.push(re2, pc, pos, false);
2745
+ while (this.jobLen > 0) {
2746
+ this.jobLen--;
2747
+ let currentPc = this.jobPc[this.jobLen];
2748
+ let arg = this.jobArg[this.jobLen] === 1;
2749
+ let currentPos = this.jobPos[this.jobLen];
2750
+ let skipShouldVisit = true;
2751
+ while (true) {
2752
+ if (!skipShouldVisit) {
2753
+ if (!this.shouldVisit(currentPc, currentPos)) {
2754
+ break;
2755
+ }
2756
+ }
2757
+ skipShouldVisit = false;
2758
+ const inst = re2.prog.getInst(currentPc);
2759
+ switch (inst.op) {
2760
+ case Inst.FAIL:
2761
+ {
2762
+ throw new RE2JSInternalException('unexpected InstFail');
2763
+ }
2764
+ case Inst.ALT:
2765
+ {
2766
+ if (arg) {
2767
+ arg = false;
2768
+ currentPc = inst.arg;
2769
+ continue;
2770
+ } else {
2771
+ this.push(re2, currentPc, currentPos, true);
2772
+ currentPc = inst.out;
2773
+ continue;
2774
+ }
2775
+ }
2776
+ case Inst.ALT_MATCH:
2777
+ {
2778
+ const outInst = re2.prog.getInst(inst.out);
2779
+ if (Inst.isRuneOp(outInst.op)) {
2780
+ this.push(re2, inst.arg, currentPos, false);
2781
+ currentPc = inst.out;
2782
+ continue;
2783
+ }
2784
+ this.push(re2, inst.out, this.end, false);
2785
+ currentPc = inst.arg;
2786
+ continue;
2787
+ }
2788
+ case Inst.RUNE:
2789
+ {
2790
+ const r = input.step(currentPos);
2791
+ if (r === MachineInputBase.EOF()) break;
2792
+ if (!inst.matchRune(r >> 3)) break;
2793
+ currentPos += r & 7;
2794
+ currentPc = inst.out;
2795
+ continue;
2796
+ }
2797
+ case Inst.RUNE1:
2798
+ {
2799
+ const r = input.step(currentPos);
2800
+ if (r === MachineInputBase.EOF()) break;
2801
+ if (r >> 3 !== inst.runes[0]) break;
2802
+ currentPos += r & 7;
2803
+ currentPc = inst.out;
2804
+ continue;
2805
+ }
2806
+ case Inst.RUNE_ANY_NOT_NL:
2807
+ {
2808
+ const r = input.step(currentPos);
2809
+ if (r === MachineInputBase.EOF()) break;
2810
+ if (r >> 3 === 10) break;
2811
+ currentPos += r & 7;
2812
+ currentPc = inst.out;
2813
+ continue;
2814
+ }
2815
+ case Inst.RUNE_ANY:
2816
+ {
2817
+ const r = input.step(currentPos);
2818
+ if (r === MachineInputBase.EOF()) break;
2819
+ currentPos += r & 7;
2820
+ currentPc = inst.out;
2821
+ continue;
2822
+ }
2823
+ case Inst.CAPTURE:
2824
+ {
2825
+ if (arg) {
2826
+ this.cap[inst.arg] = currentPos;
2827
+ break;
2828
+ } else {
2829
+ if (inst.arg < this.ncap) {
2830
+ this.push(re2, currentPc, this.cap[inst.arg], true);
2831
+ this.cap[inst.arg] = currentPos;
2832
+ }
2833
+ currentPc = inst.out;
2834
+ continue;
2835
+ }
2836
+ }
2837
+ case Inst.EMPTY_WIDTH:
2838
+ {
2839
+ const flag = input.context(currentPos);
2840
+ if ((inst.arg & ~flag) !== 0) break;
2841
+ currentPc = inst.out;
2842
+ continue;
2843
+ }
2844
+ case Inst.NOP:
2845
+ {
2846
+ currentPc = inst.out;
2847
+ continue;
2848
+ }
2849
+ case Inst.MATCH:
2850
+ {
2851
+ if (anchor === RE2Flags.ANCHOR_BOTH && currentPos !== this.end) {
2852
+ break;
2853
+ }
2854
+ if (this.ncap === 0) return true;
2855
+ if (this.ncap > 1) {
2856
+ this.cap[1] = currentPos;
2857
+ }
2858
+ const old = this.matchcap[1];
2859
+ if (old === -1 || longest && currentPos > 0 && currentPos > old) {
2860
+ this.matchcap.set(this.cap);
2861
+ }
2862
+ if (!longest) return true;
2863
+ if (currentPos === this.end) return true;
2864
+ break;
2865
+ }
2866
+ default:
2867
+ {
2868
+ throw new RE2JSInternalException('bad inst');
2869
+ }
2870
+ }
2871
+ break;
2872
+ }
2873
+ }
2874
+ return longest && this.matchcap.length > 1 && this.matchcap[1] >= 0;
2875
+ }
2876
+ }
2877
+ const bitStatePool = [];
2878
+ class Backtracker {
2879
+ static shouldBacktrack(prog) {
2880
+ return prog.numInst() <= MAX_BACKTRACK_PROG;
2881
+ }
2882
+ static maxBitStateLen(prog) {
2883
+ if (!Backtracker.shouldBacktrack(prog)) {
2884
+ return 0;
2885
+ }
2886
+ return Math.floor(MAX_BACKTRACK_VECTOR / prog.numInst());
2887
+ }
2888
+ static execute(re2, input, pos, anchor, ncap) {
2889
+ const startCond = re2.cond;
2890
+ if (startCond === Utils.EMPTY_ALL) {
2891
+ return null;
2892
+ }
2893
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2894
+ return null;
2895
+ }
2896
+ if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) {
2897
+ return null;
2898
+ }
2899
+ const b = bitStatePool.length > 0 ? bitStatePool.pop() : new BitState();
2900
+ const end = input.endPos();
2901
+ b.reset(re2.prog, end, ncap);
2902
+ let matched = false;
2903
+ if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 || anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) {
2904
+ if (b.ncap > 0) {
2905
+ b.cap[0] = pos;
2906
+ }
2907
+ if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
2908
+ matched = true;
2909
+ }
2910
+ } else {
2911
+ let width = -1;
2912
+ for (; pos <= end && width !== 0; pos += width) {
2913
+ if (re2.prefix.length > 0) {
2914
+ const advance = input.index(re2, pos);
2915
+ if (advance < 0) {
2916
+ break;
2917
+ }
2918
+ pos += advance;
2919
+ }
2920
+ if (b.ncap > 0) {
2921
+ b.cap[0] = pos;
2922
+ }
2923
+ if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
2924
+ matched = true;
2925
+ break;
2926
+ }
2927
+ const r = input.step(pos);
2928
+ width = r === MachineInputBase.EOF() ? 0 : r & 7;
2929
+ }
2930
+ }
2931
+ if (!matched) {
2932
+ bitStatePool.push(b);
2933
+ return null;
2934
+ }
2935
+
2936
+ // Must slice so we don't accidentally leak trailing arrays from previously recycled typed arrays
2937
+ const result = ncap === 0 ? [] : Array.from(b.matchcap.subarray(0, ncap));
2938
+ bitStatePool.push(b);
2939
+ return result;
2940
+ }
2941
+ }
2942
+
2943
+ class QueueOnePass {
2944
+ constructor(size) {
2945
+ this.sparse = new Uint32Array(size);
2946
+ this.dense = new Uint32Array(size);
2947
+ this.size = 0;
2948
+ this.nextIndex = 0;
2949
+ }
2950
+ empty() {
2951
+ return this.nextIndex >= this.size;
2952
+ }
2953
+ next() {
2954
+ return this.dense[this.nextIndex++];
2955
+ }
2956
+ clear() {
2957
+ this.size = 0;
2958
+ this.nextIndex = 0;
2959
+ }
2960
+ contains(u) {
2961
+ return u < this.sparse.length && this.sparse[u] < this.size && this.dense[this.sparse[u]] === u;
2962
+ }
2963
+ insert(u) {
2964
+ if (!this.contains(u)) this.insertNew(u);
2965
+ }
2966
+ insertNew(u) {
2967
+ if (u >= this.sparse.length) return;
2968
+ this.sparse[u] = this.size;
2969
+ this.dense[this.size] = u;
2970
+ this.size++;
2971
+ }
2972
+ }
2973
+ const mergeRuneSets = (leftRunes, rightRunes, leftPC, rightPC) => {
2974
+ const leftLen = leftRunes.length;
2975
+ const rightLen = rightRunes.length;
2976
+ let lx = 0,
2977
+ rx = 0;
2978
+ const merged = [];
2979
+ const next = [];
2980
+ let ok = true;
2981
+ let ix = -1;
2982
+ const extend = isLeft => {
2983
+ const newArray = isLeft ? leftRunes : rightRunes;
2984
+ const low = isLeft ? lx : rx;
2985
+ const pc = isLeft ? leftPC : rightPC;
2986
+ if (ix > 0 && newArray[low] <= merged[ix]) return false;
2987
+ merged.push(newArray[low], newArray[low + 1]);
2988
+ if (isLeft) lx += 2;else rx += 2;
2989
+ ix += 2;
2990
+ next.push(pc);
2991
+ return true;
2992
+ };
2993
+ while (lx < leftLen || rx < rightLen) {
2994
+ if (rx >= rightLen) {
2995
+ ok = extend(true);
2996
+ } else if (lx >= leftLen) {
2997
+ ok = extend(false);
2998
+ } else if (rightRunes[rx] < leftRunes[lx]) {
2999
+ ok = extend(false);
3000
+ } else {
3001
+ ok = extend(true);
3002
+ }
3003
+ if (!ok) return null;
3004
+ }
3005
+ return {
3006
+ merged,
3007
+ next
3008
+ };
3009
+ };
3010
+ class OnePassProg {
3011
+ constructor(prog) {
3012
+ this.start = prog.start;
3013
+ this.numCap = prog.numCap;
3014
+ this.inst = new Array(prog.inst.length);
3015
+ for (let i = 0; i < prog.inst.length; i++) {
3016
+ const orig = prog.inst[i];
3017
+ const inst = new Inst(orig.op);
3018
+ inst.out = orig.out;
3019
+ inst.arg = orig.arg;
3020
+ inst.runes = orig.runes ? orig.runes.slice() : [];
3021
+ inst.next = null;
3022
+ this.inst[i] = inst;
3023
+ }
3024
+ }
3025
+ }
3026
+ const onePassCopy = prog => {
3027
+ const p = new OnePassProg(prog);
3028
+
3029
+ // Rewrites one or more common Prog constructs that enable some otherwise
3030
+ // non-onepass Progs to be onepass.
3031
+ for (let pc = 0; pc < p.inst.length; pc++) {
3032
+ const inst = p.inst[pc];
3033
+ if (inst.op !== Inst.ALT && inst.op !== Inst.ALT_MATCH) continue;
3034
+ let pAOther = 'out';
3035
+ let pAAlt = 'arg';
3036
+ let instAlt = p.inst[inst[pAAlt]];
3037
+ if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) {
3038
+ pAOther = 'arg';
3039
+ pAAlt = 'out';
3040
+ instAlt = p.inst[inst[pAAlt]];
3041
+ if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) continue;
3042
+ }
3043
+ const instOther = p.inst[inst[pAOther]];
3044
+ if (instOther.op === Inst.ALT || instOther.op === Inst.ALT_MATCH) continue;
3045
+ let pBAlt = 'out';
3046
+ let pBOther = 'arg';
3047
+ let patch = false;
3048
+ if (instAlt.out === pc) {
3049
+ patch = true;
3050
+ } else if (instAlt.arg === pc) {
3051
+ patch = true;
3052
+ pBAlt = 'arg';
3053
+ pBOther = 'out';
3054
+ }
3055
+ if (patch) instAlt[pBAlt] = inst[pAOther];
3056
+ if (inst[pAOther] === instAlt[pBAlt]) inst[pAAlt] = instAlt[pBOther];
3057
+ }
3058
+ return p;
3059
+ };
3060
+ const makeOnePass = p => {
3061
+ if (p.inst.length >= 1000) return null;
3062
+ const instQueue = new QueueOnePass(p.inst.length);
3063
+ const visitQueue = new QueueOnePass(p.inst.length);
3064
+ const onePassRunes = new Array(p.inst.length);
3065
+ const m = new Array(p.inst.length).fill(false);
3066
+ const check = pc => {
3067
+ let ok = true;
3068
+ const inst = p.inst[pc];
3069
+ if (visitQueue.contains(pc)) return true;
3070
+ visitQueue.insert(pc);
3071
+ switch (inst.op) {
3072
+ case Inst.ALT:
3073
+ case Inst.ALT_MATCH:
3074
+ {
3075
+ ok = check(inst.out) && check(inst.arg);
3076
+ let matchOut = m[inst.out];
3077
+ let matchArg = m[inst.arg];
3078
+ if (matchOut && matchArg) return false;
3079
+ if (matchArg) {
3080
+ const tempOut = inst.out;
3081
+ inst.out = inst.arg;
3082
+ inst.arg = tempOut;
3083
+ const tempMatch = matchOut;
3084
+ matchOut = matchArg;
3085
+ matchArg = tempMatch;
3086
+ }
3087
+ if (matchOut) {
3088
+ m[pc] = true;
3089
+ inst.op = Inst.ALT_MATCH;
3090
+ }
3091
+ const leftRunes = onePassRunes[inst.out] || [];
3092
+ const rightRunes = onePassRunes[inst.arg] || [];
3093
+ const mergeRes = mergeRuneSets(leftRunes, rightRunes, inst.out, inst.arg);
3094
+ if (!mergeRes) return false;
3095
+ onePassRunes[pc] = mergeRes.merged;
3096
+ inst.next = new Uint32Array(mergeRes.next);
3097
+ break;
3098
+ }
3099
+ case Inst.CAPTURE:
3100
+ case Inst.EMPTY_WIDTH:
3101
+ case Inst.NOP:
3102
+ {
3103
+ ok = check(inst.out);
3104
+ m[pc] = m[inst.out];
3105
+ onePassRunes[pc] = onePassRunes[inst.out] ? onePassRunes[inst.out].slice() : [];
3106
+ inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
3107
+ break;
3108
+ }
3109
+ case Inst.MATCH:
3110
+ case Inst.FAIL:
3111
+ {
3112
+ m[pc] = inst.op === Inst.MATCH;
3113
+ break;
3114
+ }
3115
+ case Inst.RUNE:
3116
+ {
3117
+ m[pc] = false;
3118
+ if (inst.next && inst.next.length > 0) break;
3119
+ instQueue.insert(inst.out);
3120
+ if (!inst.runes || inst.runes.length === 0) {
3121
+ onePassRunes[pc] = [];
3122
+ inst.next = new Uint32Array([inst.out]);
3123
+ break;
3124
+ }
3125
+ let runes = [];
3126
+ if (inst.runes.length === 1 && (inst.arg & RE2Flags.FOLD_CASE) !== 0) {
3127
+ const r0 = inst.runes[0];
3128
+ runes.push(r0, r0);
3129
+ for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
3130
+ runes.push(r1, r1);
3131
+ }
3132
+ runes.sort((a, b) => a - b);
3133
+ } else {
3134
+ runes.push(...inst.runes);
3135
+ }
3136
+ onePassRunes[pc] = runes;
3137
+ inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
3138
+ inst.op = Inst.RUNE;
3139
+ break;
3140
+ }
3141
+ case Inst.RUNE1:
3142
+ {
3143
+ m[pc] = false;
3144
+ if (inst.next && inst.next.length > 0) break;
3145
+ instQueue.insert(inst.out);
3146
+ let runes = [];
3147
+ if ((inst.arg & RE2Flags.FOLD_CASE) !== 0) {
3148
+ const r0 = inst.runes[0];
3149
+ runes.push(r0, r0);
3150
+ for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
3151
+ runes.push(r1, r1);
3152
+ }
3153
+ runes.sort((a, b) => a - b);
3154
+ } else {
3155
+ runes.push(inst.runes[0], inst.runes[0]);
3156
+ }
3157
+ onePassRunes[pc] = runes;
3158
+ inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
3159
+ inst.op = Inst.RUNE;
3160
+ break;
3161
+ }
3162
+ case Inst.RUNE_ANY:
3163
+ {
3164
+ m[pc] = false;
3165
+ if (inst.next && inst.next.length > 0) break;
3166
+ instQueue.insert(inst.out);
3167
+ onePassRunes[pc] = [0, Unicode.MAX_RUNE];
3168
+ inst.next = new Uint32Array([inst.out]);
3169
+ break;
3170
+ }
3171
+ case Inst.RUNE_ANY_NOT_NL:
3172
+ {
3173
+ m[pc] = false;
3174
+ if (inst.next && inst.next.length > 0) break;
3175
+ instQueue.insert(inst.out);
3176
+ onePassRunes[pc] = [0, 9, 11, Unicode.MAX_RUNE]; // \n is 10
3177
+ inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
3178
+ break;
3179
+ }
3180
+ }
3181
+ return ok;
3182
+ };
3183
+ instQueue.clear();
3184
+ instQueue.insert(p.start);
3185
+ while (!instQueue.empty()) {
3186
+ visitQueue.clear();
3187
+ const pc = instQueue.next();
3188
+ if (!check(pc)) return null;
3189
+ }
3190
+ for (let i = 0; i < p.inst.length; i++) {
3191
+ if (onePassRunes[i]) p.inst[i].runes = onePassRunes[i];
3192
+ }
3193
+ return p;
3194
+ };
3195
+ const cleanupOnePass = (p, original) => {
3196
+ for (let ix = 0; ix < original.inst.length; ix++) {
3197
+ const instOriginal = original.inst[ix];
3198
+ switch (instOriginal.op) {
3199
+ case Inst.ALT:
3200
+ case Inst.ALT_MATCH:
3201
+ case Inst.RUNE:
3202
+ break;
3203
+ case Inst.CAPTURE:
3204
+ case Inst.EMPTY_WIDTH:
3205
+ case Inst.NOP:
3206
+ case Inst.MATCH:
3207
+ case Inst.FAIL:
3208
+ p.inst[ix].next = null;
3209
+ break;
3210
+ case Inst.RUNE1:
3211
+ case Inst.RUNE_ANY:
3212
+ case Inst.RUNE_ANY_NOT_NL:
3213
+ p.inst[ix].next = null;
3214
+ p.inst[ix].op = instOriginal.op;
3215
+ p.inst[ix].runes = instOriginal.runes ? instOriginal.runes.slice() : [];
3216
+ break;
3217
+ }
3218
+ }
3219
+ };
3220
+ class OnePass {
3221
+ static compile(prog) {
3222
+ if (prog.start === 0) return null;
3223
+ const startInst = prog.inst[prog.start];
3224
+ // onepass regexps must be strictly anchored
3225
+ if (startInst.op !== Inst.EMPTY_WIDTH || (startInst.arg & Utils.EMPTY_BEGIN_TEXT) === 0) {
3226
+ return null;
2277
3227
  }
2278
- const nextState = this.getState(nextPCs);
2279
-
2280
- // Cache the result
2281
- if (anchor === RE2Flags.UNANCHORED && charCode <= Unicode.MAX_ASCII) {
2282
- state.nextAscii[charCode] = nextState;
2283
- } else {
2284
- const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
2285
- state.nextMap.set(key, nextState);
3228
+ let hasAlt = false;
3229
+ for (let i = 0; i < prog.inst.length; i++) {
3230
+ if (prog.inst[i].op === Inst.ALT || prog.inst[i].op === Inst.ALT_MATCH) {
3231
+ hasAlt = true;
3232
+ break;
3233
+ }
2286
3234
  }
2287
- return nextState;
2288
- }
2289
-
2290
- // The hot loop: Execute the Lazy DFA
2291
- match(input, pos, anchor) {
2292
- if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2293
- return false;
3235
+ for (let i = 0; i < prog.inst.length; i++) {
3236
+ const inst = prog.inst[i];
3237
+ const opOut = prog.inst[inst.out].op;
3238
+ switch (inst.op) {
3239
+ case Inst.ALT:
3240
+ case Inst.ALT_MATCH:
3241
+ if (opOut === Inst.MATCH || prog.inst[inst.arg].op === Inst.MATCH) {
3242
+ return null;
3243
+ }
3244
+ break;
3245
+ case Inst.EMPTY_WIDTH:
3246
+ if (opOut === Inst.MATCH) {
3247
+ if ((inst.arg & Utils.EMPTY_END_TEXT) === Utils.EMPTY_END_TEXT) {
3248
+ continue;
3249
+ }
3250
+ return null;
3251
+ }
3252
+ break;
3253
+ default:
3254
+ if (opOut === Inst.MATCH && hasAlt) {
3255
+ return null;
3256
+ }
3257
+ break;
3258
+ }
2294
3259
  }
2295
- if (!this.startState) {
2296
- this.startState = this.getState([this.prog.start]);
2297
- if (!this.startState) return null; // Fallback to NFA
3260
+ let p = onePassCopy(prog);
3261
+ p = makeOnePass(p);
3262
+ if (p !== null) {
3263
+ cleanupOnePass(p, prog);
2298
3264
  }
2299
- let endPos = input.endPos();
2300
- let currentState = this.startState;
2301
- if (currentState.isMatch) {
2302
- if (anchor === RE2Flags.ANCHOR_BOTH) {
2303
- if (pos === endPos) return true;
2304
- } else {
2305
- return true;
3265
+ return p;
3266
+ }
3267
+ static next(inst, r) {
3268
+ const nextIdx = inst.matchRunePos(r);
3269
+ if (nextIdx >= 0) return inst.next[nextIdx];
3270
+ if (inst.op === Inst.ALT_MATCH) return inst.out;
3271
+ return 0; // fail
3272
+ }
3273
+ static execute(re2, input, pos, anchor, ncap) {
3274
+ const onepass = re2.onepass;
3275
+ if (!onepass) return null;
3276
+ const matchcap = new Int32Array(ncap).fill(-1);
3277
+ let matched = false;
3278
+ let r = input.step(pos);
3279
+ let rune = r >> 3;
3280
+ let width = r & 7;
3281
+ let r1 = MachineInputBase.EOF();
3282
+ let rune1 = -1;
3283
+ let width1 = 0;
3284
+ if (r !== MachineInputBase.EOF()) {
3285
+ r1 = input.step(pos + width);
3286
+ if (r1 !== MachineInputBase.EOF()) {
3287
+ rune1 = r1 >> 3;
3288
+ width1 = r1 & 7;
2306
3289
  }
2307
3290
  }
2308
- let i = pos;
2309
- while (i < endPos) {
2310
- const r = input.step(i);
2311
- const rune = r >> 3;
2312
- const width = r & 7;
2313
-
2314
- // prevent infinite loop on EOF
2315
- if (width === 0) {
2316
- break;
3291
+ let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
3292
+ let pc = onepass.start;
3293
+ let inst;
3294
+ while (true) {
3295
+ inst = onepass.inst[pc];
3296
+ pc = inst.out;
3297
+ switch (inst.op) {
3298
+ case Inst.MATCH:
3299
+ {
3300
+ matched = true;
3301
+ if (matchcap.length > 0) {
3302
+ matchcap[0] = 0;
3303
+ matchcap[1] = pos;
3304
+ }
3305
+ return ncap === 0 ? [] : Array.from(matchcap);
3306
+ }
3307
+ case Inst.RUNE:
3308
+ if (!inst.matchRune(rune)) return null;
3309
+ break;
3310
+ case Inst.RUNE1:
3311
+ if (rune !== inst.runes[0]) return null;
3312
+ break;
3313
+ case Inst.RUNE_ANY:
3314
+ break;
3315
+ case Inst.RUNE_ANY_NOT_NL:
3316
+ if (rune === 10) return null;
3317
+ break;
3318
+ case Inst.ALT:
3319
+ case Inst.ALT_MATCH:
3320
+ pc = OnePass.next(inst, rune);
3321
+ continue;
3322
+ case Inst.FAIL:
3323
+ return null;
3324
+ case Inst.NOP:
3325
+ continue;
3326
+ case Inst.EMPTY_WIDTH:
3327
+ if ((inst.arg & ~flag) !== 0) return null;
3328
+ continue;
3329
+ case Inst.CAPTURE:
3330
+ if (inst.arg < matchcap.length) {
3331
+ matchcap[inst.arg] = pos;
3332
+ }
3333
+ continue;
3334
+ default:
3335
+ throw new RE2JSInternalException('bad inst');
2317
3336
  }
2318
- currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
2319
-
2320
- // If we hit an unrecoverable DFA error or bailout, signal fallback
2321
- if (currentState === null) return null;
2322
- if (currentState.isMatch) {
2323
- if (anchor === RE2Flags.ANCHOR_BOTH) {
2324
- if (i + width === endPos) return true;
3337
+ if (width === 0) break;
3338
+ flag = Utils.emptyOpContext(rune, rune1);
3339
+ pos += width;
3340
+ rune = rune1;
3341
+ width = width1;
3342
+ if (rune !== -1) {
3343
+ r1 = input.step(pos + width);
3344
+ if (r1 !== MachineInputBase.EOF()) {
3345
+ rune1 = r1 >> 3;
3346
+ width1 = r1 & 7;
2325
3347
  } else {
2326
- return true;
3348
+ rune1 = -1;
3349
+ width1 = 0;
2327
3350
  }
2328
3351
  }
2329
-
2330
- // If we hit a dead end, and anchored, fail early
2331
- if (currentState.nfaStates.length === 0) {
2332
- if (anchor !== RE2Flags.UNANCHORED) return false;
2333
- }
2334
- i += width;
2335
3352
  }
2336
- return false;
3353
+ if (!matched) return null;
3354
+ return ncap === 0 ? [] : Array.from(matchcap);
2337
3355
  }
2338
3356
  }
2339
3357
 
@@ -2418,7 +3436,7 @@ class Regexp {
2418
3436
  this.max = 0; // max for REPEAT
2419
3437
  this.cap = 0; // capturing index, for CAPTURE
2420
3438
  this.name = null; // capturing name, for CAPTURE
2421
- this.namedGroups = {}; // map of group name -> capturing index
3439
+ this.namedGroups = Object.create(null); // map of group name -> capturing index
2422
3440
  }
2423
3441
  reinit() {
2424
3442
  this.flags = 0;
@@ -2428,7 +3446,7 @@ class Regexp {
2428
3446
  this.min = 0;
2429
3447
  this.max = 0;
2430
3448
  this.name = null;
2431
- this.namedGroups = {};
3449
+ this.namedGroups = Object.create(null);
2432
3450
  }
2433
3451
  toString() {
2434
3452
  return this.appendTo();
@@ -2688,6 +3706,188 @@ class Regexp {
2688
3706
  }
2689
3707
  }
2690
3708
 
3709
+ class Prefilter {
3710
+ static Type = {
3711
+ NONE: 0,
3712
+ EXACT: 1,
3713
+ AND: 2,
3714
+ OR: 3
3715
+ };
3716
+ constructor(type) {
3717
+ this.type = type;
3718
+ this.subs = [];
3719
+ this.str = '';
3720
+ this.bytes = null;
3721
+ }
3722
+ eval(input, pos) {
3723
+ switch (this.type) {
3724
+ case Prefilter.Type.NONE:
3725
+ return true;
3726
+ case Prefilter.Type.EXACT:
3727
+ return input.hasString(this, pos);
3728
+ case Prefilter.Type.AND:
3729
+ for (let i = 0; i < this.subs.length; i++) {
3730
+ if (!this.subs[i].eval(input, pos)) return false;
3731
+ }
3732
+ return true;
3733
+ case Prefilter.Type.OR:
3734
+ for (let i = 0; i < this.subs.length; i++) {
3735
+ if (this.subs[i].eval(input, pos)) return true;
3736
+ }
3737
+ return false;
3738
+ default:
3739
+ return true;
3740
+ }
3741
+ }
3742
+ }
3743
+ class PrefilterTree {
3744
+ static build(re) {
3745
+ const pf = PrefilterTree.fromRegexp(re);
3746
+ return PrefilterTree.simplify(pf);
3747
+ }
3748
+ static fromRegexp(re) {
3749
+ if (!re) return new Prefilter(Prefilter.Type.NONE);
3750
+ switch (re.op) {
3751
+ case Regexp.Op.NO_MATCH:
3752
+ case Regexp.Op.EMPTY_MATCH:
3753
+ case Regexp.Op.BEGIN_LINE:
3754
+ case Regexp.Op.END_LINE:
3755
+ case Regexp.Op.BEGIN_TEXT:
3756
+ case Regexp.Op.END_TEXT:
3757
+ case Regexp.Op.WORD_BOUNDARY:
3758
+ case Regexp.Op.NO_WORD_BOUNDARY:
3759
+ case Regexp.Op.CHAR_CLASS:
3760
+ case Regexp.Op.ANY_CHAR_NOT_NL:
3761
+ case Regexp.Op.ANY_CHAR:
3762
+ {
3763
+ return new Prefilter(Prefilter.Type.NONE);
3764
+ }
3765
+ case Regexp.Op.LITERAL:
3766
+ {
3767
+ if (re.runes.length === 0 || (re.flags & RE2Flags.FOLD_CASE) !== 0) {
3768
+ // Skip case-folded literals for simplicity
3769
+ return new Prefilter(Prefilter.Type.NONE);
3770
+ }
3771
+ const pf = new Prefilter(Prefilter.Type.EXACT);
3772
+ let str = '';
3773
+ for (let i = 0; i < re.runes.length; i++) {
3774
+ str += String.fromCodePoint(re.runes[i]);
3775
+ }
3776
+ pf.str = str;
3777
+ pf.bytes = Utils.stringToUtf8ByteArray(pf.str);
3778
+ return pf;
3779
+ }
3780
+ case Regexp.Op.CAPTURE:
3781
+ case Regexp.Op.PLUS:
3782
+ {
3783
+ return PrefilterTree.fromRegexp(re.subs[0]);
3784
+ }
3785
+ case Regexp.Op.REPEAT:
3786
+ {
3787
+ if (re.min >= 1) {
3788
+ return PrefilterTree.fromRegexp(re.subs[0]);
3789
+ }
3790
+ return new Prefilter(Prefilter.Type.NONE);
3791
+ }
3792
+ case Regexp.Op.CONCAT:
3793
+ {
3794
+ const pf = new Prefilter(Prefilter.Type.AND);
3795
+ for (const sub of re.subs) {
3796
+ pf.subs.push(PrefilterTree.fromRegexp(sub));
3797
+ }
3798
+ return pf;
3799
+ }
3800
+ case Regexp.Op.ALTERNATE:
3801
+ {
3802
+ const pf = new Prefilter(Prefilter.Type.OR);
3803
+ for (const sub of re.subs) {
3804
+ pf.subs.push(PrefilterTree.fromRegexp(sub));
3805
+ }
3806
+ return pf;
3807
+ }
3808
+ default:
3809
+ return new Prefilter(Prefilter.Type.NONE);
3810
+ }
3811
+ }
3812
+ static simplify(pf) {
3813
+ if (pf.type === Prefilter.Type.EXACT || pf.type === Prefilter.Type.NONE) {
3814
+ return pf;
3815
+ }
3816
+ if (pf.type === Prefilter.Type.AND) {
3817
+ const newSubs = [];
3818
+ for (const sub of pf.subs) {
3819
+ const s = PrefilterTree.simplify(sub);
3820
+ if (s.type !== Prefilter.Type.NONE) {
3821
+ if (s.type === Prefilter.Type.AND) {
3822
+ newSubs.push(...s.subs);
3823
+ } else {
3824
+ newSubs.push(s);
3825
+ }
3826
+ }
3827
+ }
3828
+ if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
3829
+ if (newSubs.length === 1) return newSubs[0];
3830
+ pf.subs = newSubs;
3831
+ return pf;
3832
+ }
3833
+ if (pf.type === Prefilter.Type.OR) {
3834
+ const newSubs = [];
3835
+ for (const sub of pf.subs) {
3836
+ const s = PrefilterTree.simplify(sub);
3837
+ if (s.type === Prefilter.Type.NONE) {
3838
+ // If any branch of an OR has no requirements, the whole OR has no requirements
3839
+ return new Prefilter(Prefilter.Type.NONE);
3840
+ }
3841
+ if (s.type === Prefilter.Type.OR) {
3842
+ newSubs.push(...s.subs);
3843
+ } else {
3844
+ newSubs.push(s);
3845
+ }
3846
+ }
3847
+ if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
3848
+ if (newSubs.length === 1) return newSubs[0];
3849
+
3850
+ // De-duplicate EXACT branches
3851
+ const seen = new Set();
3852
+ const uniqueSubs = [];
3853
+ for (const sub of newSubs) {
3854
+ if (sub.type === Prefilter.Type.EXACT) {
3855
+ if (!seen.has(sub.str)) {
3856
+ seen.add(sub.str);
3857
+ uniqueSubs.push(sub);
3858
+ }
3859
+ } else {
3860
+ uniqueSubs.push(sub);
3861
+ }
3862
+ }
3863
+ pf.subs = uniqueSubs;
3864
+ return pf;
3865
+ }
3866
+ return pf;
3867
+ }
3868
+ }
3869
+
3870
+ /**
3871
+ * A list of instruction pointers waiting to be patched.
3872
+ * Tracks both `head` and `tail` to allow O(1) appending during compilation.
3873
+ * * Values are encoded integers, not standard memory pointers:
3874
+ * - Program instruction index: `l >> 1`
3875
+ * - Patch `.out` field if: `(l & 1) === 0`
3876
+ * - Patch `.arg` field if: `(l & 1) === 1`
3877
+ * - `0` denotes an empty list.
3878
+ * * @see https://swtch.com/~rsc/regexp/regexp1.html
3879
+ */
3880
+ class PatchList {
3881
+ /**
3882
+ * @param {number} head - Encoded pointer to the start of the patch list.
3883
+ * @param {number} tail - Encoded pointer to the end of the patch list.
3884
+ */
3885
+ constructor(head = 0, tail = 0) {
3886
+ this.head = head;
3887
+ this.tail = tail;
3888
+ }
3889
+ }
3890
+
2691
3891
  /**
2692
3892
  * A Prog is a compiled regular expression program.
2693
3893
  */
@@ -2789,39 +3989,30 @@ class Prog {
2789
3989
  return i.arg;
2790
3990
  }
2791
3991
  patch(l, val) {
2792
- while (l !== 0) {
2793
- const i = this.inst[l >> 1];
2794
- if ((l & 1) === 0) {
2795
- l = i.out;
3992
+ let head = l.head;
3993
+ while (head !== 0) {
3994
+ const i = this.inst[head >> 1];
3995
+ if ((head & 1) === 0) {
3996
+ head = i.out;
2796
3997
  i.out = val;
2797
3998
  } else {
2798
- l = i.arg;
3999
+ head = i.arg;
2799
4000
  i.arg = val;
2800
4001
  }
2801
4002
  }
2802
4003
  }
2803
4004
  append(l1, l2) {
2804
- if (l1 === 0) {
2805
- return l2;
2806
- }
2807
- if (l2 === 0) {
2808
- return l1;
2809
- }
2810
- let last = l1;
2811
- for (;;) {
2812
- const next = this.next(last);
2813
- if (next === 0) {
2814
- break;
2815
- }
2816
- last = next;
2817
- }
2818
- const i = this.inst[last >> 1];
2819
- if ((last & 1) === 0) {
2820
- i.out = l2;
4005
+ if (l1.head === 0) return l2;
4006
+ if (l2.head === 0) return l1;
4007
+
4008
+ // We know exactly where the tail is
4009
+ const i = this.inst[l1.tail >> 1];
4010
+ if ((l1.tail & 1) === 0) {
4011
+ i.out = l2.head;
2821
4012
  } else {
2822
- i.arg = l2;
4013
+ i.arg = l2.head;
2823
4014
  }
2824
- return l1;
4015
+ return new PatchList(l1.head, l2.tail);
2825
4016
  }
2826
4017
  /**
2827
4018
  *
@@ -2850,7 +4041,7 @@ class Prog {
2850
4041
  * @class
2851
4042
  */
2852
4043
  class Frag {
2853
- constructor(i = 0, out = 0, nullable = false) {
4044
+ constructor(i = 0, out = new PatchList(), nullable = false) {
2854
4045
  this.i = i; // an instruction address (pc).
2855
4046
  this.out = out; // a patch list; see explanation in Prog.js
2856
4047
  this.nullable = nullable; // whether the fragment can match the empty string
@@ -2875,6 +4066,33 @@ class Compiler {
2875
4066
  c.prog.start = f.i;
2876
4067
  return c.prog;
2877
4068
  }
4069
+ static compileSet(regexps) {
4070
+ const c = new Compiler();
4071
+ if (regexps.length === 0) {
4072
+ c.prog.start = c.newInst(Inst.FAIL).i;
4073
+ return c.prog;
4074
+ }
4075
+ let starts = [];
4076
+ for (let i = 0; i < regexps.length; i++) {
4077
+ const f = c.compile(regexps[i]);
4078
+ const m = c.newInst(Inst.MATCH);
4079
+ c.prog.getInst(m.i).arg = i; // Store the regex index
4080
+ c.prog.patch(f.out, m.i);
4081
+ starts.push(f.i);
4082
+ }
4083
+
4084
+ // Link starts together via ALT
4085
+ let start = starts[0];
4086
+ for (let i = 1; i < starts.length; i++) {
4087
+ const f = c.newInst(Inst.ALT);
4088
+ const inst = c.prog.getInst(f.i);
4089
+ inst.out = start;
4090
+ inst.arg = starts[i];
4091
+ start = f.i;
4092
+ }
4093
+ c.prog.start = start;
4094
+ return c.prog;
4095
+ }
2878
4096
  constructor() {
2879
4097
  this.prog = new Prog();
2880
4098
  this.newInst(Inst.FAIL);
@@ -2887,7 +4105,7 @@ class Compiler {
2887
4105
  // Returns a no-op fragment. Sometimes unavoidable.
2888
4106
  nop() {
2889
4107
  const f = this.newInst(Inst.NOP);
2890
- f.out = f.i << 1;
4108
+ f.out = new PatchList(f.i << 1, f.i << 1);
2891
4109
  return f;
2892
4110
  }
2893
4111
  fail() {
@@ -2898,7 +4116,7 @@ class Compiler {
2898
4116
  // Given a fragment a, returns a fragment with capturing parens around a.
2899
4117
  cap(arg) {
2900
4118
  const f = this.newInst(Inst.CAPTURE);
2901
- f.out = f.i << 1;
4119
+ f.out = new PatchList(f.i << 1, f.i << 1);
2902
4120
  this.prog.getInst(f.i).arg = arg;
2903
4121
  if (this.prog.numCap < arg + 1) {
2904
4122
  this.prog.numCap = arg + 1;
@@ -2946,10 +4164,10 @@ class Compiler {
2946
4164
  const i = this.prog.getInst(f.i);
2947
4165
  if (nongreedy) {
2948
4166
  i.arg = f1.i;
2949
- f.out = f.i << 1;
4167
+ f.out = new PatchList(f.i << 1, f.i << 1);
2950
4168
  } else {
2951
4169
  i.out = f1.i;
2952
- f.out = f.i << 1 | 1;
4170
+ f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
2953
4171
  }
2954
4172
  this.prog.patch(f1.out, f.i);
2955
4173
  return f;
@@ -2961,10 +4179,10 @@ class Compiler {
2961
4179
  const i = this.prog.getInst(f.i);
2962
4180
  if (nongreedy) {
2963
4181
  i.arg = f1.i;
2964
- f.out = f.i << 1;
4182
+ f.out = new PatchList(f.i << 1, f.i << 1);
2965
4183
  } else {
2966
4184
  i.out = f1.i;
2967
- f.out = f.i << 1 | 1;
4185
+ f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
2968
4186
  }
2969
4187
  f.out = this.prog.append(f.out, f1.out);
2970
4188
  return f;
@@ -2987,7 +4205,7 @@ class Compiler {
2987
4205
  empty(op) {
2988
4206
  const f = this.newInst(Inst.EMPTY_WIDTH);
2989
4207
  this.prog.getInst(f.i).arg = op;
2990
- f.out = f.i << 1;
4208
+ f.out = new PatchList(f.i << 1, f.i << 1);
2991
4209
  return f;
2992
4210
  }
2993
4211
 
@@ -3002,7 +4220,7 @@ class Compiler {
3002
4220
  flags &= -2;
3003
4221
  }
3004
4222
  i.arg = flags;
3005
- f.out = f.i << 1;
4223
+ f.out = new PatchList(f.i << 1, f.i << 1);
3006
4224
  if ((flags & RE2Flags.FOLD_CASE) === 0 && runes.length === 1 || runes.length === 2 && runes[0] === runes[1]) {
3007
4225
  i.op = Inst.RUNE1;
3008
4226
  } else if (runes.length === 2 && runes[0] === 0 && runes[1] === Unicode.MAX_RUNE) {
@@ -3107,23 +4325,92 @@ class Simplify {
3107
4325
  }
3108
4326
  switch (re.op) {
3109
4327
  case Regexp.Op.CAPTURE:
4328
+ {
4329
+ const sub = Simplify.simplify(re.subs[0]);
4330
+ if (sub !== re.subs[0]) {
4331
+ const nre = Regexp.fromRegexp(re);
4332
+ nre.runes = [];
4333
+ nre.subs = [sub];
4334
+ return nre;
4335
+ }
4336
+ return re;
4337
+ }
3110
4338
  case Regexp.Op.CONCAT:
3111
4339
  case Regexp.Op.ALTERNATE:
3112
4340
  {
3113
- let nre = re;
4341
+ const newSubs = [];
4342
+ let changed = false;
3114
4343
  for (let i = 0; i < re.subs.length; i++) {
3115
4344
  const sub = re.subs[i];
3116
4345
  const nsub = Simplify.simplify(sub);
3117
- if (nre === re && nsub !== sub) {
3118
- nre = Regexp.fromRegexp(re);
3119
- nre.runes = [];
3120
- nre.subs = re.subs.slice(0, re.subs.length);
4346
+ if (nsub !== sub) {
4347
+ changed = true;
4348
+ }
4349
+ if (re.op === Regexp.Op.CONCAT) {
4350
+ // If any part of a CONCAT is mathematically impossible,
4351
+ // the entire CONCAT sequence becomes impossible.
4352
+ if (nsub.op === Regexp.Op.NO_MATCH) {
4353
+ return new Regexp(Regexp.Op.NO_MATCH);
4354
+ }
4355
+ // Drop empty 0-width match nodes entirely from sequences
4356
+ if (nsub.op === Regexp.Op.EMPTY_MATCH) {
4357
+ changed = true;
4358
+ continue;
4359
+ }
4360
+ // Flatten nested concatenations
4361
+ if (nsub.op === Regexp.Op.CONCAT) {
4362
+ changed = true;
4363
+ newSubs.push(...nsub.subs);
4364
+ continue;
4365
+ }
4366
+ } else if (re.op === Regexp.Op.ALTERNATE) {
4367
+ // Drop impossible branches from alternations
4368
+ if (nsub.op === Regexp.Op.NO_MATCH) {
4369
+ changed = true;
4370
+ continue;
4371
+ }
4372
+ // Flatten nested alternations
4373
+ if (nsub.op === Regexp.Op.ALTERNATE) {
4374
+ changed = true;
4375
+ newSubs.push(...nsub.subs);
4376
+ continue;
4377
+ }
4378
+ }
4379
+ newSubs.push(nsub);
4380
+ }
4381
+ if (changed) {
4382
+ // If we filtered out all nodes, return the mathematically correct fallback
4383
+ if (newSubs.length === 0) {
4384
+ return new Regexp(re.op === Regexp.Op.CONCAT ? Regexp.Op.EMPTY_MATCH : Regexp.Op.NO_MATCH);
3121
4385
  }
3122
- if (nre !== re) {
3123
- nre.subs[i] = nsub;
4386
+ // If only 1 node remains, we don't need a CONCAT/ALT container at all
4387
+ if (newSubs.length === 1) {
4388
+ return newSubs[0];
3124
4389
  }
4390
+ const nre = Regexp.fromRegexp(re);
4391
+ nre.runes = [];
4392
+ nre.subs = newSubs;
4393
+ return nre;
4394
+ }
4395
+ return re;
4396
+ }
4397
+ case Regexp.Op.CHAR_CLASS:
4398
+ {
4399
+ if (re.runes === null) return re;
4400
+
4401
+ // Empty character classes match nothing.
4402
+ if (re.runes.length === 0) {
4403
+ return new Regexp(Regexp.Op.NO_MATCH);
4404
+ }
4405
+ // Full character classes match everything.
4406
+ if (re.runes.length === 2 && re.runes[0] === 0 && re.runes[1] === Unicode.MAX_RUNE) {
4407
+ return new Regexp(Regexp.Op.ANY_CHAR);
4408
+ }
4409
+ // Standard catch-all except newline
4410
+ if (re.runes.length === 4 && re.runes[0] === 0 && re.runes[1] === Codepoint.CODES.get('\n') - 1 && re.runes[2] === Codepoint.CODES.get('\n') + 1 && re.runes[3] === Unicode.MAX_RUNE) {
4411
+ return new Regexp(Regexp.Op.ANY_CHAR_NOT_NL);
3125
4412
  }
3126
- return nre;
4413
+ return re;
3127
4414
  }
3128
4415
  case Regexp.Op.STAR:
3129
4416
  case Regexp.Op.PLUS:
@@ -3160,7 +4447,9 @@ class Simplify {
3160
4447
  }
3161
4448
  subs.push(Simplify.simplify1(Regexp.Op.PLUS, re.flags, sub, null));
3162
4449
  nre.subs = subs.slice(0);
3163
- return nre;
4450
+
4451
+ // Ensure newly created CONCAT is properly flattened
4452
+ return Simplify.simplify(nre);
3164
4453
  }
3165
4454
  // Special case x{0} handled above.
3166
4455
 
@@ -3198,7 +4487,8 @@ class Simplify {
3198
4487
  if (prefixSubs !== null) {
3199
4488
  const prefix = new Regexp(Regexp.Op.CONCAT);
3200
4489
  prefix.subs = prefixSubs.slice(0);
3201
- return prefix;
4490
+ // Ensure newly created CONCAT is properly flattened
4491
+ return Simplify.simplify(prefix);
3202
4492
  }
3203
4493
 
3204
4494
  // Some degenerate case like min > max or min < max < 0.
@@ -3231,6 +4521,13 @@ class Simplify {
3231
4521
  return sub;
3232
4522
  }
3233
4523
 
4524
+ // Handle impossible targets gracefully.
4525
+ // e.g. Trying to match "NO_MATCH" 0 or 1 times (QUEST/STAR) evaluates to EMPTY_MATCH.
4526
+ if (sub.op === Regexp.Op.NO_MATCH) {
4527
+ if (op === Regexp.Op.PLUS) return sub; // 1+ times is impossible
4528
+ return new Regexp(Regexp.Op.EMPTY_MATCH);
4529
+ }
4530
+
3234
4531
  // The operators are idempotent if the flags match.
3235
4532
  if (op === sub.op && (flags & RE2Flags.NON_GREEDY) === (sub.flags & RE2Flags.NON_GREEDY)) {
3236
4533
  return sub;
@@ -3238,10 +4535,10 @@ class Simplify {
3238
4535
  if (re !== null && re.op === op && (re.flags & RE2Flags.NON_GREEDY) === (flags & RE2Flags.NON_GREEDY) && sub === re.subs[0]) {
3239
4536
  return re;
3240
4537
  }
3241
- re = new Regexp(op);
3242
- re.flags = flags;
3243
- re.subs = [sub];
3244
- return re;
4538
+ const nre = new Regexp(op);
4539
+ nre.flags = flags;
4540
+ nre.subs = [sub];
4541
+ return nre;
3245
4542
  }
3246
4543
  }
3247
4544
 
@@ -3587,16 +4884,6 @@ class CharClass {
3587
4884
  }
3588
4885
  }
3589
4886
 
3590
- class Pair {
3591
- static of(first, second) {
3592
- return new Pair(first, second);
3593
- }
3594
- constructor(first, second) {
3595
- this.first = first;
3596
- this.second = second;
3597
- }
3598
- }
3599
-
3600
4887
  // StringIterator: a stream of runes with an opaque cursor, permitting
3601
4888
  // rewinding. The units of the cursor are not specified beyond the
3602
4889
  // fact that ASCII characters are single width. (Cursor positions
@@ -3743,18 +5030,59 @@ class Parser {
3743
5030
  // stride).
3744
5031
  static ANY_TABLE = new UnicodeRangeTable(new Uint32Array([0, Unicode.MAX_RUNE, 1]));
3745
5032
 
5033
+ // Ascii tables
5034
+ static ASCII_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1]));
5035
+ static ASCII_FOLD_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1, 0x017f, 0x017f, 1,
5036
+ // Old English long s (ſ), folds to S/s.
5037
+ 0x212a, 0x212a, 1 // Kelvin K, folds to K/k.
5038
+ ]));
5039
+
3746
5040
  // unicodeTable() returns the Unicode RangeTable identified by name
3747
5041
  // and the table of additional fold-equivalent code points.
3748
5042
  // Returns null if |name| does not identify a Unicode character range.
3749
5043
  static unicodeTable(name) {
3750
5044
  if (name === 'Any') {
3751
- return Pair.of(Parser.ANY_TABLE, Parser.ANY_TABLE);
5045
+ return {
5046
+ tab: Parser.ANY_TABLE,
5047
+ fold: Parser.ANY_TABLE,
5048
+ sign: 1
5049
+ };
5050
+ }
5051
+ if (name === 'Ascii') {
5052
+ return {
5053
+ tab: Parser.ASCII_TABLE,
5054
+ fold: Parser.ASCII_FOLD_TABLE,
5055
+ sign: 1
5056
+ };
5057
+ }
5058
+ if (name === 'Assigned') {
5059
+ // Assigned is the mathematical inversion of Cn (Unassigned)
5060
+ return {
5061
+ tab: UnicodeTables.CATEGORIES.get('Cn'),
5062
+ fold: UnicodeTables.CATEGORIES.get('Cn'),
5063
+ sign: -1
5064
+ };
5065
+ }
5066
+ if (name === 'Lc') {
5067
+ return {
5068
+ tab: UnicodeTables.CATEGORIES.get('LC'),
5069
+ fold: UnicodeTables.FOLD_CATEGORIES.get('LC'),
5070
+ sign: 1
5071
+ };
3752
5072
  }
3753
5073
  if (UnicodeTables.CATEGORIES.has(name)) {
3754
- return Pair.of(UnicodeTables.CATEGORIES.get(name), UnicodeTables.FOLD_CATEGORIES.get(name));
5074
+ return {
5075
+ tab: UnicodeTables.CATEGORIES.get(name),
5076
+ fold: UnicodeTables.FOLD_CATEGORIES.get(name),
5077
+ sign: 1
5078
+ };
3755
5079
  }
3756
5080
  if (UnicodeTables.SCRIPTS.has(name)) {
3757
- return Pair.of(UnicodeTables.SCRIPTS.get(name), UnicodeTables.FOLD_SCRIPT.get(name));
5081
+ return {
5082
+ tab: UnicodeTables.SCRIPTS.get(name),
5083
+ fold: UnicodeTables.FOLD_SCRIPT.get(name),
5084
+ sign: 1
5085
+ };
3758
5086
  }
3759
5087
  return null;
3760
5088
  }
@@ -4063,7 +5391,7 @@ class Parser {
4063
5391
  this.flags = flags;
4064
5392
  // number of capturing groups seen
4065
5393
  this.numCap = 0;
4066
- this.namedGroups = {};
5394
+ this.namedGroups = Object.create(null);
4067
5395
  // Stack of parsed expressions.
4068
5396
  this.stack = [];
4069
5397
  this.free = null;
@@ -4474,8 +5802,9 @@ class Parser {
4474
5802
  let i = 0;
4475
5803
  for (let sub of subs) {
4476
5804
  if (sub.op === op) {
4477
- newsubs.splice(i, sub.subs.length, ...sub.subs);
4478
- i += sub.subs.length;
5805
+ for (let j = 0; j < sub.subs.length; j++) {
5806
+ newsubs[i++] = sub.subs[j];
5807
+ }
4479
5808
  this.reuse(sub);
4480
5809
  } else {
4481
5810
  newsubs[i++] = sub;
@@ -4906,9 +6235,11 @@ class Parser {
4906
6235
  const i = lit.indexOf('\\E');
4907
6236
  if (i >= 0) {
4908
6237
  lit = lit.substring(0, i);
6238
+ t.skipString(lit);
6239
+ t.skipString('\\E');
6240
+ } else {
6241
+ t.skipString(lit);
4909
6242
  }
4910
- t.skipString(lit);
4911
- t.skipString('\\E');
4912
6243
  let j = 0;
4913
6244
  while (j < lit.length) {
4914
6245
  const codepoint = lit.codePointAt(j);
@@ -4924,6 +6255,9 @@ class Parser {
4924
6255
  t.rewindTo(savedPos);
4925
6256
  break;
4926
6257
  }
6258
+ } else {
6259
+ // Unconditionally rewind if PERL_X is off, or if string ended abruptly
6260
+ t.rewindTo(savedPos);
4927
6261
  }
4928
6262
  const re = this.newRegexp(Regexp.Op.CHAR_CLASS);
4929
6263
  re.flags = this.flags;
@@ -5249,8 +6583,11 @@ class Parser {
5249
6583
  if (pair === null) {
5250
6584
  throw new RE2JSSyntaxException(Parser.ERR_INVALID_CHAR_RANGE, t.from(startPos));
5251
6585
  }
5252
- const tab = pair.first;
5253
- const fold = pair.second; // fold-equivalent table
6586
+ if (pair.sign < 0) {
6587
+ sign = 0 - sign;
6588
+ }
6589
+ const tab = pair.tab;
6590
+ const fold = pair.fold; // fold-equivalent table
5254
6591
  // Variation of CharClass.appendGroup() for tables.
5255
6592
  if ((this.flags & RE2Flags.FOLD_CASE) === 0 || fold === null) {
5256
6593
  cc.appendTableWithSign(tab, sign);
@@ -5394,6 +6731,7 @@ class RE2 {
5394
6731
  res.prefixUTF8 = re2.prefixUTF8;
5395
6732
  res.prefixComplete = re2.prefixComplete;
5396
6733
  res.prefixRune = re2.prefixRune;
6734
+ res.prefilter = re2.prefilter;
5397
6735
  return res;
5398
6736
  }
5399
6737
 
@@ -5436,8 +6774,10 @@ class RE2 {
5436
6774
  let re = Parser.parse(expr, mode);
5437
6775
  const maxCap = re.maxCap();
5438
6776
  re = Simplify.simplify(re);
6777
+ const prefilter = PrefilterTree.build(re);
5439
6778
  const prog = Compiler.compileRegexp(re);
5440
6779
  const re2 = new RE2(expr, prog, maxCap, longest);
6780
+ re2.prefilter = prefilter.type === Prefilter.Type.NONE ? null : prefilter;
5441
6781
  const [prefixCompl, prefixStr] = prog.prefix();
5442
6782
  re2.prefixComplete = prefixCompl;
5443
6783
  re2.prefix = prefixStr;
@@ -5469,12 +6809,78 @@ class RE2 {
5469
6809
  this.prefixComplete = false; // true if prefix is the entire regexp
5470
6810
  this.prefixRune = 0; // first rune in prefix
5471
6811
  this.pooled = new AtomicReference(); // Cache of machines for running regexp. Forms a Treiber stack.
5472
- this.dfa = new DFA(prog); // Initialize the Lazy DFA
6812
+ this.dfa = new DFA(this.prog); // initialize Lazy DFA
6813
+ this.onepass = OnePass.compile(this.prog); // compile OnePass
6814
+ this.prefilter = null;
6815
+ }
6816
+ matchPrefixComplete(input, pos, anchor, ncap) {
6817
+ // If strictly anchored, execution must start at 0
6818
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
6819
+ return null;
6820
+ }
6821
+ let matchStart = -1;
6822
+ let matchEnd = -1;
6823
+ const pLen = input.prefixLength(this);
6824
+ if (anchor === RE2Flags.UNANCHORED) {
6825
+ const idx = input.index(this, pos);
6826
+ if (idx < 0) return null;
6827
+ matchStart = pos + idx;
6828
+ matchEnd = matchStart + pLen;
6829
+ } else if (anchor === RE2Flags.ANCHOR_BOTH) {
6830
+ if (input.endPos() !== pLen) return null;
6831
+ const idx = input.index(this, 0);
6832
+ if (idx !== 0) return null;
6833
+ matchStart = 0;
6834
+ matchEnd = pLen;
6835
+ } else if (anchor === RE2Flags.ANCHOR_START) {
6836
+ const idx = input.index(this, 0);
6837
+ if (idx !== 0) return null;
6838
+ matchStart = 0;
6839
+ matchEnd = pLen;
6840
+ }
6841
+ if (matchStart < 0) return null;
6842
+
6843
+ // If captures are requested (e.g. findSubmatch instead of test), populate bounds
6844
+ if (ncap > 0) {
6845
+ const matchcap = new Int32Array(ncap).fill(-1);
6846
+ matchcap[0] = matchStart;
6847
+ matchcap[1] = matchEnd;
6848
+ return Array.from(matchcap);
6849
+ }
6850
+ return []; // Matched successfully, but no capture data requested
5473
6851
  }
5474
6852
  executeEngine(input, pos, anchor, ncap) {
6853
+ // LITERAL FAST PATH
6854
+ // If the entire regex is just a literal string (and no nested capture boundaries are requested),
6855
+ // bypass all state machines and execute via V8's blistering fast native indexOf
6856
+ if (this.prefixComplete && (ncap === 0 || this.numSubexp === 0)) {
6857
+ return this.matchPrefixComplete(input, pos, anchor, ncap);
6858
+ }
6859
+
6860
+ // PREFILTER FAST PATH
6861
+ // If the unanchored query requires specific literal strings (e.g. "a.*b"),
6862
+ // verify those strings exist using high-speed JS string searches before waking up the state engines.
6863
+ if (this.prefilter !== null && anchor === RE2Flags.UNANCHORED) {
6864
+ if (!this.prefilter.eval(input, pos)) {
6865
+ return null;
6866
+ }
6867
+ }
6868
+
6869
+ // FAST PATH: OnePass DFA engine.
6870
+ // If compiled successfully, it perfectly supports capture groups
6871
+ // and is blisteringly fast since it skips thread queues completely.
6872
+ if (this.onepass !== null) {
6873
+ return OnePass.execute(this, input, pos, anchor, ncap);
6874
+ }
6875
+
5475
6876
  // If the user wants capturing groups (ncap > 0), the DFA mathematically CANNOT do it.
5476
6877
  // We must use the NFA.
5477
6878
  if (ncap > 0) {
6879
+ // Backtracker bit-state execution bounds check
6880
+ if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
6881
+ return Backtracker.execute(this, input, pos, anchor, ncap);
6882
+ }
6883
+ // NFA execution
5478
6884
  return this.doExecuteNFA(input, pos, anchor, ncap);
5479
6885
  }
5480
6886
  const dfaResult = this.dfa.match(input, pos, anchor);
@@ -5483,6 +6889,11 @@ class RE2 {
5483
6889
  return dfaResult ? [] : null; // Return empty array to signify "matched but no captures"
5484
6890
  }
5485
6891
 
6892
+ // Backtracker bit-state execution bounds check
6893
+ if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
6894
+ return Backtracker.execute(this, input, pos, anchor, ncap);
6895
+ }
6896
+
5486
6897
  // Fallback to NFA
5487
6898
  return this.doExecuteNFA(input, pos, anchor, ncap);
5488
6899
  }
@@ -6063,6 +7474,50 @@ class RE2 {
6063
7474
  }
6064
7475
  }
6065
7476
 
7477
+ class RE2Set {
7478
+ constructor(anchor = RE2Flags.UNANCHORED, flags = RE2Flags.PERL) {
7479
+ this.anchor = anchor;
7480
+ this.flags = flags;
7481
+ this.regexps = [];
7482
+ this.prog = null;
7483
+ this.dfa = null;
7484
+ this.dummyRe2 = null;
7485
+ }
7486
+ add(pattern) {
7487
+ if (this.prog) {
7488
+ throw new RE2JSCompileException('Cannot add patterns after compile');
7489
+ }
7490
+ const re = Parser.parse(pattern, this.flags);
7491
+ this.regexps.push(Simplify.simplify(re));
7492
+ return this.regexps.length - 1;
7493
+ }
7494
+ compile() {
7495
+ if (this.prog) return;
7496
+ this.prog = Compiler.compileSet(this.regexps);
7497
+ this.dfa = new DFA(this.prog);
7498
+ this.dummyRe2 = {
7499
+ prog: this.prog,
7500
+ cond: this.prog.startCond(),
7501
+ prefix: '',
7502
+ prefixRune: 0,
7503
+ longest: false
7504
+ };
7505
+ }
7506
+ match(input) {
7507
+ if (!this.prog) this.compile();
7508
+ const machineInput = Array.isArray(input) ? MachineInput.fromUTF8(input) : MachineInput.fromUTF16(input);
7509
+
7510
+ // Fast path: Try the blistering fast DFA
7511
+ const dfaResult = this.dfa.matchSet(machineInput, 0, this.anchor);
7512
+ if (dfaResult !== null) return dfaResult;
7513
+
7514
+ // Safe Fallback: Handle boundaries (\b) or massive state explosions via NFA
7515
+ const machine = Machine.fromRE2(this.dummyRe2);
7516
+ machine.init(0);
7517
+ return machine.matchSet(machineInput, 0, this.anchor);
7518
+ }
7519
+ }
7520
+
6066
7521
  /**
6067
7522
  * Transform JS regex string to RE2 regex string
6068
7523
  */
@@ -6073,13 +7528,6 @@ class TranslateRegExpString {
6073
7528
  static isHexadecimal(ch) {
6074
7529
  return '0' <= ch && ch <= '9' || 'A' <= ch && ch <= 'F' || 'a' <= ch && ch <= 'f';
6075
7530
  }
6076
- static getUtf8CharSize(ch) {
6077
- const code = ch.charCodeAt(0);
6078
- if (code < 0x80) return 1; // 1-byte (ASCII)
6079
- if (code < 0x800) return 2; // 2-byte
6080
- if (code < 0x10000) return 3; // 3-byte
6081
- return 4; // 4-byte (surrogate pairs, rare characters)
6082
- }
6083
7531
  static translate(data) {
6084
7532
  if (typeof data !== 'string') {
6085
7533
  return data;
@@ -6152,7 +7600,8 @@ class TranslateRegExpString {
6152
7600
  default:
6153
7601
  {
6154
7602
  result += '\\';
6155
- let symSize = TranslateRegExpString.getUtf8CharSize(ch);
7603
+ let cp = data.codePointAt(i + 1);
7604
+ let symSize = Utils.charCount(cp);
6156
7605
  result += data.substring(i + 1, i + 1 + symSize);
6157
7606
  i += symSize + 1;
6158
7607
  continue;
@@ -6172,7 +7621,8 @@ class TranslateRegExpString {
6172
7621
  continue;
6173
7622
  }
6174
7623
  }
6175
- let symSize = TranslateRegExpString.getUtf8CharSize(ch);
7624
+ let cp = data.codePointAt(i);
7625
+ let symSize = Utils.charCount(cp);
6176
7626
  result += data.substring(i, i + symSize);
6177
7627
  i += symSize;
6178
7628
  }
@@ -6529,5 +7979,5 @@ class RE2JS {
6529
7979
  }
6530
7980
  }
6531
7981
 
6532
- export { Matcher, RE2JS, RE2JSCompileException, RE2JSException, RE2JSFlagsException, RE2JSGroupException, RE2JSSyntaxException };
7982
+ export { Matcher, RE2JS, RE2JSCompileException, RE2JSException, RE2JSFlagsException, RE2JSGroupException, RE2JSInternalException, RE2JSSyntaxException, RE2Set };
6533
7983
  //# sourceMappingURL=index.esm.js.map