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
@@ -56,6 +56,23 @@ class RE2Flags {
56
56
  /**
57
57
  * Various constants and helper for unicode codepoints.
58
58
  */
59
+ const ASCII_SIZE = 128;
60
+ const ASCII_TO_UPPER = new Int32Array(ASCII_SIZE);
61
+ const ASCII_TO_LOWER = new Int32Array(ASCII_SIZE);
62
+ for (let i = 0; i < ASCII_SIZE; i++) {
63
+ if (i >= 97 && i <= 122) {
64
+ // a-z
65
+ ASCII_TO_UPPER[i] = i - 32;
66
+ } else {
67
+ ASCII_TO_UPPER[i] = i;
68
+ }
69
+ if (i >= 65 && i <= 90) {
70
+ // A-Z
71
+ ASCII_TO_LOWER[i] = i + 32;
72
+ } else {
73
+ ASCII_TO_LOWER[i] = i;
74
+ }
75
+ }
59
76
  class Codepoint {
60
77
  // codePointAt(0)
61
78
  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]]);
@@ -63,6 +80,7 @@ class Codepoint {
63
80
  // convert unicode codepoint to upper case codepoint
64
81
  // return same codepoint, if cannot do it (or codepoint not have upper variation)
65
82
  static toUpperCase(codepoint) {
83
+ if (codepoint < ASCII_SIZE) return ASCII_TO_UPPER[codepoint];
66
84
  const s = String.fromCodePoint(codepoint).toUpperCase();
67
85
  if (s.length > 1) {
68
86
  return codepoint;
@@ -77,6 +95,7 @@ class Codepoint {
77
95
  // convert unicode codepoint to lower case codepoint
78
96
  // return same codepoint, if cannot do it (or codepoint not have lower variation)
79
97
  static toLowerCase(codepoint) {
98
+ if (codepoint < ASCII_SIZE) return ASCII_TO_LOWER[codepoint];
80
99
  const s = String.fromCodePoint(codepoint).toLowerCase();
81
100
  if (s.length > 1) {
82
101
  return codepoint;
@@ -90,9 +109,10 @@ class Codepoint {
90
109
  }
91
110
 
92
111
  class UnicodeRangeTable {
93
- SIZE = 3;
94
- constructor(data) {
112
+ constructor(data, isStride1 = false) {
95
113
  this.data = data; // A Uint32Array
114
+ this.isStride1 = isStride1;
115
+ this.SIZE = isStride1 ? 2 : 3;
96
116
  }
97
117
 
98
118
  // High-performance getters that do NOT allocate memory
@@ -103,14 +123,11 @@ class UnicodeRangeTable {
103
123
  return this.data[index * this.SIZE + 1];
104
124
  }
105
125
  getStride(index) {
106
- return this.data[index * this.SIZE + 2];
126
+ return this.isStride1 ? 1 : this.data[index * this.SIZE + 2];
107
127
  }
108
-
109
- // Convenience getter (slower, for debugging or non-critical paths)
110
128
  get(index) {
111
129
  const i = index * this.SIZE;
112
- // Returns [lo, hi, stride]
113
- return [this.data[i], this.data[i + 1], this.data[i + 2]];
130
+ return [this.data[i], this.data[i + 1], this.getStride(index)];
114
131
  }
115
132
  get length() {
116
133
  return this.data.length / this.SIZE;
@@ -120,229 +137,317 @@ class UnicodeRangeTable {
120
137
  // GENERATED BY tools/scripts/genUnicodeTable.js; DO NOT EDIT.
121
138
  // yarn node ./tools/scripts/genUnicodeTable.js > src/UnicodeTables.js
122
139
 
140
+ const B64_MAP = new Uint8Array(256);
141
+ for (let i = 0, b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-'; i < 64; i++) {
142
+ B64_MAP[b.charCodeAt(i)] = i;
143
+ }
144
+ const decodeVLQ = str => {
145
+ const res = [];
146
+ let value = 0,
147
+ shift = 0;
148
+ for (let i = 0; i < str.length; i++) {
149
+ let digit = B64_MAP[str.charCodeAt(i)];
150
+ value |= (digit & 0x1f) << shift;
151
+ if ((digit & 0x20) === 0) {
152
+ res.push(value);
153
+ value = 0;
154
+ shift = 0;
155
+ } else {
156
+ shift += 5;
157
+ }
158
+ }
159
+ return res;
160
+ };
161
+ const decodeRanges = (str, isStride1) => {
162
+ const res = decodeVLQ(str);
163
+ const numRanges = isStride1 ? res.length / 2 : res.length / 3;
164
+ const out = new Uint32Array(numRanges * 3);
165
+ let current = 0,
166
+ resIdx = 0;
167
+ for (let i = 0; i < numRanges; i++) {
168
+ current += res[resIdx++];
169
+ out[i * 3] = current;
170
+ current += res[resIdx++];
171
+ out[i * 3 + 1] = current;
172
+ out[i * 3 + 2] = isStride1 ? 1 : res[resIdx++];
173
+ }
174
+ return out;
175
+ };
176
+ const decodeOrbit = str => {
177
+ const res = decodeVLQ(str);
178
+ const map = new Map();
179
+ let currentKey = 0;
180
+ for (let i = 0; i < res.length; i += 2) {
181
+ currentKey += res[i];
182
+ map.set(currentKey, res[i + 1]);
183
+ }
184
+ return map;
185
+ };
186
+ class LazyMap {
187
+ constructor(initializer) {
188
+ this.initializer = initializer;
189
+ this.cache = new Map();
190
+ }
191
+ has(key) {
192
+ return key in this.initializer;
193
+ }
194
+ get(key) {
195
+ if (this.cache.has(key)) return this.cache.get(key);
196
+ const fn = this.initializer[key];
197
+ const val = fn ? fn() : null;
198
+ this.cache.set(key, val);
199
+ return val;
200
+ }
201
+ }
123
202
  class UnicodeTables {
124
- 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]]);
125
- 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]));
126
- static Cc = new UnicodeRangeTable(new Uint32Array([0, 31, 1, 127, 159, 1]));
127
- 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]));
128
- static Co = new UnicodeRangeTable(new Uint32Array([57344, 63743, 1, 983040, 1048573, 1, 1048576, 1114109, 1]));
129
- static Cs = new UnicodeRangeTable(new Uint32Array([55296, 57343, 1]));
130
- 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]));
131
- static foldL = new UnicodeRangeTable(new Uint32Array([837, 837, 1]));
132
- 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]));
133
- 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]));
134
- 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]));
135
- 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]));
136
- 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]));
137
- 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]));
138
- 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]));
139
- static Upper = this.Lu;
140
- 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]));
141
- 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]));
142
- static foldM = new UnicodeRangeTable(new Uint32Array([921, 953, 32, 8126, 8126, 1]));
143
- 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]));
144
- static Me = new UnicodeRangeTable(new Uint32Array([1160, 1161, 1, 6846, 8413, 1567, 8414, 8416, 1, 8418, 8420, 1, 42608, 42610, 1]));
145
- 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]));
146
- static foldMn = new UnicodeRangeTable(new Uint32Array([921, 953, 32, 8126, 8126, 1]));
147
- 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]));
148
- 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]));
149
- 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]));
150
- 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]));
151
- 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]));
152
- static Pc = new UnicodeRangeTable(new Uint32Array([95, 8255, 8160, 8256, 8276, 20, 65075, 65076, 1, 65101, 65103, 1, 65343, 65343, 1]));
153
- 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]));
154
- 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]));
155
- static Pf = new UnicodeRangeTable(new Uint32Array([187, 8217, 8030, 8221, 8250, 29, 11779, 11781, 2, 11786, 11789, 3, 11805, 11809, 4]));
156
- static Pi = new UnicodeRangeTable(new Uint32Array([171, 8216, 8045, 8219, 8220, 1, 8223, 8249, 26, 11778, 11780, 2, 11785, 11788, 3, 11804, 11808, 4]));
157
- 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]));
158
- 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]));
159
- 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]));
160
- 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]));
161
- 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]));
162
- 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]));
163
- 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]));
164
- static Z = new UnicodeRangeTable(new Uint32Array([32, 160, 128, 5760, 8192, 2432, 8193, 8202, 1, 8232, 8233, 1, 8239, 8287, 48, 12288, 12288, 1]));
165
- static Zl = new UnicodeRangeTable(new Uint32Array([8232, 8232, 1]));
166
- static Zp = new UnicodeRangeTable(new Uint32Array([8233, 8233, 1]));
167
- static Zs = new UnicodeRangeTable(new Uint32Array([32, 160, 128, 5760, 8192, 2432, 8193, 8202, 1, 8239, 8287, 48, 12288, 12288, 1]));
168
- static Adlam = new UnicodeRangeTable(new Uint32Array([125184, 125259, 1, 125264, 125273, 1, 125278, 125279, 1]));
169
- static Ahom = new UnicodeRangeTable(new Uint32Array([71424, 71450, 1, 71453, 71467, 1, 71472, 71494, 1]));
170
- static Anatolian_Hieroglyphs = new UnicodeRangeTable(new Uint32Array([82944, 83526, 1]));
171
- 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]));
172
- static Armenian = new UnicodeRangeTable(new Uint32Array([1329, 1366, 1, 1369, 1418, 1, 1421, 1423, 1, 64275, 64279, 1]));
173
- static Avestan = new UnicodeRangeTable(new Uint32Array([68352, 68405, 1, 68409, 68415, 1]));
174
- static Balinese = new UnicodeRangeTable(new Uint32Array([6912, 6988, 1, 6990, 7039, 1]));
175
- static Bamum = new UnicodeRangeTable(new Uint32Array([42656, 42743, 1, 92160, 92728, 1]));
176
- static Bassa_Vah = new UnicodeRangeTable(new Uint32Array([92880, 92909, 1, 92912, 92917, 1]));
177
- static Batak = new UnicodeRangeTable(new Uint32Array([7104, 7155, 1, 7164, 7167, 1]));
178
- 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]));
179
- static Bhaiksuki = new UnicodeRangeTable(new Uint32Array([72704, 72712, 1, 72714, 72758, 1, 72760, 72773, 1, 72784, 72812, 1]));
180
- static Bopomofo = new UnicodeRangeTable(new Uint32Array([746, 747, 1, 12549, 12591, 1, 12704, 12735, 1]));
181
- static Brahmi = new UnicodeRangeTable(new Uint32Array([69632, 69709, 1, 69714, 69749, 1, 69759, 69759, 1]));
182
- static Braille = new UnicodeRangeTable(new Uint32Array([10240, 10495, 1]));
183
- static Buginese = new UnicodeRangeTable(new Uint32Array([6656, 6683, 1, 6686, 6687, 1]));
184
- static Buhid = new UnicodeRangeTable(new Uint32Array([5952, 5971, 1]));
185
- static Canadian_Aboriginal = new UnicodeRangeTable(new Uint32Array([5120, 5759, 1, 6320, 6389, 1, 72368, 72383, 1]));
186
- static Carian = new UnicodeRangeTable(new Uint32Array([66208, 66256, 1]));
187
- static Caucasian_Albanian = new UnicodeRangeTable(new Uint32Array([66864, 66915, 1, 66927, 66927, 1]));
188
- static Chakma = new UnicodeRangeTable(new Uint32Array([69888, 69940, 1, 69942, 69959, 1]));
189
- static Cham = new UnicodeRangeTable(new Uint32Array([43520, 43574, 1, 43584, 43597, 1, 43600, 43609, 1, 43612, 43615, 1]));
190
- static Cherokee = new UnicodeRangeTable(new Uint32Array([5024, 5109, 1, 5112, 5117, 1, 43888, 43967, 1]));
191
- static Chorasmian = new UnicodeRangeTable(new Uint32Array([69552, 69579, 1]));
192
- 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]));
193
- static foldCommon = new UnicodeRangeTable(new Uint32Array([924, 956, 32]));
194
- static Coptic = new UnicodeRangeTable(new Uint32Array([994, 1007, 1, 11392, 11507, 1, 11513, 11519, 1]));
195
- static Cuneiform = new UnicodeRangeTable(new Uint32Array([73728, 74649, 1, 74752, 74862, 1, 74864, 74868, 1, 74880, 75075, 1]));
196
- static Cypriot = new UnicodeRangeTable(new Uint32Array([67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3]));
197
- static Cypro_Minoan = new UnicodeRangeTable(new Uint32Array([77712, 77810, 1]));
198
- 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]));
199
- static Deseret = new UnicodeRangeTable(new Uint32Array([66560, 66639, 1]));
200
- static Devanagari = new UnicodeRangeTable(new Uint32Array([2304, 2384, 1, 2389, 2403, 1, 2406, 2431, 1, 43232, 43263, 1, 72448, 72457, 1]));
201
- 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]));
202
- static Dogra = new UnicodeRangeTable(new Uint32Array([71680, 71739, 1]));
203
- static Duployan = new UnicodeRangeTable(new Uint32Array([113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 113820, 113823, 1]));
204
- static Egyptian_Hieroglyphs = new UnicodeRangeTable(new Uint32Array([77824, 78933, 1, 78944, 82938, 1]));
205
- static Elbasan = new UnicodeRangeTable(new Uint32Array([66816, 66855, 1]));
206
- static Elymaic = new UnicodeRangeTable(new Uint32Array([69600, 69622, 1]));
207
- 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]));
208
- static Garay = new UnicodeRangeTable(new Uint32Array([68928, 68965, 1, 68969, 68997, 1, 69006, 69007, 1]));
209
- 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]));
210
- static Glagolitic = new UnicodeRangeTable(new Uint32Array([11264, 11359, 1, 122880, 122886, 1, 122888, 122904, 1, 122907, 122913, 1, 122915, 122916, 1, 122918, 122922, 1]));
211
- static Gothic = new UnicodeRangeTable(new Uint32Array([66352, 66378, 1]));
212
- 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]));
213
- 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]));
214
- static foldGreek = new UnicodeRangeTable(new Uint32Array([181, 837, 656]));
215
- 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]));
216
- 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]));
217
- 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]));
218
- static Gurung_Khema = new UnicodeRangeTable(new Uint32Array([90368, 90425, 1]));
219
- 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]));
220
- 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]));
221
- static Hanifi_Rohingya = new UnicodeRangeTable(new Uint32Array([68864, 68903, 1, 68912, 68921, 1]));
222
- static Hanunoo = new UnicodeRangeTable(new Uint32Array([5920, 5940, 1]));
223
- static Hatran = new UnicodeRangeTable(new Uint32Array([67808, 67826, 1, 67828, 67829, 1, 67835, 67839, 1]));
224
- 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]));
225
- static Hiragana = new UnicodeRangeTable(new Uint32Array([12353, 12438, 1, 12445, 12447, 1, 110593, 110879, 1, 110898, 110928, 30, 110929, 110930, 1, 127488, 127488, 1]));
226
- static Imperial_Aramaic = new UnicodeRangeTable(new Uint32Array([67648, 67669, 1, 67671, 67679, 1]));
227
- 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]));
228
- static foldInherited = new UnicodeRangeTable(new Uint32Array([921, 953, 32, 8126, 8126, 1]));
229
- static Inscriptional_Pahlavi = new UnicodeRangeTable(new Uint32Array([68448, 68466, 1, 68472, 68479, 1]));
230
- static Inscriptional_Parthian = new UnicodeRangeTable(new Uint32Array([68416, 68437, 1, 68440, 68447, 1]));
231
- static Javanese = new UnicodeRangeTable(new Uint32Array([43392, 43469, 1, 43472, 43481, 1, 43486, 43487, 1]));
232
- static Kaithi = new UnicodeRangeTable(new Uint32Array([69760, 69826, 1, 69837, 69837, 1]));
233
- 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]));
234
- 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]));
235
- static Kawi = new UnicodeRangeTable(new Uint32Array([73472, 73488, 1, 73490, 73530, 1, 73534, 73562, 1]));
236
- static Kayah_Li = new UnicodeRangeTable(new Uint32Array([43264, 43309, 1, 43311, 43311, 1]));
237
- 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]));
238
- static Khitan_Small_Script = new UnicodeRangeTable(new Uint32Array([94180, 101120, 6940, 101121, 101589, 1, 101631, 101631, 1]));
239
- static Khmer = new UnicodeRangeTable(new Uint32Array([6016, 6109, 1, 6112, 6121, 1, 6128, 6137, 1, 6624, 6655, 1]));
240
- static Khojki = new UnicodeRangeTable(new Uint32Array([70144, 70161, 1, 70163, 70209, 1]));
241
- static Khudawadi = new UnicodeRangeTable(new Uint32Array([70320, 70378, 1, 70384, 70393, 1]));
242
- static Kirat_Rai = new UnicodeRangeTable(new Uint32Array([93504, 93561, 1]));
243
- 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]));
244
- 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]));
245
- static Lepcha = new UnicodeRangeTable(new Uint32Array([7168, 7223, 1, 7227, 7241, 1, 7245, 7247, 1]));
246
- static Limbu = new UnicodeRangeTable(new Uint32Array([6400, 6430, 1, 6432, 6443, 1, 6448, 6459, 1, 6464, 6468, 4, 6469, 6479, 1]));
247
- static Linear_A = new UnicodeRangeTable(new Uint32Array([67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1]));
248
- 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]));
249
- static Lisu = new UnicodeRangeTable(new Uint32Array([42192, 42239, 1, 73648, 73648, 1]));
250
- static Lycian = new UnicodeRangeTable(new Uint32Array([66176, 66204, 1]));
251
- static Lydian = new UnicodeRangeTable(new Uint32Array([67872, 67897, 1, 67903, 67903, 1]));
252
- static Mahajani = new UnicodeRangeTable(new Uint32Array([69968, 70006, 1]));
253
- static Makasar = new UnicodeRangeTable(new Uint32Array([73440, 73464, 1]));
254
- 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]));
255
- static Mandaic = new UnicodeRangeTable(new Uint32Array([2112, 2139, 1, 2142, 2142, 1]));
256
- static Manichaean = new UnicodeRangeTable(new Uint32Array([68288, 68326, 1, 68331, 68342, 1]));
257
- static Marchen = new UnicodeRangeTable(new Uint32Array([72816, 72847, 1, 72850, 72871, 1, 72873, 72886, 1]));
258
- 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]));
259
- static Medefaidrin = new UnicodeRangeTable(new Uint32Array([93760, 93850, 1]));
260
- static Meetei_Mayek = new UnicodeRangeTable(new Uint32Array([43744, 43766, 1, 43968, 44013, 1, 44016, 44025, 1]));
261
- static Mende_Kikakui = new UnicodeRangeTable(new Uint32Array([124928, 125124, 1, 125127, 125142, 1]));
262
- static Meroitic_Cursive = new UnicodeRangeTable(new Uint32Array([68000, 68023, 1, 68028, 68047, 1, 68050, 68095, 1]));
263
- static Meroitic_Hieroglyphs = new UnicodeRangeTable(new Uint32Array([67968, 67999, 1]));
264
- static Miao = new UnicodeRangeTable(new Uint32Array([93952, 94026, 1, 94031, 94087, 1, 94095, 94111, 1]));
265
- static Modi = new UnicodeRangeTable(new Uint32Array([71168, 71236, 1, 71248, 71257, 1]));
266
- static Mongolian = new UnicodeRangeTable(new Uint32Array([6144, 6145, 1, 6148, 6150, 2, 6151, 6169, 1, 6176, 6264, 1, 6272, 6314, 1, 71264, 71276, 1]));
267
- static Mro = new UnicodeRangeTable(new Uint32Array([92736, 92766, 1, 92768, 92777, 1, 92782, 92783, 1]));
268
- static Multani = new UnicodeRangeTable(new Uint32Array([70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70313, 1]));
269
- static Myanmar = new UnicodeRangeTable(new Uint32Array([4096, 4255, 1, 43488, 43518, 1, 43616, 43647, 1, 71376, 71395, 1]));
270
- static Nabataean = new UnicodeRangeTable(new Uint32Array([67712, 67742, 1, 67751, 67759, 1]));
271
- static Nag_Mundari = new UnicodeRangeTable(new Uint32Array([124112, 124153, 1]));
272
- static Nandinagari = new UnicodeRangeTable(new Uint32Array([72096, 72103, 1, 72106, 72151, 1, 72154, 72164, 1]));
273
- static New_Tai_Lue = new UnicodeRangeTable(new Uint32Array([6528, 6571, 1, 6576, 6601, 1, 6608, 6618, 1, 6622, 6623, 1]));
274
- static Newa = new UnicodeRangeTable(new Uint32Array([70656, 70747, 1, 70749, 70753, 1]));
275
- static Nko = new UnicodeRangeTable(new Uint32Array([1984, 2042, 1, 2045, 2047, 1]));
276
- static Nushu = new UnicodeRangeTable(new Uint32Array([94177, 110960, 16783, 110961, 111355, 1]));
277
- static Nyiakeng_Puachue_Hmong = new UnicodeRangeTable(new Uint32Array([123136, 123180, 1, 123184, 123197, 1, 123200, 123209, 1, 123214, 123215, 1]));
278
- static Ogham = new UnicodeRangeTable(new Uint32Array([5760, 5788, 1]));
279
- static Ol_Chiki = new UnicodeRangeTable(new Uint32Array([7248, 7295, 1]));
280
- static Ol_Onal = new UnicodeRangeTable(new Uint32Array([124368, 124410, 1, 124415, 124415, 1]));
281
- static Old_Hungarian = new UnicodeRangeTable(new Uint32Array([68736, 68786, 1, 68800, 68850, 1, 68858, 68863, 1]));
282
- static Old_Italic = new UnicodeRangeTable(new Uint32Array([66304, 66339, 1, 66349, 66351, 1]));
283
- static Old_North_Arabian = new UnicodeRangeTable(new Uint32Array([68224, 68255, 1]));
284
- static Old_Permic = new UnicodeRangeTable(new Uint32Array([66384, 66426, 1]));
285
- static Old_Persian = new UnicodeRangeTable(new Uint32Array([66464, 66499, 1, 66504, 66517, 1]));
286
- static Old_Sogdian = new UnicodeRangeTable(new Uint32Array([69376, 69415, 1]));
287
- static Old_South_Arabian = new UnicodeRangeTable(new Uint32Array([68192, 68223, 1]));
288
- static Old_Turkic = new UnicodeRangeTable(new Uint32Array([68608, 68680, 1]));
289
- static Old_Uyghur = new UnicodeRangeTable(new Uint32Array([69488, 69513, 1]));
290
- 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]));
291
- static Osage = new UnicodeRangeTable(new Uint32Array([66736, 66771, 1, 66776, 66811, 1]));
292
- static Osmanya = new UnicodeRangeTable(new Uint32Array([66688, 66717, 1, 66720, 66729, 1]));
293
- static Pahawh_Hmong = new UnicodeRangeTable(new Uint32Array([92928, 92997, 1, 93008, 93017, 1, 93019, 93025, 1, 93027, 93047, 1, 93053, 93071, 1]));
294
- static Palmyrene = new UnicodeRangeTable(new Uint32Array([67680, 67711, 1]));
295
- static Pau_Cin_Hau = new UnicodeRangeTable(new Uint32Array([72384, 72440, 1]));
296
- static Phags_Pa = new UnicodeRangeTable(new Uint32Array([43072, 43127, 1]));
297
- static Phoenician = new UnicodeRangeTable(new Uint32Array([67840, 67867, 1, 67871, 67871, 1]));
298
- static Psalter_Pahlavi = new UnicodeRangeTable(new Uint32Array([68480, 68497, 1, 68505, 68508, 1, 68521, 68527, 1]));
299
- static Rejang = new UnicodeRangeTable(new Uint32Array([43312, 43347, 1, 43359, 43359, 1]));
300
- static Runic = new UnicodeRangeTable(new Uint32Array([5792, 5866, 1, 5870, 5880, 1]));
301
- static Samaritan = new UnicodeRangeTable(new Uint32Array([2048, 2093, 1, 2096, 2110, 1]));
302
- static Saurashtra = new UnicodeRangeTable(new Uint32Array([43136, 43205, 1, 43214, 43225, 1]));
303
- static Sharada = new UnicodeRangeTable(new Uint32Array([70016, 70111, 1]));
304
- static Shavian = new UnicodeRangeTable(new Uint32Array([66640, 66687, 1]));
305
- static Siddham = new UnicodeRangeTable(new Uint32Array([71040, 71093, 1, 71096, 71133, 1]));
306
- static SignWriting = new UnicodeRangeTable(new Uint32Array([120832, 121483, 1, 121499, 121503, 1, 121505, 121519, 1]));
307
- 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]));
308
- static Sogdian = new UnicodeRangeTable(new Uint32Array([69424, 69465, 1]));
309
- static Sora_Sompeng = new UnicodeRangeTable(new Uint32Array([69840, 69864, 1, 69872, 69881, 1]));
310
- static Soyombo = new UnicodeRangeTable(new Uint32Array([72272, 72354, 1]));
311
- static Sundanese = new UnicodeRangeTable(new Uint32Array([7040, 7103, 1, 7360, 7367, 1]));
312
- static Sunuwar = new UnicodeRangeTable(new Uint32Array([72640, 72673, 1, 72688, 72697, 1]));
313
- static Syloti_Nagri = new UnicodeRangeTable(new Uint32Array([43008, 43052, 1]));
314
- static Syriac = new UnicodeRangeTable(new Uint32Array([1792, 1805, 1, 1807, 1866, 1, 1869, 1871, 1, 2144, 2154, 1]));
315
- static Tagalog = new UnicodeRangeTable(new Uint32Array([5888, 5909, 1, 5919, 5919, 1]));
316
- static Tagbanwa = new UnicodeRangeTable(new Uint32Array([5984, 5996, 1, 5998, 6000, 1, 6002, 6003, 1]));
317
- static Tai_Le = new UnicodeRangeTable(new Uint32Array([6480, 6509, 1, 6512, 6516, 1]));
318
- static Tai_Tham = new UnicodeRangeTable(new Uint32Array([6688, 6750, 1, 6752, 6780, 1, 6783, 6793, 1, 6800, 6809, 1, 6816, 6829, 1]));
319
- static Tai_Viet = new UnicodeRangeTable(new Uint32Array([43648, 43714, 1, 43739, 43743, 1]));
320
- static Takri = new UnicodeRangeTable(new Uint32Array([71296, 71353, 1, 71360, 71369, 1]));
321
- 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]));
322
- static Tangsa = new UnicodeRangeTable(new Uint32Array([92784, 92862, 1, 92864, 92873, 1]));
323
- static Tangut = new UnicodeRangeTable(new Uint32Array([94176, 94208, 32, 94209, 100343, 1, 100352, 101119, 1, 101632, 101640, 1]));
324
- 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]));
325
- static Thaana = new UnicodeRangeTable(new Uint32Array([1920, 1969, 1]));
326
- static Thai = new UnicodeRangeTable(new Uint32Array([3585, 3642, 1, 3648, 3675, 1]));
327
- 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]));
328
- static Tifinagh = new UnicodeRangeTable(new Uint32Array([11568, 11623, 1, 11631, 11632, 1, 11647, 11647, 1]));
329
- static Tirhuta = new UnicodeRangeTable(new Uint32Array([70784, 70855, 1, 70864, 70873, 1]));
330
- static Todhri = new UnicodeRangeTable(new Uint32Array([67008, 67059, 1]));
331
- static Toto = new UnicodeRangeTable(new Uint32Array([123536, 123566, 1]));
332
- 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]));
333
- static Ugaritic = new UnicodeRangeTable(new Uint32Array([66432, 66461, 1, 66463, 66463, 1]));
334
- static Vai = new UnicodeRangeTable(new Uint32Array([42240, 42539, 1]));
335
- 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]));
336
- static Wancho = new UnicodeRangeTable(new Uint32Array([123584, 123641, 1, 123647, 123647, 1]));
337
- static Warang_Citi = new UnicodeRangeTable(new Uint32Array([71840, 71922, 1, 71935, 71935, 1]));
338
- static Yezidi = new UnicodeRangeTable(new Uint32Array([69248, 69289, 1, 69291, 69293, 1, 69296, 69297, 1]));
339
- static Yi = new UnicodeRangeTable(new Uint32Array([40960, 42124, 1, 42128, 42182, 1]));
340
- static Zanabazar_Square = new UnicodeRangeTable(new Uint32Array([72192, 72263, 1]));
341
- 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]]);
342
- 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]]);
343
- static FOLD_CATEGORIES = new Map([['L', UnicodeTables.foldL], ['Ll', UnicodeTables.foldLl], ['Lt', UnicodeTables.foldLt], ['Lu', UnicodeTables.foldLu], ['M', UnicodeTables.foldM], ['Mn', UnicodeTables.foldMn]]);
344
- static FOLD_SCRIPT = new Map([['Common', UnicodeTables.foldCommon], ['Greek', UnicodeTables.foldGreek], ['Inherited', UnicodeTables.foldInherited]]);
345
- 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]));
203
+ static _CASE_ORBIT = null;
204
+ static get CASE_ORBIT() {
205
+ if (!this._CASE_ORBIT) {
206
+ 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');
207
+ }
208
+ return this._CASE_ORBIT;
209
+ }
210
+ static _Print = null;
211
+ static get Print() {
212
+ if (!this._Print) {
213
+ this._Print = new UnicodeRangeTable(decodeRanges('hB9CBjBLBCpWBDFBFGBCCCBSBCsMBClBBDxBBDCBC2BBJaBFFBSVBC-FBCvBBD6BBDkDBP6BBDwBBDOBCbBDCCBJBGeBJqCBCgFBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYBDCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPBLCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGBCCBCHBDBBDVBCGBCBBCEBDIBDBBDCBICBFBBCEBDRBLBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBGMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIVBCCBCWBCJBCEBDIBCCBCDBIBBHBBCDBDJBCCBNMBCCBCyBBCCBCFBFPBDZBCCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBN5BBFcBmBBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDBhBnCBCjBBFmBBCjBBCOBCMBmBlGBCGGD4LBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBH1CBDFBD-TBCbBE4CBIVBKXBKTBNMBCCBCBBN9CBDJBHJBHNBCKBH4CBIqBBGlCBLeBCLBFLBFEEBoBBDEBMrBBFZBHKBE9BBDgCBCcBDKBHJBHNBDeByBsCBClFBJ7BBEOBE9BBGqBBDKBJqBBG1QBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBSXBJuBBSBBDaBCMBEgBBQgBBQrEBF5UBXKBWz4BBDfBC8KBGsBBCGGD3BBIBBPXBKGBCGBCGBCGBCGBCGBCGBCGBC9DBjBZBC4CBN1GBbPBC+BBC1CBDmDBGqBBC9CBC1CBKvBBCszcBE2BBK7KBV3FBJtGBDBBCCCBGBW6BBEJBH3BBJlCBJLBHzDBMdBEtCBCKBFgBBC2BBKNBDJBDmDBZbBLFBDFBDFBKGBCGBC7BBF9DBDJBHj9KBNWBFwBBloItLBDpDBnBGBNEBGZBCEBCCCBCCBCCB7DBR8NBD1BBIhBhBBoBBHyBBCSBCDBFEBCmEBF9FBEFBDFBDFBDCBEGBCGBOBBDLBCZBCSBCBBCOBDNBjB6DBGCBFsBBE3CBCMBEwBwBBsBBjEcBEwBBQbBFjBBKdBGqBBGdBCkBBFNBrB9EBDJBHjBBFjBBFnBBJzBBMLBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBCnCBJIBxBSBCBBGgBBEaBGhChCB2BBFTBDxBBCBBGHBCCBCcBDCBFJBIIBI-BBhBmBBFLBK1BBEcBDaBGZBIDBNGBxCoCB4ByBBOyBBItBBJJBHlBBEcBJBBxGeBCpBBCCBDBBRCB4BrBBJpBBXZBnBbBVWBKtCBFjBBK9BBCEBOYBIJBH0BBCRBJmBBK-CBCTBMRBCuBB-BGBCCCBCBCOBCKBH6BBGJBHDBCHBDBBDVBCGBCBBCEBCJBDBBDCBDHHGGBDGBEEBMJBCDDClBBCJBCDDCDBCJBCBBJBBe7CBCEBfnCBJJBnF1BBDlBBjBkCBMJBHMBU5BBHJBHTBdaBDOBFWB6F7BBlDyCBNHBDDDBGBCBBCdBCBBDLBKJBnCHBDtBBDKBcnCBJyCBOoCBIJB3FhBBPJBHIBCsBBCNBLcBEfBDVBCNBqCGBCBBCrBBECCBCCBHBJJBHFBCBBCkBBCBBCFBIJB3JYBIQBCoBBEcB2CQQBwBBO6cBnDuDBCEBMjGBtyCiDBOvhBBRVBL68DBGmSB61G5BBn2B4RBIeBCJBFwCBCJBHdBDFBLlCBLJBCGBCUBGSBxN5BBnG6CBmDqCBF4BBIQBhCEBMBBP3-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBDDBh7D5HBHzNBtCtBBDWBKzDB9B1HBLmBBDpCBJvDBWlCB7DTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBD9VBQEBCOBxiBeBHFB2GGBCQBDGBCBBCEBG9BBiBxDxDBrBBENBDJBFBBhKeBS5BBGxOxOBoBB3GqBBFhPhPBFBCDBCBBCOBCkGBDPBqBrCBFJBFBByYjCBtC8BBjGDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBBvIrBBFjDBNOBDOBCOBCkBBLtFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBngB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEBxq3VvHB', false));
214
+ }
215
+ return this._Print;
216
+ }
217
+ static CATEGORIES = new LazyMap({
218
+ 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)),
219
+ Cc: () => new UnicodeRangeTable(decodeRanges('AfgDgB', true)),
220
+ Cf: () => new UnicodeRangeTable(decodeRanges('tFzqBzqBBEBXhGhGyBhMhMBxCxCs5D9-B9-BBDBbEByBEBCJBw03B6H6HBBBimEQQj7IPBhjiBDBwmFHBn0rYffB+CB', false)),
221
+ 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)),
222
+ Co: () => new UnicodeRangeTable(decodeRanges('gg4B-nGh4hc9--BD9--B', true)),
223
+ Cs: () => new UnicodeRangeTable(decodeRanges('gg2B--B', true)),
224
+ L: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBLLFGGBVBCeBCpOBFLBPEBICCiEEBCBBDDBCHHCCBCCCBSBCyCBCqEBJlFBClBBDHHBnBBoCaBFDBuBqBBkBBBCiDBCQQBIIBLLBBBDRRCdBe4CBMZZBfBKBBFGGBUBFKKEYYBXBIKBGXBCFBSpBB7B1BBETTIJBQPBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNGB7BBBCCCBDBCXBCCCBIBCBBKDDBDBCWWBCBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNSSBkBBCGGDqBBCsKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPBR1CBDFBErTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBkBFFkC4CBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBzC+C+CBtBBSHB3BdBOBBLrBBbjBBqBCBLjBBDKBGqBBDCBqBDBCFBCBBEGGB+FBhC1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGB1DOORMBmDFFDJBCEEBDBHGCBCBCKBDDBGEBF1B1BB8zC8zCBjHBHDBEBBNlBBCGGD3BBIRRBVBKGBCGBCGBCGBCGBCGBCGBCGBxC2O2OBrBrBBDBGBBF1CBHCBC5CBCDBGqBBC9CBSfBxBPBhQ-tGBhCs0VBkCtBBDsIBEPBLBBVuBBReBDlCByBIBDmDBDiCBDBBCCCBGBWPBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBdRRBDBCJBLEBCoBBYCBCHBVWBEEEBwBBCEEBDDBDBDCCZCBDKBICBNFBDFBDFBKGBCGBCqBBCNBHyDBej9KBNWBFwBBloItLBDpDBnBGBNEBGCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBlBZBHZBM4CBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBxB9EBTjBBFjBBFnBBJzBBNKBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4ByBBOyBBOjBBnBbBKWB7HpBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB1D-BBgBHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBBRDBgBUBGSBxNsBB0G-BBhEqCBGjCjCBLBhCBBCddB2-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBn7F0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BeBHFBmI9BBzEsBBLGBRiKiKBcBTrBBlPbBlHdBDwPwPBFBCDBCBBCOBCkGB8BjCBI1lB1lBBCBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
225
+ LC: () => new UnicodeRangeTable(decodeRanges('hCZBHZB7BLLBVBCeBCiGBCDBFvGBCaBhGDBDBBECBCHHCCBCCCBSBCyCBCqEBJlFBClBBKoBB44ClBBCGGDqBBDCBhV1CBDFBjkCKBGqBBDCBhCrBBgCMBChBBmD1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGBmIFFDJBCEEBDBHGCBCBCFBFDDBCBGEBF1B1BB8zC8zCB6DBDmDBHDBEBBNlBBCGGzoetBBTbBnEtCBCWBEDBC9BBDBBCCCBGBZBBE2Z2ZBpBBGIBIvCBh6TGBNEBqgBZBHZBmlBvCBhDjBBFjBB1DKBCOBCGBCBBCKBCOBCGBCBBk2ByBBOyBB+CVBLVB74C-BBhrV-BBhsZ0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BJBCTBHFB2uCjCB', false)),
226
+ Ll: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBC2BCBQCBuBCDECBBBDCCDEEBFFDEEBBBDDDCCCDCCBCCDEECDDBDDBBBHGDCOCBSCBDDCEEC4BCBFBDDDBCCFICBjCBCaBiGCCEEEBBBTccBhBBCBBECBCWCBDBCGDB0B0BBuBBCgBCK0BCDMCBgDCxBoBBo6CqBBDCB5XFBjkCIBC2D2DBqBBgCMBChBBnD0ECBHBCgDCBHBJFBLHBJHBJFBLHBJHBJNBDHBJHBJHBJEBCBBHEEBBBCBBJDBDBBJHBLCBCBBzIEEBEEcKFDBBJDBF2B2Bs1CvBBCEEBGCFCCBCCBEBGiDCBIICFFNlBBCGG0oesBCUaCoEMCBBBC+BCBGBCCCDICFCCDCCBBBCSCGGGCMCFCCDEECICbEE2ZqBBGIBIvCBh6TGBNEBqhBZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfB7sZZBbGBCRBbZBbDBCCCBFBCKBbZBbZBbZBbZBbZBbZBbZBbZBbbBdYBCFBbYBCFBbYBCFBbYBCFBbYBCFBC15B15BBIBCTBHFB4vChBB', false)),
227
+ Lm: () => new UnicodeRangeTable(decodeRanges('wVRBFLBPEBICCmEGG-OnHnHlFBBuIBBFgBgBKEEhFoFoF1mBgEgE2R72B72BsDkTkTxOFBvF+BBOjBjBBjBByVOORMBg-CBByHgGgG2OsBsBBDBGiDiDB+C+CBBB34bjnBjnBBEBvIzDzDdBB6DIBxCYYqDCBEBB2OXXqEtDtDWBBoDDBKngVngVuBBBh-BFBCpBBCIB0sBhBhBxuXDB9PCBpBBBnRMBhCBBCtgQtgQBCBCGBCBByhM9BBqGGBudgjBgjB', false)),
228
+ Lo: () => new UnicodeRangeTable(decodeRanges('qFQQhIFFBCBxG8Z8ZBZBFDBuBfBCJBkBBBCiDBCZZBLLBBBDRRCdBe4CBMZZBfBWVBrBYBIKBGXBCFBSoBB8B1BBETTIJBROBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNFB8BBBCCCBDBCXBCCCBIBCBBKDDBDBYDBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNyDyDBnKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPByDrTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBpBkCkCBhBBC0BBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBxFuBBSHB3BdBOBBLrBBbjBBqBCBLdByDDBCFBCBBE7hB7hBBCB4-C3BBZWBKGBCGBCGBCGBCGBCGBCGBCGBoR2B2BF1CBJCCB4CBFGGBpBBC9CBSfBxBPBhQ-tGBhC0wUBC2jBBkCnBBJrIBFPBLBBjCyByBBkCBqFoDoDEGBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBuBEBDIBLEBCoBBYCBCHBVPBCFBEEEBwBBCEEBDDBDBDCCZBBEKBIPPBEBDFBDFBKGBCGByEiBBej9KBNWBFwBBloItLBDpDBkCCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBqDJBCsBBDeBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBhEtCBjDnBBJzBB9CzBBN2JBKVBLHB5EFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4FjBBnBDBCxJxJBoBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB0GHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBB0BUBGSB0NnBB2MqCBGwFwFB2-FBJ1mBBqBJB43IiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBxzI2P2PBrBBiBiKiKBcBTrBBlPaBmHdBDwPwPBFBCDBCBBCOBCkGB8pBDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
229
+ Lt: () => new UnicodeRangeTable(decodeRanges('lOGDnB2sH2sHBGBJHBJHBNQQwBAB', false)),
230
+ Lu: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiB2BCDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIJDCMCDQCDDDCCBC4BCIBBCBBDCCBCBCGCiJCCEJJHCCBBBCCCBCCBPBCIBkBDDBBBEWCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBpCDBNDBNDBNEBMDBnIFFECBDCBDEEBDBHGCBCBDDBLBBG+B+B9zCvBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEEGGCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBhtZZBbZBbZBbCCBGDBDDBCBCHBbZBbBBCDBDHBCGBcBBCDBCEBCEEBFBcZBbZBbZBbZBbZBbZBfYBiBYBiBYBiBYBiBYBiB2pE2pEBgBB', false)),
231
+ M: () => new UnicodeRangeTable(decodeRanges('gYvDB0IGBoIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCgBB3BCBCRBCGBLBBeCB5BCCBFBDBBDCBKLLBbbDCB5BCCBDBFBBDCBEffBEEMCB5BCCBGBCCBCCBVBBXFBCCB5BCCBFBDBBDCBICBLBBf8B8BBDBECBCDBKpBpBBDB4BCCBFBCCBCDBIBBMBBeCB5BCCBFBCCBCDBIBBMBBQNNBCB4BBBCGBCCBCDBKLLBeeBBBnCFFBEBCCCBGBTBB+BDDBFBNHBjDDDBHBMGBqCBBcECFBByBTBCBBGKBCjBBKlDlDBSBYDBFCBCCBDGBEDBOLBCLLBCBgWCBzdDBdCBeBBfBBhCfBKuBuBBBBC2D2DBjBjB3DLBFLB8GEB6BJBCcBDxBxBBdByBEBwBQBnBIBNCBfMB5BNBxBTB5ECBCUBFHHDCBnG-BBxWgBB--CCBuEhDhDBeBrRFBqDBB1udDBCJBhBBBxCBBxIEEFYYBDBF0C0CBzBzBBQBbRBOnBnBBGBaMBtBDBwBNBlBkCkCBMBNJJBuBuBBBBzBCCBBBDBBGBBCqBqBBDBGBBtHHBCBBx5TiXiXBOBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB7DCB2BOBqBDDBLLBCBuBKBI+B+BBBBlBNBRBBtBNNBBBxBNBJDBCBB9CLBHDD+ELBWDB4BBBCGBDBBDCBKLLBDDBFBEEBkCIBCDDCDBCEBCPPBzCzCBQBYyCyCBSBsHGBDIBcBBzCQBrDMBmDOBhIOB2HFBCBBDDBCCCBuEuEBFBDGBEddBIBpBGBCDBJKKBJBvBPB2MHBCHBzCVBCNB7DFBECCBCCBFBCjCjCBDBCBBCEB8KDBKBBCxBxBBFBEEBYmnFmnFHOBpmLRBhuCEB8BGB5gBCCB1BBIDByCMMBslTslTBizEizEBsBBDWB-QEBEFBJHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
232
+ Mc: () => new UnicodeRangeTable(decodeRanges('joC4B4BDCBJDBCBBzBBB7BCBHBBDBBLsBsB7BCBjC7B7BBBBJCCB2B2BB7B7BCHHBDDBLLnDBBCBBECBCCBLqBqBBBB+BDB+BBB7BCCBDBDBBCBBKBBdPPB7B7BBBBGCBCCBLrBrBBsCsCBBBHHBTBBrKBBgCsFsFBFFHDDBaaBLLBBBDGBWBBDFBDLLBBB5zBffiEIIBGBCBB7KDBDCBFBBCFBhHBB7BCCKCCBJJBEByExBxBGCCBDBCBB+BffFBBD9B9BDCBCEEBxBxBBGBJBBsFWW35EBB0-dBBD5C5CBzBzBBOBvEBBwBxBxBBFFBDDBBBvDBBDBBZuBuBCuDuDDBBGuHuHBCCBCCBCC0gZCCgEuBuBBBBFBB0DZZB8B8BxBCBKBBO+C+CBBBEBBCrFrFBBBgBBB7BBBCDBDBBDCBKLLB1C1CBBBIDDCDBCBBCmDmDBBBJBBErDrDBBBHCCBCBDuHuHBBBHDBDyDyDBBBJBBCuDuDCBBHoDoDCBBFmImIBBBK4H4HBEBCBBFDDCvEvEBBBJDBF1C1CeBB-B4M4MPrDrDIDD2GEBFBBC-K-KBNNxBBBJBBCpvQpvQBBBlxD2BBpDBB0rYBBHFB', false)),
233
+ Me: () => new UnicodeRangeTable(decodeRanges('okBBB1xF-wB-wBBCBCCBsshBCB', false)),
234
+ Mn: () => new UnicodeRangeTable(decodeRanges('gYvDB0IEBqIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCfB4BCCFHBFEEBFBLBBe7B7BFDBJVVBbbDBB6BFFBFFBDDBBBEffBEEMBB6BFFBDBCBBFVVBXXBEBC7B7BDCCBCBJIIBMMBff+BNNzBEE4BCCBBBGCBCDBIBBMBBe7B7BDHHGBBVBBdBB6BBBFDBJVVBeepCIIBBBC7C7CDGBNHBjDDDBHBMGBqCBBcEC4BNBCEBCBBGKBCjBBKnDnDBCBCFBCBBDBBaBBFCBRDBODDBHHQgWgWBBBzdCBeBBfBBfBBhCBBCGBJDDBJBKuBuBBBBC2D2DBjBjB3DCBFBBKHHBBB8GBBD7B7BCGBCCCDHBHJBDxBxBBMBCPByBDBxBCCBDBCGGpBIBNBBhBDBDBBCCB5BCCBEECCB7BHBDBB5ECBCMBCGBFHHEBBnG-BBxWMBFEEBKB--CCBuEhDhDBeBrRDBsDBB1udFFBIBhBBBxCBBxIEEFaaBGG4EBBbRBOnBnBBGBaKBvBCBxBDDBCBDBBoBkCkCBEBDBBDBBNJJwB0B0BCCBDBBGBBCrBrBBJJvHDDFx5Tx5TiXPBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB8D3B3BBNBqBDDBLLBBByBDBDBBI+B+BBBBlBEBCHB-BNNB1B1BBHBLDBDgDgDBBBDCCBHHD+E+EEHBWBB6BBBEmBmBBFBEEBnCFBOECPBB2CHBDCBCYY1CFBCFFBCCBvHvHBCBHBBCBBcBB2CHBDCCBrDrDCDDBEBCmDmDCDDBCBCEBkIIBCBBhIBBCFFxEDBDBBFhBhBBIBpBFBDDBJKKBEBDCBvBMBCBB3MGBCFBCzCzCBUBDGBCBBCBB7DFBECCBCCBFBCpCpCBEEC8K8KBMMB1B1BBDBGCCYmnFmnFHOBpmLLBECBhuCEB8BGB5gBgCgCBCByC5lT5lTBizEizEBsBBDWBhRCBSHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
235
+ N: () => new UnicodeRangeTable(decodeRanges('wBJB5DBBGDDBBBitBJBnEJBnGJB9MJB3DJBFFBtDJB3DJB3DJBDFBvDMB0DJBJGBoDJBpDGBISBuDJBhDJB3DJBnCTBtIJBnCJBwWTBybCBwHJBHJBXJBtJJBhEKBmFJBHJB3FJB3CJBnEJBHJB3gBEEBEBHJBnGyBBDEB3W7BBvCVB3TdBqrBqYqYaIBPCB4KDBrEJBfHBCOBhBJBoBOBh7cJB9FJBhKFB7EJBnBJBnGJBXJB3CJB3MJB34UJBuPsBBN4BBSBB2KaBlBDBeJJnEEBrGJBvdHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBxBJBHJB3IeB-EJBrBDBxDGBnEdBhEJB9BJBxEJBITB8HJB3KJB3DJB3LJBnDJBHTBtCLBlNSB+CJB3UJB3CcBkHJBnCJBnNJBnDUBshBuDBimPJBnpCJB3CJBnEJBCGBvQJBnIWB6yXJBnuBTBNTBtDYB2iBxBBhqCJBnNJB3PJB4HJBtWIBhEJB4Y6BBCCBCDBtCsBBCOBjeMBk3CJB', false)),
236
+ Nd: () => new UnicodeRangeTable(decodeRanges('wBJnxBJnEJnGJ9MJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJhDJ3DJnCJ3IJnCJn6BJnBJtJJhEJnFJHJ3FJ3CJnEJHJnuiBJnVJnBJnGJXJ3CJ3MJ34UJnsBJnkCJHJ9YJhEJ9BJxEJ3IJ3KJ3DJ3LJnDJHTtCJnNJnDJ3UJ3CJ3HJnCJnNJ3uQJnpCJ3CJnEJ3QJ37XJ12CxBhqCJnNJ3PJ4HJ2aJ30EJ', true)),
237
+ Nl: () => new UnicodeRangeTable(decodeRanges('u3FCBwzCiBBDDB-zDaaBHBPCBs1dJBxyW0BBtOJJnEEBrhIuDB', false)),
238
+ No: () => new UnicodeRangeTable(decodeRanges('yFBBGDDBBB2pCFB5LFB5DCBmEGB6GGBSIByNJB2hBTB0jBJBhP20B20BEFBHJBnGPBqB3W3WB6BBvCVB3TdBqrB1kB1kBBCBrEJBfHBCOBhBJBoBOBxrdFBymWsBBiCDBSBB2KaBlBDB1pBHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBhLeB-EJBrBDBxDGBnETB8LTBmqBBBvNIBobSB0aUBn8SGB-YWBqhZTBNTBtDYBvqFIBid6BBCCBCDBtCsBBCOBjeMB', false)),
239
+ P: () => new UnicodeRangeTable(decodeRanges('hBCBCFBCDBLBBEBBbCBCccCkBkBGEELBBEEE-VJJzOFBqBBB0BCCDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCmBmBBCBoCrCrCBDBFBBwDFBsFlTlTBHB4EuTuTtBBBvCCBoCBB+ECBCCBmBKB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBM9Z9ZBWBJTBCMBCLBfBBPBB6TDBeBB+hBNBwCBBgBJB0MVBgCDBhBBB8XDBCBBxDwEwEBtBBCfBDLBkNCBFJBDLBRNNjD7C7CjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HzqUzqUBxGxGBIBXiBBCNBCFFCBB2ECBCFBCDBLBBEBBbCBCccCCCBFB7MCB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDByO-J-JoFEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
240
+ Pc: () => new UnicodeRangeTable(decodeRanges('-Cg-Hg-HBUU-u3BBBZCBwHAB', false)),
241
+ Pd: () => new UnicodeRangeTable(decodeRanges('tB9qB9qB0BiyDiyDmgBqgCqgCBEBiwDDDgBBBFdd-NUUwDxszBxszBBmBmBLqFqFhzD-J-J', false)),
242
+ Pe: () => new UnicodeRangeTable(decodeRanges('pB0B0BgB+1D+1DC-6B-6BqtC4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECtBGCtNICEGCDBB-ozB6G6GeOCESSCCCrF0B0BgBGD', false)),
243
+ Pf: () => new UnicodeRangeTable(decodeRanges('7F+6H+6HEddpuDCCFDDQEE', false)),
244
+ Pi: () => new UnicodeRangeTable(decodeRanges('rFt7Ht7HDBBDaapuDCCFDDQEE', false)),
245
+ Po: () => new UnicodeRangeTable(decodeRanges('hBCBCCBDECBLLBEEBcclCGGPBBI-V-VJzOzOBEBqB3B3BDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCxDxDrCEBFBBwDFBsFlTlTBHBmY9D9DBBBoCBB+ECBCCBmBFBCDB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBMjajaBJJBGBJIBDDBDCBEKBCCCBIB7kDDBCBBxDwEwEBFFBBBDDDBHBCBBCDDBLLBDBCJBDDBCCCBLBDCBtNCB6B+F+FjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HlxUlxUBFBDXXVBBDDBECBCDBICBHCCB2E2EBBBCCBDECBLLBEEBcclBDDB7M7MBBB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDB5dEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
246
+ Ps: () => new UnicodeRangeTable(decodeRanges('oBzBzBgB-1D-1DC-6B-6B-rCEEnB4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECaTTCECtNICEGCDipzBipzB4GeeCMCESSCCCrFzBzBgBEEDAB', false)),
247
+ S: () => new UnicodeRangeTable(decodeRanges('kBHHRCBgBCCcCCkBEBCBBDCCBCBDEEfgBgBrODBNNBGGBCCCBPB2DPPBxDxDsErIrIBBB3DCBDDDBvGvGLUUB4H4HIBBpEqLqLBHHB2H2H-DjEjEBGBlEwGwGqBmGmGiGCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WuLuLlL+E+EBgBBiLJBKIBhiBCCBBBMCBOCBOCBOBBmCOOoBCBOCBUgBBgCBBCDBCBBLCCBBBGFBCECFMMBFFBDBGDBC7B7BBFFB2LBFcBD+HBXKByCtCBXnTBtBwBBDeBLyMBX+BBFfBD1LBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBB8CBB0HBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BB6RWBKBBoDBB+EDBLDB+RCBiHPPB+9T+9TpEQB+LPBgEtBtBBCBjDCCBBBD7E7EHRRBBBgBCCcCCiEGBCGBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwSmWmWBwtCwtC2kCcBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBrbaagBaagBaagBaagBaa9B-PB4BDBzBHBCNBCBBp2BwNwNttCEE+DiOiOBvIvIBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
248
+ Sc: () => new UnicodeRangeTable(decodeRanges('kB+D+DBCBqnB8D8DzPBBzPBBI2H2HoImSmS8sClmClmCBfB47hBkuVkuVtD7E7E8GBBEBB3-HDB-4wBxtCxtC', false)),
249
+ Sk: () => new UnicodeRangeTable(decodeRanges('+CCCoCHHFEEqQDBNNBGGBCCCBPB2DPPBjoBjoB15FCCBBBMCBOCBOCBOBB9kEBBkzdWBKBBoDBBxePPBniUniUBPB8bCCjF4g9B4g9BBDB', false)),
250
+ Sm: () => new UnicodeRangeTable(decodeRanges('rBRRBBB+BCCuBFFmBgBgB-XwQwQBBB8xGOOoBCBOCBsEoBoBBDBHlClCBDBGBBFGDIgBgBBDDCgBgBBqIBhBBB7CffBXBpBFB2OKK3BHBwDxKxKBDBDeBLPBhIiEBX+BBFfBDhIBxBUBDFB9+zB5Z5ZCCBlFRRBBB+BCCkEHHBCBitDBBypyBaagBaagBaagBaagBaat5FBB', false)),
251
+ So: () => new UnicodeRangeTable(decodeRanges('mFDDFCCyerIrIBgEgEBvGvGLUUB4H4HkQ2L2LjEFBClElEwGqBqBoMCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WzWzW+EhBBiLJBKIBksBBBCDBCBBLCCBHHBEBCECFMMBPPCBBC7B7BBKKBDBDDBCBBCBBCGBCeBDBBCCCBdBtIHBFTBDGBDwCBCdBanBBHnCBXKByCtCBX2FBCIBC1BBJuDBC3HBtBrBBhC-HBhQvBBWBBHmBBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBBxKBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BBibDBLBBC+R+RBBBn2UPBgEuBuBBBBlPEEFBBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwS3jD3jD2kCHBFQBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBqlB-PB4BDBzBHBCNBCBBp2B96C96CiEyWyWBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E6HBG3WBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
252
+ Z: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBeBBGwBwBh9DAB', false)),
253
+ Zl: () => new UnicodeRangeTable(decodeRanges('ohIA', true)),
254
+ Zp: () => new UnicodeRangeTable(decodeRanges('phIA', true)),
255
+ Zs: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBlBwBwBh9DAB', false))
256
+ });
257
+ static get Upper() {
258
+ return this.CATEGORIES.get('Lu');
259
+ }
260
+ static SCRIPTS = new LazyMap({
261
+ Adlam: () => new UnicodeRangeTable(decodeRanges('go6DrCFJFB', true)),
262
+ Ahom: () => new UnicodeRangeTable(decodeRanges('g4lCaDOFW', true)),
263
+ Anatolian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggxCmS', true)),
264
+ Arabic: () => new UnicodeRangeTable(decodeRanges('gwBEBCFBCNBCCBCfBCJBMZBCrDBChBBxCvBBxHeBCBBGqCBCcBxy8ByDBRqLBDvCBD1BBIhBhBBOBxDEBCmEBk7DeBkCCB4BDBh43BDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBB', false)),
265
+ Armenian: () => new UnicodeRangeTable(decodeRanges('xpBlBDxBDCks9BE', true)),
266
+ Avestan: () => new UnicodeRangeTable(decodeRanges('g4iC1BEG', true)),
267
+ Balinese: () => new UnicodeRangeTable(decodeRanges('g4GsCCxB', true)),
268
+ Bamum: () => new UnicodeRangeTable(decodeRanges('g1pB3CpowB4R', true)),
269
+ Bassa_Vah: () => new UnicodeRangeTable(decodeRanges('w26CdDF', true)),
270
+ Batak: () => new UnicodeRangeTable(decodeRanges('g+GzBJD', true)),
271
+ Bengali: () => new UnicodeRangeTable(decodeRanges('gsCDBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYB', false)),
272
+ Bhaiksuki: () => new UnicodeRangeTable(decodeRanges('ggnCICsBCNLc', true)),
273
+ Bopomofo: () => new UnicodeRangeTable(decodeRanges('qXB6wLqBxDf', true)),
274
+ Brahmi: () => new UnicodeRangeTable(decodeRanges('ggkCtCFjBKA', true)),
275
+ Braille: () => new UnicodeRangeTable(decodeRanges('ggK-H', true)),
276
+ Buginese: () => new UnicodeRangeTable(decodeRanges('gwGbDB', true)),
277
+ Buhid: () => new UnicodeRangeTable(decodeRanges('g6FT', true)),
278
+ Canadian_Aboriginal: () => new UnicodeRangeTable(decodeRanges('ggF-TxRlC7tgCP', true)),
279
+ Carian: () => new UnicodeRangeTable(decodeRanges('g1gCwB', true)),
280
+ Caucasian_Albanian: () => new UnicodeRangeTable(decodeRanges('wphCzBMA', true)),
281
+ Chakma: () => new UnicodeRangeTable(decodeRanges('gokC0BCR', true)),
282
+ Cham: () => new UnicodeRangeTable(decodeRanges('gwqB2BKNDJDD', true)),
283
+ Cherokee: () => new UnicodeRangeTable(decodeRanges('g9E1CDFz7lBvC', true)),
284
+ Chorasmian: () => new UnicodeRangeTable(decodeRanges('w9jCb', true)),
285
+ Common: () => new UnicodeRangeTable(decodeRanges('AgCBbFBbuBBCOBCEBYgBgBiOmBBGEBDTB1DKKHCC+THHPEEhB9E9ElQiEiEB6mB6mB2MDBjJwvBwvBBBBoCBBsGBBCumBumBOIIBCBCFBCCBDmYmYBKBD2CBCKBEKBCOBSgBBgClBBCCBDFBCaBCQBqBCBF5UBXKBW-cBhIzTBDfBCoDBhQ9CBzMUBCCCBXBQHBFDB8CBBE7C7CB0E0EBOBhBlBBKxBxBB+BBgBwCBwB5C5CBmFBhuG-BBhoWhBBnDCBmFJB1HhFhFsMPPBzuUzuUBxGxGBIBXiBBCSBCDB0ECCBeBbFBbKBLuBuBBhChCBFBCGBLEBjICBFsBBEIBxCMB0BsBBlHaBltuBDB96D5HBHzNB9EzDB9B1HBLmBBD9BBEQBJBBIdBF8BB2GTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBDxBByjFjCBtC8BBjWrBBFjDBNOBDOBCOBCkBBLtFB5BZBCBBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBoghYffB+CB', false)),
286
+ Coptic: () => new UnicodeRangeTable(decodeRanges('ifNxkKzDGG', true)),
287
+ Cuneiform: () => new UnicodeRangeTable(decodeRanges('ggoC5cnDuDCEMjG', true)),
288
+ Cypriot: () => new UnicodeRangeTable(decodeRanges('ggiCFBDCCBqBBCBBEDD', false)),
289
+ Cypro_Minoan: () => new UnicodeRangeTable(decodeRanges('w8rCiD', true)),
290
+ Cyrillic: () => new UnicodeRangeTable(decodeRanges('ggBkEBDoFBx6FKBhFtCtCojEfBhie-CBv8VBBhw4B9BBiBAB', false)),
291
+ Deseret: () => new UnicodeRangeTable(decodeRanges('gghCvC', true)),
292
+ Devanagari: () => new UnicodeRangeTable(decodeRanges('goCwCFODZh7nBfhwcJ', true)),
293
+ Dives_Akuru: () => new UnicodeRangeTable(decodeRanges('gomCGBDDDBGBCBBCdBCBBDLBKJB', false)),
294
+ Dogra: () => new UnicodeRangeTable(decodeRanges('ggmC7B', true)),
295
+ Duployan: () => new UnicodeRangeTable(decodeRanges('ggvDqDGMEIIJDD', true)),
296
+ Egyptian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggsC1iBL68D', true)),
297
+ Elbasan: () => new UnicodeRangeTable(decodeRanges('gohCnB', true)),
298
+ Elymaic: () => new UnicodeRangeTable(decodeRanges('g-jCW', true)),
299
+ Ethiopic: () => new UnicodeRangeTable(decodeRanges('gwEoCBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBnvGWBKGBCGBCGBCGBCGBCGBCGBCGBjpfFBDFBDFBKGBCGBylvCGBCDBCBBCOB', false)),
300
+ Garay: () => new UnicodeRangeTable(decodeRanges('gqjClBEcJB', true)),
301
+ Georgian: () => new UnicodeRangeTable(decodeRanges('glElBBCGGDqBBCDBx8CqBBDCBhiElBBCGG', false)),
302
+ Glagolitic: () => new UnicodeRangeTable(decodeRanges('ggL-Ch9sDGCQDGCBCE', true)),
303
+ Gothic: () => new UnicodeRangeTable(decodeRanges('w5gCa', true)),
304
+ Grantha: () => new UnicodeRangeTable(decodeRanges('g4kCDBCHBDBBDVBCGBCBBCEBDIBDBBDCBDHHGGBDGBEEB', false)),
305
+ Greek: () => new UnicodeRangeTable(decodeRanges('wbDBCCBDDBCFFCCCBBBCCCBSBC+BBPPBnpGEBzBEBFEB1ChKhKBUBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBoJ-xiB-xiB7uVuCBSgj0Bgj0BBkCB', false)),
306
+ Gujarati: () => new UnicodeRangeTable(decodeRanges('h0CCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGB', false)),
307
+ Gunjala_Gondi: () => new UnicodeRangeTable(decodeRanges('grnCFCBCkBCBCFIJ', true)),
308
+ Gurmukhi: () => new UnicodeRangeTable(decodeRanges('hwCCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPB', false)),
309
+ Gurung_Khema: () => new UnicodeRangeTable(decodeRanges('go4C5B', true)),
310
+ Han: () => new UnicodeRangeTable(decodeRanges('g0LZBC4CBN1GBwBCCaIBPDBle-tGBhC-vUBhoWtLBDpDBpodBBNBBvgkB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
311
+ Hangul: () => new UnicodeRangeTable(decodeRanges('goE-HvxHBiI9CyDeiCei3dckUj9KNWFwBl9JeEFDFDFDC', true)),
312
+ Hanifi_Rohingya: () => new UnicodeRangeTable(decodeRanges('gojCnBJJ', true)),
313
+ Hanunoo: () => new UnicodeRangeTable(decodeRanges('g5FU', true)),
314
+ Hatran: () => new UnicodeRangeTable(decodeRanges('gniCSCBGE', true)),
315
+ Hebrew: () => new UnicodeRangeTable(decodeRanges('xsB2BBJaBFFBpp9BZBCEBCCCBCCBCCBIB', false)),
316
+ Hiragana: () => new UnicodeRangeTable(decodeRanges('hiM1CBHCBi7-C+IBTeeBBBulQAB', false)),
317
+ Imperial_Aramaic: () => new UnicodeRangeTable(decodeRanges('giiCVCI', true)),
318
+ Inherited: () => new UnicodeRangeTable(decodeRanges('gYvDB2IBBlOKBbhXhXBCB8qEeBiQCBCMBCGBFHHEBBnG-BBtQBBjGgBB65DDBsDBBmrzBPBRNBwejHjH7iEl+uBl+uBBsBBDWBhRCBSHBDGBfDBz6rYvHB', false)),
319
+ Inscriptional_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g7iCSGH', true)),
320
+ Inscriptional_Parthian: () => new UnicodeRangeTable(decodeRanges('g6iCVDH', true)),
321
+ Javanese: () => new UnicodeRangeTable(decodeRanges('gsqBtCDJFB', true)),
322
+ Kaithi: () => new UnicodeRangeTable(decodeRanges('gkkCiCLA', true)),
323
+ Kannada: () => new UnicodeRangeTable(decodeRanges('gkDMCCCWCJCEDICCCDIBHBCDDJCC', true)),
324
+ Katakana: () => new UnicodeRangeTable(decodeRanges('hlM5CBDCBxHPBxGuBBC3CBvgzBJBCsBBzisBDBCGBCBBCgJgJBBBzBPPBCB', false)),
325
+ Kawi: () => new UnicodeRangeTable(decodeRanges('g4nCQCoBEc', true)),
326
+ Kayah_Li: () => new UnicodeRangeTable(decodeRanges('goqBtBCA', true)),
327
+ Kharoshthi: () => new UnicodeRangeTable(decodeRanges('gwiCDCBGHCCCcDCFJII', true)),
328
+ Khitan_Small_Script: () => new UnicodeRangeTable(decodeRanges('k-7C84G84GB0OBqBAB', false)),
329
+ Khmer: () => new UnicodeRangeTable(decodeRanges('g8F9CDJHJnPf', true)),
330
+ Khojki: () => new UnicodeRangeTable(decodeRanges('gwkCRCuB', true)),
331
+ Khudawadi: () => new UnicodeRangeTable(decodeRanges('w1kC6BGJ', true)),
332
+ Kirat_Rai: () => new UnicodeRangeTable(decodeRanges('gq7C5B', true)),
333
+ Lao: () => new UnicodeRangeTable(decodeRanges('h0DBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDB', false)),
334
+ Latin: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBQQGWBCeBCgOBoBEB8wGlBBHwBBGDBGMBClCBiC-HByLOORMBuEBBHccSoBB42CfBj1elDBEiCBDBBCCCBGBWNBxZqBBCIBCDB38TGB7gBZBHZBmhCFBCpBBCIBm61BeBHFB', false)),
335
+ Lepcha: () => new UnicodeRangeTable(decodeRanges('ggH3BEOEC', true)),
336
+ Limbu: () => new UnicodeRangeTable(decodeRanges('goGeBCLBFLBFEEBKB', false)),
337
+ Linear_A: () => new UnicodeRangeTable(decodeRanges('gwhC2JKVLH', true)),
338
+ Linear_B: () => new UnicodeRangeTable(decodeRanges('gggCLCZCSCBCODNjB6D', true)),
339
+ Lisu: () => new UnicodeRangeTable(decodeRanges('wmpBvBx1eA', true)),
340
+ Lycian: () => new UnicodeRangeTable(decodeRanges('g0gCc', true)),
341
+ Lydian: () => new UnicodeRangeTable(decodeRanges('gpiCZGA', true)),
342
+ Mahajani: () => new UnicodeRangeTable(decodeRanges('wqkCmB', true)),
343
+ Makasar: () => new UnicodeRangeTable(decodeRanges('g3nCY', true)),
344
+ Malayalam: () => new UnicodeRangeTable(decodeRanges('goDMCCCyBCCCFFPDZ', true)),
345
+ Mandaic: () => new UnicodeRangeTable(decodeRanges('giCbDA', true)),
346
+ Manichaean: () => new UnicodeRangeTable(decodeRanges('g2iCmBFL', true)),
347
+ Marchen: () => new UnicodeRangeTable(decodeRanges('wjnCfDVCN', true)),
348
+ Masaram_Gondi: () => new UnicodeRangeTable(decodeRanges('gonCGBCBBCrBBECCBCCBHBJJB', false)),
349
+ Medefaidrin: () => new UnicodeRangeTable(decodeRanges('gy7C6C', true)),
350
+ Meetei_Mayek: () => new UnicodeRangeTable(decodeRanges('g3qBWqGtBDJ', true)),
351
+ Mende_Kikakui: () => new UnicodeRangeTable(decodeRanges('gg6DkGDP', true)),
352
+ Meroitic_Cursive: () => new UnicodeRangeTable(decodeRanges('gtiCXFTDtB', true)),
353
+ Meroitic_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('gsiCf', true)),
354
+ Miao: () => new UnicodeRangeTable(decodeRanges('g47CqCF4BIQ', true)),
355
+ Modi: () => new UnicodeRangeTable(decodeRanges('gwlCkCMJ', true)),
356
+ Mongolian: () => new UnicodeRangeTable(decodeRanges('ggGBBDCCBSBH4CBIqBB2t-BMB', false)),
357
+ Mro: () => new UnicodeRangeTable(decodeRanges('gy6CeCJFB', true)),
358
+ Multani: () => new UnicodeRangeTable(decodeRanges('g0kCGBCCCBCBCOBCKB', false)),
359
+ Myanmar: () => new UnicodeRangeTable(decodeRanges('ggE-EhqmBeiDfxibT', true)),
360
+ Nabataean: () => new UnicodeRangeTable(decodeRanges('gkiCeJI', true)),
361
+ Nag_Mundari: () => new UnicodeRangeTable(decodeRanges('wm5DpB', true)),
362
+ Nandinagari: () => new UnicodeRangeTable(decodeRanges('gtmCHDtBDK', true)),
363
+ New_Tai_Lue: () => new UnicodeRangeTable(decodeRanges('gsGrBFZHKEB', true)),
364
+ Newa: () => new UnicodeRangeTable(decodeRanges('gglC7CCE', true)),
365
+ Nko: () => new UnicodeRangeTable(decodeRanges('g+B6BDC', true)),
366
+ Nushu: () => new UnicodeRangeTable(decodeRanges('h-7CvsQvsQBqMB', false)),
367
+ Nyiakeng_Puachue_Hmong: () => new UnicodeRangeTable(decodeRanges('go4DsBENDJFB', true)),
368
+ Ogham: () => new UnicodeRangeTable(decodeRanges('g0Fc', true)),
369
+ Ol_Chiki: () => new UnicodeRangeTable(decodeRanges('wiHvB', true)),
370
+ Ol_Onal: () => new UnicodeRangeTable(decodeRanges('wu5DqBFA', true)),
371
+ Old_Hungarian: () => new UnicodeRangeTable(decodeRanges('gkjCyBOyBIF', true)),
372
+ Old_Italic: () => new UnicodeRangeTable(decodeRanges('g4gCjBKC', true)),
373
+ Old_North_Arabian: () => new UnicodeRangeTable(decodeRanges('g0iCf', true)),
374
+ Old_Permic: () => new UnicodeRangeTable(decodeRanges('w6gCqB', true)),
375
+ Old_Persian: () => new UnicodeRangeTable(decodeRanges('g9gCjBFN', true)),
376
+ Old_Sogdian: () => new UnicodeRangeTable(decodeRanges('g4jCnB', true)),
377
+ Old_South_Arabian: () => new UnicodeRangeTable(decodeRanges('gziCf', true)),
378
+ Old_Turkic: () => new UnicodeRangeTable(decodeRanges('ggjCoC', true)),
379
+ Old_Uyghur: () => new UnicodeRangeTable(decodeRanges('w7jCZ', true)),
380
+ Oriya: () => new UnicodeRangeTable(decodeRanges('h4CCCHDBDVCGCBCEDIDBDCICFBCEDR', true)),
381
+ Osage: () => new UnicodeRangeTable(decodeRanges('wlhCjBFjB', true)),
382
+ Osmanya: () => new UnicodeRangeTable(decodeRanges('gkhCdDJ', true)),
383
+ Pahawh_Hmong: () => new UnicodeRangeTable(decodeRanges('g46ClCLJCGCUGS', true)),
384
+ Palmyrene: () => new UnicodeRangeTable(decodeRanges('gjiCf', true)),
385
+ Pau_Cin_Hau: () => new UnicodeRangeTable(decodeRanges('g2mC4B', true)),
386
+ Phags_Pa: () => new UnicodeRangeTable(decodeRanges('giqB3B', true)),
387
+ Phoenician: () => new UnicodeRangeTable(decodeRanges('goiCbEA', true)),
388
+ Psalter_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g8iCRIDNG', true)),
389
+ Rejang: () => new UnicodeRangeTable(decodeRanges('wpqBjBMA', true)),
390
+ Runic: () => new UnicodeRangeTable(decodeRanges('g1FqCEK', true)),
391
+ Samaritan: () => new UnicodeRangeTable(decodeRanges('ggCtBDO', true)),
392
+ Saurashtra: () => new UnicodeRangeTable(decodeRanges('gkqBlCJL', true)),
393
+ Sharada: () => new UnicodeRangeTable(decodeRanges('gskC-C', true)),
394
+ Shavian: () => new UnicodeRangeTable(decodeRanges('wihCvB', true)),
395
+ Siddham: () => new UnicodeRangeTable(decodeRanges('gslC1BDlB', true)),
396
+ SignWriting: () => new UnicodeRangeTable(decodeRanges('gg2DrUQECO', true)),
397
+ Sinhala: () => new UnicodeRangeTable(decodeRanges('hsDCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBt-gCTB', false)),
398
+ Sogdian: () => new UnicodeRangeTable(decodeRanges('w5jCpB', true)),
399
+ Sora_Sompeng: () => new UnicodeRangeTable(decodeRanges('wmkCYIJ', true)),
400
+ Soyombo: () => new UnicodeRangeTable(decodeRanges('wymCyC', true)),
401
+ Sundanese: () => new UnicodeRangeTable(decodeRanges('g8G-BhIH', true)),
402
+ Sunuwar: () => new UnicodeRangeTable(decodeRanges('g+mChBPJ', true)),
403
+ Syloti_Nagri: () => new UnicodeRangeTable(decodeRanges('ggqBsB', true)),
404
+ Syriac: () => new UnicodeRangeTable(decodeRanges('g4BNC7BDCxIK', true)),
405
+ Tagalog: () => new UnicodeRangeTable(decodeRanges('g4FVKA', true)),
406
+ Tagbanwa: () => new UnicodeRangeTable(decodeRanges('g7FMCCCB', true)),
407
+ Tai_Le: () => new UnicodeRangeTable(decodeRanges('wqGdDE', true)),
408
+ Tai_Tham: () => new UnicodeRangeTable(decodeRanges('gxG+BCcDKHJHN', true)),
409
+ Tai_Viet: () => new UnicodeRangeTable(decodeRanges('g0qBiCZE', true)),
410
+ Takri: () => new UnicodeRangeTable(decodeRanges('g0lC5BHJ', true)),
411
+ Tamil: () => new UnicodeRangeTable(decodeRanges('i8CBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBm+kCxBBOAB', false)),
412
+ Tangsa: () => new UnicodeRangeTable(decodeRanges('wz6CuCCJ', true)),
413
+ Tangut: () => new UnicodeRangeTable(decodeRanges('g-7CgBgBB2-FBJ-XBhQIB', false)),
414
+ Telugu: () => new UnicodeRangeTable(decodeRanges('ggDMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIIB', false)),
415
+ Thaana: () => new UnicodeRangeTable(decodeRanges('g8BxB', true)),
416
+ Thai: () => new UnicodeRangeTable(decodeRanges('hwD5BGb', true)),
417
+ Tibetan: () => new UnicodeRangeTable(decodeRanges('g4DnCCjBFmBCjBCOCGFB', true)),
418
+ Tifinagh: () => new UnicodeRangeTable(decodeRanges('wpL3BIBPA', true)),
419
+ Tirhuta: () => new UnicodeRangeTable(decodeRanges('gklCnCJJ', true)),
420
+ Todhri: () => new UnicodeRangeTable(decodeRanges('guhCzB', true)),
421
+ Toto: () => new UnicodeRangeTable(decodeRanges('w04De', true)),
422
+ Tulu_Tigalari: () => new UnicodeRangeTable(decodeRanges('g8kCJBCDDClBBCJBCDDCDBCJBCBBJBB', false)),
423
+ Ugaritic: () => new UnicodeRangeTable(decodeRanges('g8gCdCA', true)),
424
+ 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)),
425
+ Vai: () => new UnicodeRangeTable(decodeRanges('gopBrJ', true)),
426
+ Vithkuqi: () => new UnicodeRangeTable(decodeRanges('wrhCKCOCGCBCKCOCGCB', true)),
427
+ Wancho: () => new UnicodeRangeTable(decodeRanges('g24D5BGA', true)),
428
+ Warang_Citi: () => new UnicodeRangeTable(decodeRanges('glmCyCNA', true)),
429
+ Yezidi: () => new UnicodeRangeTable(decodeRanges('g0jCpBCCDB', true)),
430
+ Yi: () => new UnicodeRangeTable(decodeRanges('ggoBskBE2B', true)),
431
+ Zanabazar_Square: () => new UnicodeRangeTable(decodeRanges('gwmCnC', true))
432
+ });
433
+ static FOLD_CATEGORIES = new LazyMap({
434
+ C: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
435
+ Cn: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
436
+ L: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
437
+ LC: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
438
+ Ll: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiBuBCEECDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIBBCBBCBBCOCDQCDBBCCCBBBC4BCIBBCBBDCCBCBCGC3HrBrBCEEJHHCCBCCCBCCBPBCIBkBJJCUCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBZHBJHBJHBJEBMEBMDBNEBMEBqJEEBHHxC9zC9zCBuBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEECKCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBh1ehBB', false)),
439
+ Lt: () => new UnicodeRangeTable(decodeRanges('kOCCBCCBCClBCCtsHHBJHBJHBMQQwBAB', false)),
440
+ Lu: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBCuBCEECDOCDsBCDECBBBDCCDEEGDDECBDDDCCCDFFDEECDDECCGBBCBBCBBCOCBSCDBBCEECkBCEQCJDDBCCFICBEBCBBCCCBEEBCCBCBCEBDCCBDDIDDCBBEFBGLLBnFnFsBCCEEEBBBvBDBCdBCBBECBCWCBDBCGD1BvBBCgBCK0BCDMCBgDCyBlBBq6CqBBDCB5XFBjkCIBCvHvHERRzD0ECGGGC8CCBHBJFBLHBJHBJFBMGCJHBJNBzBBBNSSBPPBEEpL2B2Bs1CvBBCEEBGCHDDLiDCJCCFNNBkBBCGG0oesBCUaCoEMCE8BCLCCDICFFFCBBDSCMOCFCCDEEGECb9a9advCBi8UZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfBj1ehBB', false)),
441
+ M: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
442
+ Mn: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false))
443
+ });
444
+ static FOLD_SCRIPT = new LazyMap({
445
+ Common: () => new UnicodeRangeTable(decodeRanges('8cgBgB', false)),
446
+ Greek: () => new UnicodeRangeTable(decodeRanges('1FwUwU', false)),
447
+ Inherited: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
448
+ Latin: () => new UnicodeRangeTable(decodeRanges('y+pBCC', false)),
449
+ Unknown: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false))
450
+ });
346
451
  }
347
452
 
348
453
  /**
@@ -595,7 +700,7 @@ class Utils {
595
700
 
596
701
  // Returns the array of runes in the specified Java UTF-16 string.
597
702
  static stringToRunes(str) {
598
- return String(str).split('').map(s => s.codePointAt(0));
703
+ return Array.from(String(str)).map(s => s.codePointAt(0));
599
704
  }
600
705
 
601
706
  // Returns the Java UTF-16 string containing the single rune |r|.
@@ -866,6 +971,14 @@ class MachineInputBase {
866
971
  endPos() {
867
972
  return this.end;
868
973
  }
974
+ hasString() {
975
+ return false;
976
+ }
977
+
978
+ // Helper for the exact-literal fast-path execution router
979
+ prefixLength() {
980
+ return 0;
981
+ }
869
982
  }
870
983
 
871
984
  // An implementation of MachineInput for UTF-8 byte arrays.
@@ -877,6 +990,14 @@ class MachineUTF8Input extends MachineInputBase {
877
990
  this.start = start;
878
991
  this.end = end;
879
992
  }
993
+ hasString(prefilter, pos) {
994
+ const target = prefilter.bytes;
995
+ if (target.length === 0) return true;
996
+
997
+ // Reuse the high-speed indexOf method already implemented below
998
+ const idx = this.indexOf(this.bytes, target, this.start + pos);
999
+ return idx !== -1 && idx <= this.end - target.length;
1000
+ }
880
1001
 
881
1002
  // Returns the rune at the specified index; the units are
882
1003
  // unspecified, but could be UTF-8 byte, UTF-16 char, or rune
@@ -953,10 +1074,10 @@ class MachineUTF8Input extends MachineInputBase {
953
1074
  indexOf(source, target, fromIndex = 0) {
954
1075
  let targetLength = target.length;
955
1076
  if (targetLength === 0) {
956
- return -1;
1077
+ return fromIndex <= this.end ? fromIndex : -1;
957
1078
  }
958
- let sourceLength = source.length;
959
- for (let i = fromIndex; i <= sourceLength - targetLength; i++) {
1079
+ let limit = this.end - targetLength;
1080
+ for (let i = fromIndex; i <= limit; i++) {
960
1081
  for (let j = 0; j < targetLength; j++) {
961
1082
  if (source[i + j] !== target[j]) {
962
1083
  break;
@@ -967,6 +1088,9 @@ class MachineUTF8Input extends MachineInputBase {
967
1088
  }
968
1089
  return -1;
969
1090
  }
1091
+ prefixLength(re2) {
1092
+ return re2.prefixUTF8.length;
1093
+ }
970
1094
  }
971
1095
 
972
1096
  // |pos| and |width| are in JS "char" units.
@@ -977,6 +1101,10 @@ class MachineUTF16Input extends MachineInputBase {
977
1101
  this.start = start;
978
1102
  this.end = end;
979
1103
  }
1104
+ hasString(prefilter, pos) {
1105
+ const idx = this.charSequence.indexOf(prefilter.str, this.start + pos);
1106
+ return idx !== -1 && idx <= this.end - prefilter.str.length;
1107
+ }
980
1108
 
981
1109
  // Returns the rune at the specified index; the units are
982
1110
  // unspecified, but could be UTF-8 byte, UTF-16 char, or rune
@@ -1022,6 +1150,9 @@ class MachineUTF16Input extends MachineInputBase {
1022
1150
  const r2 = pos < this.charSequence.length ? this.charSequence.codePointAt(pos) : -1;
1023
1151
  return Utils.emptyOpContext(r1, r2);
1024
1152
  }
1153
+ prefixLength(re2) {
1154
+ return re2.prefix.length;
1155
+ }
1025
1156
  }
1026
1157
  class MachineInput {
1027
1158
  static fromUTF8(bytes, start = 0, end = bytes.length) {
@@ -1112,6 +1243,17 @@ class RE2JSFlagsException extends RE2JSException {
1112
1243
  }
1113
1244
  }
1114
1245
 
1246
+ /**
1247
+ * An exception thrown for internal engine errors, such as corrupted bytecodes.
1248
+ */
1249
+ class RE2JSInternalException extends RE2JSException {
1250
+ /** @param {string} message */
1251
+ constructor(message) {
1252
+ super(message);
1253
+ this.name = 'RE2JSInternalException';
1254
+ }
1255
+ }
1256
+
1115
1257
  /**
1116
1258
  * A stateful iterator that interprets a regex {@code RE2JS} on a specific input.
1117
1259
  *
@@ -1314,6 +1456,23 @@ class Matcher {
1314
1456
  }
1315
1457
  return this.substring(start, end);
1316
1458
  }
1459
+
1460
+ /**
1461
+ * Returns a dictionary map of all named capturing groups and their matched values.
1462
+ * If a group was not matched, its value will be `null`.
1463
+ * @returns {Record<string, string|null>}
1464
+ */
1465
+ getNamedGroups() {
1466
+ if (!this.hasMatch) {
1467
+ throw new RE2JSGroupException('perhaps no match attempted');
1468
+ }
1469
+ const result = {};
1470
+ for (const name of Object.keys(this.namedGroups)) {
1471
+ result[name] = this.group(name);
1472
+ }
1473
+ return result;
1474
+ }
1475
+
1317
1476
  /**
1318
1477
  * Returns the number of subgroups in this pattern.
1319
1478
  *
@@ -1738,16 +1897,20 @@ class Inst {
1738
1897
  }
1739
1898
  return r === r0;
1740
1899
  }
1741
- // Peek at the first few pairs.
1742
- // Should handle ASCII well.
1743
- for (let j = 0; j < this.runes.length && j <= 8; j += 2) {
1744
- if (r < this.runes[j]) {
1745
- return false;
1746
- }
1747
- if (r <= this.runes[j + 1]) {
1748
- return true;
1900
+ const len = this.runes.length;
1901
+ // If the array is exactly 2, 4, 6, or 8 items, DO NOT fall through to binary search
1902
+ if (len === 2 || len === 4 || len === 6 || len === 8) {
1903
+ for (let j = 0; j < len; j += 2) {
1904
+ if (r < this.runes[j]) {
1905
+ return false;
1906
+ }
1907
+ if (r <= this.runes[j + 1]) {
1908
+ return true;
1909
+ }
1749
1910
  }
1911
+ return false; // Stop here
1750
1912
  }
1913
+
1751
1914
  // Otherwise binary search.
1752
1915
  let lo = 0;
1753
1916
  let hi = this.runes.length / 2 | 0;
@@ -1765,6 +1928,40 @@ class Inst {
1765
1928
  }
1766
1929
  return false;
1767
1930
  }
1931
+
1932
+ // matchRunePos checks whether the instruction matches (and consumes) r.
1933
+ // If so, it returns the index of the matching rune pair.
1934
+ // If not, it returns -1.
1935
+ matchRunePos(r) {
1936
+ if (this.runes.length === 1) {
1937
+ const r0 = this.runes[0];
1938
+ if ((this.arg & RE2Flags.FOLD_CASE) !== 0) {
1939
+ return Unicode.equalsIgnoreCase(r0, r) ? 0 : -1;
1940
+ }
1941
+ return r === r0 ? 0 : -1;
1942
+ }
1943
+ const len = this.runes.length;
1944
+ if (len === 2 || len === 4 || len === 6 || len === 8) {
1945
+ for (let j = 0; j < len; j += 2) {
1946
+ if (r < this.runes[j]) return -1;
1947
+ if (r <= this.runes[j + 1]) return Math.floor(j / 2);
1948
+ }
1949
+ return -1;
1950
+ }
1951
+ let lo = 0;
1952
+ let hi = Math.floor(len / 2);
1953
+ while (lo < hi) {
1954
+ const m = lo + hi >> 1;
1955
+ const c = this.runes[2 * m];
1956
+ if (c <= r) {
1957
+ if (r <= this.runes[2 * m + 1]) return m;
1958
+ lo = m + 1;
1959
+ } else {
1960
+ hi = m;
1961
+ }
1962
+ }
1963
+ return -1;
1964
+ }
1768
1965
  /**
1769
1966
  *
1770
1967
  * @returns {string}
@@ -1780,7 +1977,7 @@ class Inst {
1780
1977
  case Inst.EMPTY_WIDTH:
1781
1978
  return `empty ${this.arg} -> ${this.out}`;
1782
1979
  case Inst.MATCH:
1783
- return 'match';
1980
+ return `match${this.arg !== 0 ? ` ${this.arg}` : ''}`;
1784
1981
  case Inst.FAIL:
1785
1982
  return 'fail';
1786
1983
  case Inst.NOP:
@@ -1806,7 +2003,7 @@ class Inst {
1806
2003
  class Thread {
1807
2004
  constructor() {
1808
2005
  this.inst = null;
1809
- this.cap = [];
2006
+ this.cap = null; // Initialized to Int32Array later
1810
2007
  }
1811
2008
  }
1812
2009
 
@@ -1834,9 +2031,11 @@ class Queue {
1834
2031
  return j;
1835
2032
  }
1836
2033
  clear() {
1837
- this.sparse = [];
1838
- this.densePcs = [];
1839
- this.denseThreads = [];
2034
+ // Prevent memory leaks by nulling out used object references
2035
+ for (let i = 0; i < this.size; i++) {
2036
+ this.denseThreads[i] = null;
2037
+ }
2038
+ // The sparse set logic safely ignores stale integers in Typed Arrays.
1840
2039
  this.size = 0;
1841
2040
  }
1842
2041
  toString() {
@@ -1865,22 +2064,13 @@ class Machine {
1865
2064
  m.pool = [];
1866
2065
  m.poolSize = 0;
1867
2066
  m.matched = false;
1868
- m.matchcap = Array(m.prog.numCap < 2 ? 2 : m.prog.numCap).fill(0);
2067
+ // Use Int32Array instead of standard JS array
2068
+ m.matchcap = new Int32Array(m.prog.numCap < 2 ? 2 : m.prog.numCap);
1869
2069
  m.ncap = 0;
1870
2070
  return m;
1871
2071
  }
1872
2072
  static fromMachine(machine) {
1873
- const m = new Machine();
1874
- m.re2 = machine.re2;
1875
- m.prog = machine.prog;
1876
- m.q0 = machine.q0;
1877
- m.q1 = machine.q1;
1878
- m.pool = machine.pool;
1879
- m.poolSize = machine.poolSize;
1880
- m.matched = machine.matched;
1881
- m.matchcap = machine.matchcap;
1882
- m.ncap = machine.ncap;
1883
- return m;
2073
+ return Machine.fromRE2(machine.re2);
1884
2074
  }
1885
2075
 
1886
2076
  // init() reinitializes an existing Machine for re-use on a new input.
@@ -1889,27 +2079,30 @@ class Machine {
1889
2079
  if (ncap > this.matchcap.length) {
1890
2080
  this.initNewCap(ncap);
1891
2081
  } else {
1892
- this.resetCap(ncap);
2082
+ this.resetCap();
1893
2083
  }
1894
2084
  }
1895
- resetCap(ncap) {
2085
+
2086
+ // Wipes existing typed array memory without reallocating
2087
+ resetCap() {
1896
2088
  for (let i = 0; i < this.poolSize; i++) {
1897
2089
  const t = this.pool[i];
1898
- t.cap = Array(ncap).fill(0);
2090
+ t.cap.fill(0);
1899
2091
  }
1900
2092
  }
1901
2093
  initNewCap(ncap) {
1902
2094
  for (let i = 0; i < this.poolSize; i++) {
1903
2095
  const t = this.pool[i];
1904
- t.cap = Array(ncap).fill(0);
2096
+ t.cap = new Int32Array(ncap);
1905
2097
  }
1906
- this.matchcap = Array(ncap).fill(0);
2098
+ this.matchcap = new Int32Array(ncap);
1907
2099
  }
1908
2100
  submatches() {
1909
2101
  if (this.ncap === 0) {
1910
2102
  return Utils.emptyInts();
1911
2103
  }
1912
- return this.matchcap.slice(0, this.ncap);
2104
+ // Use subarray() to create a zero-allocation view before converting
2105
+ return Array.from(this.matchcap.subarray(0, this.ncap));
1913
2106
  }
1914
2107
 
1915
2108
  // alloc() allocates a new thread with the given instruction.
@@ -1921,6 +2114,7 @@ class Machine {
1921
2114
  t = this.pool[this.poolSize];
1922
2115
  } else {
1923
2116
  t = new Thread();
2117
+ t.cap = new Int32Array(this.matchcap.length);
1924
2118
  }
1925
2119
  t.inst = inst;
1926
2120
  return t;
@@ -1928,16 +2122,10 @@ class Machine {
1928
2122
 
1929
2123
  // Frees all threads on the thread queue, returning them to the free pool.
1930
2124
  freeQueue(queue, from = 0) {
1931
- const numberOfThread = queue.size - from;
1932
- const requiredPoolLength = this.poolSize + numberOfThread;
1933
- if (this.pool.length < requiredPoolLength) {
1934
- this.pool = this.pool.slice(0, Math.max(this.pool.length * 2, requiredPoolLength));
1935
- }
1936
2125
  for (let i = from; i < queue.size; i++) {
1937
2126
  const t = queue.denseThreads[i];
1938
2127
  if (t !== null) {
1939
- this.pool[this.poolSize] = t;
1940
- this.poolSize++;
2128
+ this.pool[this.poolSize++] = t;
1941
2129
  }
1942
2130
  }
1943
2131
  queue.clear();
@@ -1945,11 +2133,7 @@ class Machine {
1945
2133
 
1946
2134
  // freeThread() returns t to the free pool.
1947
2135
  freeThread(t) {
1948
- if (this.pool.length <= this.poolSize) {
1949
- this.pool = this.pool.slice(0, this.pool.length * 2);
1950
- }
1951
- this.pool[this.poolSize] = t;
1952
- this.poolSize++;
2136
+ this.pool[this.poolSize++] = t;
1953
2137
  }
1954
2138
  match(input, pos, anchor) {
1955
2139
  const startCond = this.re2.cond;
@@ -1960,7 +2144,7 @@ class Machine {
1960
2144
  return false;
1961
2145
  }
1962
2146
  this.matched = false;
1963
- this.matchcap = Array(this.prog.numCap).fill(-1);
2147
+ this.matchcap.fill(-1);
1964
2148
  let runq = this.q0;
1965
2149
  let nextq = this.q1;
1966
2150
  let r = input.step(pos);
@@ -2031,6 +2215,85 @@ class Machine {
2031
2215
  this.freeQueue(nextq);
2032
2216
  return this.matched;
2033
2217
  }
2218
+ matchSet(input, pos, anchor) {
2219
+ const startCond = this.re2.cond;
2220
+ if (startCond === Utils.EMPTY_ALL) return [];
2221
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2222
+ return [];
2223
+ }
2224
+ let runq = this.q0;
2225
+ let nextq = this.q1;
2226
+ let r = input.step(pos);
2227
+ let rune = r >> 3;
2228
+ let width = r & 7;
2229
+ let rune1 = -1;
2230
+ let width1 = 0;
2231
+ if (r !== MachineInputBase.EOF()) {
2232
+ r = input.step(pos + width);
2233
+ rune1 = r >> 3;
2234
+ width1 = r & 7;
2235
+ }
2236
+ let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
2237
+ const matches = new Set();
2238
+ while (true) {
2239
+ if (runq.isEmpty()) {
2240
+ if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) break;
2241
+ }
2242
+ if (pos === 0 || anchor === RE2Flags.UNANCHORED) {
2243
+ this.add(runq, this.prog.start, pos, this.matchcap, flag, null);
2244
+ }
2245
+ const nextPos = pos + width;
2246
+ flag = input.context(nextPos);
2247
+ for (let j = 0; j < runq.size; j++) {
2248
+ let t = runq.denseThreads[j];
2249
+ if (t === null) continue;
2250
+ const i = t.inst;
2251
+ let add = false;
2252
+ switch (i.op) {
2253
+ case Inst.MATCH:
2254
+ if (anchor === RE2Flags.ANCHOR_BOTH && pos !== input.endPos()) break;
2255
+ matches.add(i.arg); // Record the matched Set ID
2256
+ break;
2257
+ case Inst.RUNE:
2258
+ add = i.matchRune(rune);
2259
+ break;
2260
+ case Inst.RUNE1:
2261
+ add = rune === i.runes[0];
2262
+ break;
2263
+ case Inst.RUNE_ANY:
2264
+ add = true;
2265
+ break;
2266
+ case Inst.RUNE_ANY_NOT_NL:
2267
+ add = rune !== Codepoint.CODES.get('\n');
2268
+ break;
2269
+ default:
2270
+ throw new RE2JSInternalException('bad inst');
2271
+ }
2272
+ if (add) {
2273
+ t = this.add(nextq, i.out, nextPos, t.cap, flag, t);
2274
+ }
2275
+ if (t !== null) {
2276
+ this.freeThread(t);
2277
+ runq.denseThreads[j] = null;
2278
+ }
2279
+ }
2280
+ runq.clear();
2281
+ if (width === 0) break;
2282
+ pos += width;
2283
+ rune = rune1;
2284
+ width = width1;
2285
+ if (rune !== -1) {
2286
+ r = input.step(pos + width);
2287
+ rune1 = r >> 3;
2288
+ width1 = r & 7;
2289
+ }
2290
+ const tmpq = runq;
2291
+ runq = nextq;
2292
+ nextq = tmpq;
2293
+ }
2294
+ this.freeQueue(nextq);
2295
+ return Array.from(matches).sort((a, b) => a - b);
2296
+ }
2034
2297
  step(runq, nextq, pos, nextPos, c, nextCond, anchor, atEnd) {
2035
2298
  const longest = this.re2.longest;
2036
2299
  for (let j = 0; j < runq.size; j++) {
@@ -2051,7 +2314,9 @@ class Machine {
2051
2314
  }
2052
2315
  if (this.ncap > 0 && (!longest || !this.matched || this.matchcap[1] < pos)) {
2053
2316
  t.cap[1] = pos;
2054
- this.matchcap = t.cap.slice(0, this.ncap);
2317
+ // Using subarray creates a fast view, avoiding a full array copy
2318
+ // until the submatches are finalized at the very end.
2319
+ this.matchcap.set(t.cap.subarray(0, this.ncap));
2055
2320
  }
2056
2321
  if (!longest) {
2057
2322
  this.freeQueue(runq, j + 1);
@@ -2071,7 +2336,7 @@ class Machine {
2071
2336
  add = c !== Codepoint.CODES.get('\n');
2072
2337
  break;
2073
2338
  default:
2074
- throw new Error('bad inst');
2339
+ throw new RE2JSInternalException('bad inst');
2075
2340
  }
2076
2341
  if (add) {
2077
2342
  t = this.add(nextq, i.out, nextPos, t.cap, nextCond, t);
@@ -2129,7 +2394,10 @@ class Machine {
2129
2394
  t.inst = inst;
2130
2395
  }
2131
2396
  if (this.ncap > 0 && t.cap !== cap) {
2132
- t.cap = cap.slice(0, this.ncap);
2397
+ // Direct assignment utilizing Typed Array performance
2398
+ for (let c = 0; c < this.ncap; c++) {
2399
+ t.cap[c] = cap[c];
2400
+ }
2133
2401
  }
2134
2402
  q.denseThreads[d] = t;
2135
2403
  t = null;
@@ -2161,20 +2429,24 @@ const arraysEqual = (a, b) => {
2161
2429
  return true;
2162
2430
  };
2163
2431
  class DFAState {
2164
- constructor(nfaStates, isMatch) {
2432
+ constructor(nfaStates, isMatch, matchIDs = []) {
2165
2433
  this.nfaStates = nfaStates; // Int32Array of Instruction PCs
2166
2434
  this.isMatch = isMatch; // Boolean
2435
+ this.matchIDs = matchIDs; // Array of integers indicating which Set patterns matched
2167
2436
  this.nextAscii = new Array(Unicode.MAX_ASCII + 1).fill(null); // Flat array for blisteringly fast ASCII lookups
2168
2437
  this.nextMap = new Map(); // Cache of Char -> DFAState
2169
2438
  }
2170
2439
  }
2171
2440
  class DFA {
2441
+ static MAX_CACHE_CLEARS = 5;
2172
2442
  constructor(prog) {
2173
2443
  this.prog = prog;
2174
2444
  this.stateCache = new Map(); // hash(number) -> DFAState[]
2175
2445
  this.stateCount = 0; // Tracks total states for memory limits
2176
2446
  this.startState = null;
2177
2447
  this.stateLimit = 10000; // Prevent memory explosion (ReDoS protection)
2448
+ this.cacheClears = 0; // Track thrashing
2449
+ this.failed = false; // mark if DFA cannot work with provided prog
2178
2450
  }
2179
2451
 
2180
2452
  // Follows epsilon (empty) transitions to find all reachable states without consuming a char
@@ -2182,6 +2454,7 @@ class DFA {
2182
2454
  const closure = new Set();
2183
2455
  const stack = [...pcs];
2184
2456
  let isMatch = false;
2457
+ const matchIDs = [];
2185
2458
  while (stack.length > 0) {
2186
2459
  const pc = stack.pop();
2187
2460
  if (closure.has(pc)) continue;
@@ -2190,6 +2463,7 @@ class DFA {
2190
2463
  switch (inst.op) {
2191
2464
  case Inst.MATCH:
2192
2465
  isMatch = true;
2466
+ if (!matchIDs.includes(inst.arg)) matchIDs.push(inst.arg);
2193
2467
  break;
2194
2468
  case Inst.ALT:
2195
2469
  case Inst.ALT_MATCH:
@@ -2207,9 +2481,11 @@ class DFA {
2207
2481
  }
2208
2482
  }
2209
2483
  const sortedPCs = Int32Array.from(closure).sort();
2484
+ matchIDs.sort((a, b) => a - b);
2210
2485
  return {
2211
2486
  pcs: sortedPCs,
2212
- isMatch
2487
+ isMatch,
2488
+ matchIDs
2213
2489
  };
2214
2490
  }
2215
2491
 
@@ -2236,17 +2512,27 @@ class DFA {
2236
2512
  this.stateCache.set(hash, bucket);
2237
2513
  }
2238
2514
 
2515
+ // DFA already failed once - exit
2516
+ if (this.failed) return null;
2517
+
2239
2518
  // Safety: prevent memory exhaustion from state explosion
2240
2519
  // We flush the cache and return null, which seamlessly routes execution to the NFA
2241
2520
  if (this.stateCount >= this.stateLimit) {
2242
2521
  this.stateCache.clear();
2243
2522
  this.stateCount = 0;
2244
2523
  this.startState = null;
2524
+ this.cacheClears++;
2525
+
2526
+ // If this regex causes continuous cache thrashing, permanently fall back to NFA
2527
+ // to avoid spending CPU cycles constantly rebuilding the DFA tree.
2528
+ if (this.cacheClears >= DFA.MAX_CACHE_CLEARS) {
2529
+ this.failed = true;
2530
+ }
2245
2531
  return null;
2246
2532
  }
2247
2533
 
2248
2534
  // State not found, create it and add to bucket
2249
- const state = new DFAState(sortedPCs, closureResult.isMatch);
2535
+ const state = new DFAState(sortedPCs, closureResult.isMatch, closureResult.matchIDs);
2250
2536
  bucket.push(state);
2251
2537
  this.stateCount++;
2252
2538
  return state;
@@ -2274,68 +2560,800 @@ class DFA {
2274
2560
  nextPCs.push(inst.out);
2275
2561
  }
2276
2562
  }
2277
- if (anchor === RE2Flags.UNANCHORED) {
2278
- nextPCs.push(this.prog.start);
2563
+ if (anchor === RE2Flags.UNANCHORED) {
2564
+ nextPCs.push(this.prog.start);
2565
+ }
2566
+ const nextState = this.getState(nextPCs);
2567
+
2568
+ // Cache the result
2569
+ if (anchor === RE2Flags.UNANCHORED && charCode <= Unicode.MAX_ASCII) {
2570
+ state.nextAscii[charCode] = nextState;
2571
+ } else {
2572
+ const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
2573
+ state.nextMap.set(key, nextState);
2574
+ }
2575
+ return nextState;
2576
+ }
2577
+
2578
+ // The hot loop: Execute the Lazy DFA
2579
+ match(input, pos, anchor) {
2580
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2581
+ return false;
2582
+ }
2583
+ if (!this.startState) {
2584
+ this.startState = this.getState([this.prog.start]);
2585
+ if (!this.startState) return null; // Fallback to NFA
2586
+ }
2587
+ let endPos = input.endPos();
2588
+ let currentState = this.startState;
2589
+ if (currentState.isMatch) {
2590
+ if (anchor === RE2Flags.ANCHOR_BOTH) {
2591
+ if (pos === endPos) return true;
2592
+ } else {
2593
+ return true;
2594
+ }
2595
+ }
2596
+ let i = pos;
2597
+ while (i < endPos) {
2598
+ const r = input.step(i);
2599
+ const rune = r >> 3;
2600
+ const width = r & 7;
2601
+
2602
+ // prevent infinite loop on EOF
2603
+ if (width === 0) {
2604
+ break;
2605
+ }
2606
+ currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
2607
+
2608
+ // If we hit an unrecoverable DFA error or bailout, signal fallback
2609
+ if (currentState === null) return null;
2610
+ if (currentState.isMatch) {
2611
+ if (anchor === RE2Flags.ANCHOR_BOTH) {
2612
+ if (i + width === endPos) return true;
2613
+ } else {
2614
+ return true;
2615
+ }
2616
+ }
2617
+
2618
+ // If we hit a dead end, and anchored, fail early
2619
+ if (currentState.nfaStates.length === 0) {
2620
+ if (anchor !== RE2Flags.UNANCHORED) return false;
2621
+ }
2622
+ i += width;
2623
+ }
2624
+ return false;
2625
+ }
2626
+
2627
+ // The hot loop for evaluating Multi-Pattern Sets
2628
+ matchSet(input, pos, anchor) {
2629
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2630
+ return [];
2631
+ }
2632
+ if (!this.startState) {
2633
+ this.startState = this.getState([this.prog.start]);
2634
+ if (!this.startState) return null; // Fallback to NFA
2635
+ }
2636
+ let endPos = input.endPos();
2637
+ let currentState = this.startState;
2638
+ const matches = new Set();
2639
+ const checkMatch = (state, currentPos) => {
2640
+ if (state.isMatch) {
2641
+ if (anchor === RE2Flags.ANCHOR_BOTH) {
2642
+ if (currentPos === endPos) {
2643
+ state.matchIDs.forEach(id => matches.add(id));
2644
+ }
2645
+ } else {
2646
+ state.matchIDs.forEach(id => matches.add(id));
2647
+ }
2648
+ }
2649
+ };
2650
+ checkMatch(currentState, pos);
2651
+ let i = pos;
2652
+ while (i < endPos) {
2653
+ const r = input.step(i);
2654
+ const rune = r >> 3;
2655
+ const width = r & 7;
2656
+ if (width === 0) break;
2657
+ currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
2658
+ if (currentState === null) return null; // Bailout to NFA
2659
+
2660
+ i += width;
2661
+ checkMatch(currentState, i);
2662
+ if (currentState.nfaStates.length === 0) {
2663
+ if (anchor !== RE2Flags.UNANCHORED) break;
2664
+ }
2665
+ }
2666
+ return Array.from(matches).sort((a, b) => a - b);
2667
+ }
2668
+ }
2669
+
2670
+ const VISITED_BITS = 32;
2671
+ const MAX_BACKTRACK_PROG = 500;
2672
+ const INITIAL_JOB_CAPACITY = 256; // Starting size for the job stack arrays
2673
+ const MAX_BACKTRACK_VECTOR = 256 * 1024; // 32 KB limit for the visited bit-mask
2674
+
2675
+ class BitState {
2676
+ constructor() {
2677
+ this.end = 0;
2678
+ this.cap = new Int32Array(0);
2679
+ this.matchcap = new Int32Array(0);
2680
+ this.ncap = 0;
2681
+
2682
+ // Parallel arrays acting as the backtrack job stack
2683
+ this.jobPc = new Int32Array(INITIAL_JOB_CAPACITY);
2684
+ this.jobArg = new Uint8Array(INITIAL_JOB_CAPACITY);
2685
+ this.jobPos = new Int32Array(INITIAL_JOB_CAPACITY);
2686
+ this.jobLen = 0;
2687
+ this.visited = new Uint32Array(0);
2688
+ }
2689
+ reset(prog, end, ncap) {
2690
+ this.end = end;
2691
+ this.jobLen = 0;
2692
+ this.ncap = ncap;
2693
+
2694
+ // Bitwise shift (>>> 5) instead of Math.floor( / 32)
2695
+ const visitedSize = prog.numInst() * (end + 1) + VISITED_BITS - 1 >>> 5;
2696
+ if (this.visited.length < visitedSize) {
2697
+ this.visited = new Uint32Array(Math.floor(MAX_BACKTRACK_VECTOR / VISITED_BITS));
2698
+ } else {
2699
+ this.visited.fill(0, 0, visitedSize);
2700
+ }
2701
+ if (this.cap.length < ncap) {
2702
+ // Must explicitly fill with -1 as Int32Array defaults to 0
2703
+ this.cap = new Int32Array(ncap).fill(-1);
2704
+ } else {
2705
+ this.cap.fill(-1, 0, ncap);
2706
+ }
2707
+ if (this.matchcap.length < ncap) {
2708
+ this.matchcap = new Int32Array(ncap).fill(-1);
2709
+ } else {
2710
+ this.matchcap.fill(-1, 0, ncap);
2711
+ }
2712
+ }
2713
+ shouldVisit(pc, pos) {
2714
+ const n = pc * (this.end + 1) + pos;
2715
+ const idx = n >>> 5; // Equivalent to Math.floor(n / 32)
2716
+ const mask = 1 << (n & 31); // Equivalent to n % 32
2717
+
2718
+ if ((this.visited[idx] & mask) !== 0) {
2719
+ return false;
2720
+ }
2721
+ this.visited[idx] |= mask;
2722
+ return true;
2723
+ }
2724
+ push(re2, pc, pos, arg) {
2725
+ if (re2.prog.getInst(pc).op !== Inst.FAIL && (arg || this.shouldVisit(pc, pos))) {
2726
+ if (this.jobLen >= this.jobPc.length) {
2727
+ const newSize = this.jobPc.length * 2;
2728
+ const newPc = new Int32Array(newSize);
2729
+ newPc.set(this.jobPc);
2730
+ this.jobPc = newPc;
2731
+ const newArg = new Uint8Array(newSize);
2732
+ newArg.set(this.jobArg);
2733
+ this.jobArg = newArg;
2734
+ const newPos = new Int32Array(newSize);
2735
+ newPos.set(this.jobPos);
2736
+ this.jobPos = newPos;
2737
+ }
2738
+ this.jobPc[this.jobLen] = pc;
2739
+ this.jobArg[this.jobLen] = arg ? 1 : 0;
2740
+ this.jobPos[this.jobLen] = pos;
2741
+ this.jobLen++;
2742
+ }
2743
+ }
2744
+ tryBacktrack(re2, input, pc, pos, anchor) {
2745
+ const longest = re2.longest;
2746
+ this.push(re2, pc, pos, false);
2747
+ while (this.jobLen > 0) {
2748
+ this.jobLen--;
2749
+ let currentPc = this.jobPc[this.jobLen];
2750
+ let arg = this.jobArg[this.jobLen] === 1;
2751
+ let currentPos = this.jobPos[this.jobLen];
2752
+ let skipShouldVisit = true;
2753
+ while (true) {
2754
+ if (!skipShouldVisit) {
2755
+ if (!this.shouldVisit(currentPc, currentPos)) {
2756
+ break;
2757
+ }
2758
+ }
2759
+ skipShouldVisit = false;
2760
+ const inst = re2.prog.getInst(currentPc);
2761
+ switch (inst.op) {
2762
+ case Inst.FAIL:
2763
+ {
2764
+ throw new RE2JSInternalException('unexpected InstFail');
2765
+ }
2766
+ case Inst.ALT:
2767
+ {
2768
+ if (arg) {
2769
+ arg = false;
2770
+ currentPc = inst.arg;
2771
+ continue;
2772
+ } else {
2773
+ this.push(re2, currentPc, currentPos, true);
2774
+ currentPc = inst.out;
2775
+ continue;
2776
+ }
2777
+ }
2778
+ case Inst.ALT_MATCH:
2779
+ {
2780
+ const outInst = re2.prog.getInst(inst.out);
2781
+ if (Inst.isRuneOp(outInst.op)) {
2782
+ this.push(re2, inst.arg, currentPos, false);
2783
+ currentPc = inst.out;
2784
+ continue;
2785
+ }
2786
+ this.push(re2, inst.out, this.end, false);
2787
+ currentPc = inst.arg;
2788
+ continue;
2789
+ }
2790
+ case Inst.RUNE:
2791
+ {
2792
+ const r = input.step(currentPos);
2793
+ if (r === MachineInputBase.EOF()) break;
2794
+ if (!inst.matchRune(r >> 3)) break;
2795
+ currentPos += r & 7;
2796
+ currentPc = inst.out;
2797
+ continue;
2798
+ }
2799
+ case Inst.RUNE1:
2800
+ {
2801
+ const r = input.step(currentPos);
2802
+ if (r === MachineInputBase.EOF()) break;
2803
+ if (r >> 3 !== inst.runes[0]) break;
2804
+ currentPos += r & 7;
2805
+ currentPc = inst.out;
2806
+ continue;
2807
+ }
2808
+ case Inst.RUNE_ANY_NOT_NL:
2809
+ {
2810
+ const r = input.step(currentPos);
2811
+ if (r === MachineInputBase.EOF()) break;
2812
+ if (r >> 3 === 10) break;
2813
+ currentPos += r & 7;
2814
+ currentPc = inst.out;
2815
+ continue;
2816
+ }
2817
+ case Inst.RUNE_ANY:
2818
+ {
2819
+ const r = input.step(currentPos);
2820
+ if (r === MachineInputBase.EOF()) break;
2821
+ currentPos += r & 7;
2822
+ currentPc = inst.out;
2823
+ continue;
2824
+ }
2825
+ case Inst.CAPTURE:
2826
+ {
2827
+ if (arg) {
2828
+ this.cap[inst.arg] = currentPos;
2829
+ break;
2830
+ } else {
2831
+ if (inst.arg < this.ncap) {
2832
+ this.push(re2, currentPc, this.cap[inst.arg], true);
2833
+ this.cap[inst.arg] = currentPos;
2834
+ }
2835
+ currentPc = inst.out;
2836
+ continue;
2837
+ }
2838
+ }
2839
+ case Inst.EMPTY_WIDTH:
2840
+ {
2841
+ const flag = input.context(currentPos);
2842
+ if ((inst.arg & ~flag) !== 0) break;
2843
+ currentPc = inst.out;
2844
+ continue;
2845
+ }
2846
+ case Inst.NOP:
2847
+ {
2848
+ currentPc = inst.out;
2849
+ continue;
2850
+ }
2851
+ case Inst.MATCH:
2852
+ {
2853
+ if (anchor === RE2Flags.ANCHOR_BOTH && currentPos !== this.end) {
2854
+ break;
2855
+ }
2856
+ if (this.ncap === 0) return true;
2857
+ if (this.ncap > 1) {
2858
+ this.cap[1] = currentPos;
2859
+ }
2860
+ const old = this.matchcap[1];
2861
+ if (old === -1 || longest && currentPos > 0 && currentPos > old) {
2862
+ this.matchcap.set(this.cap);
2863
+ }
2864
+ if (!longest) return true;
2865
+ if (currentPos === this.end) return true;
2866
+ break;
2867
+ }
2868
+ default:
2869
+ {
2870
+ throw new RE2JSInternalException('bad inst');
2871
+ }
2872
+ }
2873
+ break;
2874
+ }
2875
+ }
2876
+ return longest && this.matchcap.length > 1 && this.matchcap[1] >= 0;
2877
+ }
2878
+ }
2879
+ const bitStatePool = [];
2880
+ class Backtracker {
2881
+ static shouldBacktrack(prog) {
2882
+ return prog.numInst() <= MAX_BACKTRACK_PROG;
2883
+ }
2884
+ static maxBitStateLen(prog) {
2885
+ if (!Backtracker.shouldBacktrack(prog)) {
2886
+ return 0;
2887
+ }
2888
+ return Math.floor(MAX_BACKTRACK_VECTOR / prog.numInst());
2889
+ }
2890
+ static execute(re2, input, pos, anchor, ncap) {
2891
+ const startCond = re2.cond;
2892
+ if (startCond === Utils.EMPTY_ALL) {
2893
+ return null;
2894
+ }
2895
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2896
+ return null;
2897
+ }
2898
+ if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) {
2899
+ return null;
2900
+ }
2901
+ const b = bitStatePool.length > 0 ? bitStatePool.pop() : new BitState();
2902
+ const end = input.endPos();
2903
+ b.reset(re2.prog, end, ncap);
2904
+ let matched = false;
2905
+ if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 || anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) {
2906
+ if (b.ncap > 0) {
2907
+ b.cap[0] = pos;
2908
+ }
2909
+ if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
2910
+ matched = true;
2911
+ }
2912
+ } else {
2913
+ let width = -1;
2914
+ for (; pos <= end && width !== 0; pos += width) {
2915
+ if (re2.prefix.length > 0) {
2916
+ const advance = input.index(re2, pos);
2917
+ if (advance < 0) {
2918
+ break;
2919
+ }
2920
+ pos += advance;
2921
+ }
2922
+ if (b.ncap > 0) {
2923
+ b.cap[0] = pos;
2924
+ }
2925
+ if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
2926
+ matched = true;
2927
+ break;
2928
+ }
2929
+ const r = input.step(pos);
2930
+ width = r === MachineInputBase.EOF() ? 0 : r & 7;
2931
+ }
2932
+ }
2933
+ if (!matched) {
2934
+ bitStatePool.push(b);
2935
+ return null;
2936
+ }
2937
+
2938
+ // Must slice so we don't accidentally leak trailing arrays from previously recycled typed arrays
2939
+ const result = ncap === 0 ? [] : Array.from(b.matchcap.subarray(0, ncap));
2940
+ bitStatePool.push(b);
2941
+ return result;
2942
+ }
2943
+ }
2944
+
2945
+ class QueueOnePass {
2946
+ constructor(size) {
2947
+ this.sparse = new Uint32Array(size);
2948
+ this.dense = new Uint32Array(size);
2949
+ this.size = 0;
2950
+ this.nextIndex = 0;
2951
+ }
2952
+ empty() {
2953
+ return this.nextIndex >= this.size;
2954
+ }
2955
+ next() {
2956
+ return this.dense[this.nextIndex++];
2957
+ }
2958
+ clear() {
2959
+ this.size = 0;
2960
+ this.nextIndex = 0;
2961
+ }
2962
+ contains(u) {
2963
+ return u < this.sparse.length && this.sparse[u] < this.size && this.dense[this.sparse[u]] === u;
2964
+ }
2965
+ insert(u) {
2966
+ if (!this.contains(u)) this.insertNew(u);
2967
+ }
2968
+ insertNew(u) {
2969
+ if (u >= this.sparse.length) return;
2970
+ this.sparse[u] = this.size;
2971
+ this.dense[this.size] = u;
2972
+ this.size++;
2973
+ }
2974
+ }
2975
+ const mergeRuneSets = (leftRunes, rightRunes, leftPC, rightPC) => {
2976
+ const leftLen = leftRunes.length;
2977
+ const rightLen = rightRunes.length;
2978
+ let lx = 0,
2979
+ rx = 0;
2980
+ const merged = [];
2981
+ const next = [];
2982
+ let ok = true;
2983
+ let ix = -1;
2984
+ const extend = isLeft => {
2985
+ const newArray = isLeft ? leftRunes : rightRunes;
2986
+ const low = isLeft ? lx : rx;
2987
+ const pc = isLeft ? leftPC : rightPC;
2988
+ if (ix > 0 && newArray[low] <= merged[ix]) return false;
2989
+ merged.push(newArray[low], newArray[low + 1]);
2990
+ if (isLeft) lx += 2;else rx += 2;
2991
+ ix += 2;
2992
+ next.push(pc);
2993
+ return true;
2994
+ };
2995
+ while (lx < leftLen || rx < rightLen) {
2996
+ if (rx >= rightLen) {
2997
+ ok = extend(true);
2998
+ } else if (lx >= leftLen) {
2999
+ ok = extend(false);
3000
+ } else if (rightRunes[rx] < leftRunes[lx]) {
3001
+ ok = extend(false);
3002
+ } else {
3003
+ ok = extend(true);
3004
+ }
3005
+ if (!ok) return null;
3006
+ }
3007
+ return {
3008
+ merged,
3009
+ next
3010
+ };
3011
+ };
3012
+ class OnePassProg {
3013
+ constructor(prog) {
3014
+ this.start = prog.start;
3015
+ this.numCap = prog.numCap;
3016
+ this.inst = new Array(prog.inst.length);
3017
+ for (let i = 0; i < prog.inst.length; i++) {
3018
+ const orig = prog.inst[i];
3019
+ const inst = new Inst(orig.op);
3020
+ inst.out = orig.out;
3021
+ inst.arg = orig.arg;
3022
+ inst.runes = orig.runes ? orig.runes.slice() : [];
3023
+ inst.next = null;
3024
+ this.inst[i] = inst;
3025
+ }
3026
+ }
3027
+ }
3028
+ const onePassCopy = prog => {
3029
+ const p = new OnePassProg(prog);
3030
+
3031
+ // Rewrites one or more common Prog constructs that enable some otherwise
3032
+ // non-onepass Progs to be onepass.
3033
+ for (let pc = 0; pc < p.inst.length; pc++) {
3034
+ const inst = p.inst[pc];
3035
+ if (inst.op !== Inst.ALT && inst.op !== Inst.ALT_MATCH) continue;
3036
+ let pAOther = 'out';
3037
+ let pAAlt = 'arg';
3038
+ let instAlt = p.inst[inst[pAAlt]];
3039
+ if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) {
3040
+ pAOther = 'arg';
3041
+ pAAlt = 'out';
3042
+ instAlt = p.inst[inst[pAAlt]];
3043
+ if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) continue;
3044
+ }
3045
+ const instOther = p.inst[inst[pAOther]];
3046
+ if (instOther.op === Inst.ALT || instOther.op === Inst.ALT_MATCH) continue;
3047
+ let pBAlt = 'out';
3048
+ let pBOther = 'arg';
3049
+ let patch = false;
3050
+ if (instAlt.out === pc) {
3051
+ patch = true;
3052
+ } else if (instAlt.arg === pc) {
3053
+ patch = true;
3054
+ pBAlt = 'arg';
3055
+ pBOther = 'out';
3056
+ }
3057
+ if (patch) instAlt[pBAlt] = inst[pAOther];
3058
+ if (inst[pAOther] === instAlt[pBAlt]) inst[pAAlt] = instAlt[pBOther];
3059
+ }
3060
+ return p;
3061
+ };
3062
+ const makeOnePass = p => {
3063
+ if (p.inst.length >= 1000) return null;
3064
+ const instQueue = new QueueOnePass(p.inst.length);
3065
+ const visitQueue = new QueueOnePass(p.inst.length);
3066
+ const onePassRunes = new Array(p.inst.length);
3067
+ const m = new Array(p.inst.length).fill(false);
3068
+ const check = pc => {
3069
+ let ok = true;
3070
+ const inst = p.inst[pc];
3071
+ if (visitQueue.contains(pc)) return true;
3072
+ visitQueue.insert(pc);
3073
+ switch (inst.op) {
3074
+ case Inst.ALT:
3075
+ case Inst.ALT_MATCH:
3076
+ {
3077
+ ok = check(inst.out) && check(inst.arg);
3078
+ let matchOut = m[inst.out];
3079
+ let matchArg = m[inst.arg];
3080
+ if (matchOut && matchArg) return false;
3081
+ if (matchArg) {
3082
+ const tempOut = inst.out;
3083
+ inst.out = inst.arg;
3084
+ inst.arg = tempOut;
3085
+ const tempMatch = matchOut;
3086
+ matchOut = matchArg;
3087
+ matchArg = tempMatch;
3088
+ }
3089
+ if (matchOut) {
3090
+ m[pc] = true;
3091
+ inst.op = Inst.ALT_MATCH;
3092
+ }
3093
+ const leftRunes = onePassRunes[inst.out] || [];
3094
+ const rightRunes = onePassRunes[inst.arg] || [];
3095
+ const mergeRes = mergeRuneSets(leftRunes, rightRunes, inst.out, inst.arg);
3096
+ if (!mergeRes) return false;
3097
+ onePassRunes[pc] = mergeRes.merged;
3098
+ inst.next = new Uint32Array(mergeRes.next);
3099
+ break;
3100
+ }
3101
+ case Inst.CAPTURE:
3102
+ case Inst.EMPTY_WIDTH:
3103
+ case Inst.NOP:
3104
+ {
3105
+ ok = check(inst.out);
3106
+ m[pc] = m[inst.out];
3107
+ onePassRunes[pc] = onePassRunes[inst.out] ? onePassRunes[inst.out].slice() : [];
3108
+ inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
3109
+ break;
3110
+ }
3111
+ case Inst.MATCH:
3112
+ case Inst.FAIL:
3113
+ {
3114
+ m[pc] = inst.op === Inst.MATCH;
3115
+ break;
3116
+ }
3117
+ case Inst.RUNE:
3118
+ {
3119
+ m[pc] = false;
3120
+ if (inst.next && inst.next.length > 0) break;
3121
+ instQueue.insert(inst.out);
3122
+ if (!inst.runes || inst.runes.length === 0) {
3123
+ onePassRunes[pc] = [];
3124
+ inst.next = new Uint32Array([inst.out]);
3125
+ break;
3126
+ }
3127
+ let runes = [];
3128
+ if (inst.runes.length === 1 && (inst.arg & RE2Flags.FOLD_CASE) !== 0) {
3129
+ const r0 = inst.runes[0];
3130
+ runes.push(r0, r0);
3131
+ for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
3132
+ runes.push(r1, r1);
3133
+ }
3134
+ runes.sort((a, b) => a - b);
3135
+ } else {
3136
+ runes.push(...inst.runes);
3137
+ }
3138
+ onePassRunes[pc] = runes;
3139
+ inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
3140
+ inst.op = Inst.RUNE;
3141
+ break;
3142
+ }
3143
+ case Inst.RUNE1:
3144
+ {
3145
+ m[pc] = false;
3146
+ if (inst.next && inst.next.length > 0) break;
3147
+ instQueue.insert(inst.out);
3148
+ let runes = [];
3149
+ if ((inst.arg & RE2Flags.FOLD_CASE) !== 0) {
3150
+ const r0 = inst.runes[0];
3151
+ runes.push(r0, r0);
3152
+ for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
3153
+ runes.push(r1, r1);
3154
+ }
3155
+ runes.sort((a, b) => a - b);
3156
+ } else {
3157
+ runes.push(inst.runes[0], inst.runes[0]);
3158
+ }
3159
+ onePassRunes[pc] = runes;
3160
+ inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
3161
+ inst.op = Inst.RUNE;
3162
+ break;
3163
+ }
3164
+ case Inst.RUNE_ANY:
3165
+ {
3166
+ m[pc] = false;
3167
+ if (inst.next && inst.next.length > 0) break;
3168
+ instQueue.insert(inst.out);
3169
+ onePassRunes[pc] = [0, Unicode.MAX_RUNE];
3170
+ inst.next = new Uint32Array([inst.out]);
3171
+ break;
3172
+ }
3173
+ case Inst.RUNE_ANY_NOT_NL:
3174
+ {
3175
+ m[pc] = false;
3176
+ if (inst.next && inst.next.length > 0) break;
3177
+ instQueue.insert(inst.out);
3178
+ onePassRunes[pc] = [0, 9, 11, Unicode.MAX_RUNE]; // \n is 10
3179
+ inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
3180
+ break;
3181
+ }
3182
+ }
3183
+ return ok;
3184
+ };
3185
+ instQueue.clear();
3186
+ instQueue.insert(p.start);
3187
+ while (!instQueue.empty()) {
3188
+ visitQueue.clear();
3189
+ const pc = instQueue.next();
3190
+ if (!check(pc)) return null;
3191
+ }
3192
+ for (let i = 0; i < p.inst.length; i++) {
3193
+ if (onePassRunes[i]) p.inst[i].runes = onePassRunes[i];
3194
+ }
3195
+ return p;
3196
+ };
3197
+ const cleanupOnePass = (p, original) => {
3198
+ for (let ix = 0; ix < original.inst.length; ix++) {
3199
+ const instOriginal = original.inst[ix];
3200
+ switch (instOriginal.op) {
3201
+ case Inst.ALT:
3202
+ case Inst.ALT_MATCH:
3203
+ case Inst.RUNE:
3204
+ break;
3205
+ case Inst.CAPTURE:
3206
+ case Inst.EMPTY_WIDTH:
3207
+ case Inst.NOP:
3208
+ case Inst.MATCH:
3209
+ case Inst.FAIL:
3210
+ p.inst[ix].next = null;
3211
+ break;
3212
+ case Inst.RUNE1:
3213
+ case Inst.RUNE_ANY:
3214
+ case Inst.RUNE_ANY_NOT_NL:
3215
+ p.inst[ix].next = null;
3216
+ p.inst[ix].op = instOriginal.op;
3217
+ p.inst[ix].runes = instOriginal.runes ? instOriginal.runes.slice() : [];
3218
+ break;
3219
+ }
3220
+ }
3221
+ };
3222
+ class OnePass {
3223
+ static compile(prog) {
3224
+ if (prog.start === 0) return null;
3225
+ const startInst = prog.inst[prog.start];
3226
+ // onepass regexps must be strictly anchored
3227
+ if (startInst.op !== Inst.EMPTY_WIDTH || (startInst.arg & Utils.EMPTY_BEGIN_TEXT) === 0) {
3228
+ return null;
2279
3229
  }
2280
- const nextState = this.getState(nextPCs);
2281
-
2282
- // Cache the result
2283
- if (anchor === RE2Flags.UNANCHORED && charCode <= Unicode.MAX_ASCII) {
2284
- state.nextAscii[charCode] = nextState;
2285
- } else {
2286
- const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
2287
- state.nextMap.set(key, nextState);
3230
+ let hasAlt = false;
3231
+ for (let i = 0; i < prog.inst.length; i++) {
3232
+ if (prog.inst[i].op === Inst.ALT || prog.inst[i].op === Inst.ALT_MATCH) {
3233
+ hasAlt = true;
3234
+ break;
3235
+ }
2288
3236
  }
2289
- return nextState;
2290
- }
2291
-
2292
- // The hot loop: Execute the Lazy DFA
2293
- match(input, pos, anchor) {
2294
- if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
2295
- return false;
3237
+ for (let i = 0; i < prog.inst.length; i++) {
3238
+ const inst = prog.inst[i];
3239
+ const opOut = prog.inst[inst.out].op;
3240
+ switch (inst.op) {
3241
+ case Inst.ALT:
3242
+ case Inst.ALT_MATCH:
3243
+ if (opOut === Inst.MATCH || prog.inst[inst.arg].op === Inst.MATCH) {
3244
+ return null;
3245
+ }
3246
+ break;
3247
+ case Inst.EMPTY_WIDTH:
3248
+ if (opOut === Inst.MATCH) {
3249
+ if ((inst.arg & Utils.EMPTY_END_TEXT) === Utils.EMPTY_END_TEXT) {
3250
+ continue;
3251
+ }
3252
+ return null;
3253
+ }
3254
+ break;
3255
+ default:
3256
+ if (opOut === Inst.MATCH && hasAlt) {
3257
+ return null;
3258
+ }
3259
+ break;
3260
+ }
2296
3261
  }
2297
- if (!this.startState) {
2298
- this.startState = this.getState([this.prog.start]);
2299
- if (!this.startState) return null; // Fallback to NFA
3262
+ let p = onePassCopy(prog);
3263
+ p = makeOnePass(p);
3264
+ if (p !== null) {
3265
+ cleanupOnePass(p, prog);
2300
3266
  }
2301
- let endPos = input.endPos();
2302
- let currentState = this.startState;
2303
- if (currentState.isMatch) {
2304
- if (anchor === RE2Flags.ANCHOR_BOTH) {
2305
- if (pos === endPos) return true;
2306
- } else {
2307
- return true;
3267
+ return p;
3268
+ }
3269
+ static next(inst, r) {
3270
+ const nextIdx = inst.matchRunePos(r);
3271
+ if (nextIdx >= 0) return inst.next[nextIdx];
3272
+ if (inst.op === Inst.ALT_MATCH) return inst.out;
3273
+ return 0; // fail
3274
+ }
3275
+ static execute(re2, input, pos, anchor, ncap) {
3276
+ const onepass = re2.onepass;
3277
+ if (!onepass) return null;
3278
+ const matchcap = new Int32Array(ncap).fill(-1);
3279
+ let matched = false;
3280
+ let r = input.step(pos);
3281
+ let rune = r >> 3;
3282
+ let width = r & 7;
3283
+ let r1 = MachineInputBase.EOF();
3284
+ let rune1 = -1;
3285
+ let width1 = 0;
3286
+ if (r !== MachineInputBase.EOF()) {
3287
+ r1 = input.step(pos + width);
3288
+ if (r1 !== MachineInputBase.EOF()) {
3289
+ rune1 = r1 >> 3;
3290
+ width1 = r1 & 7;
2308
3291
  }
2309
3292
  }
2310
- let i = pos;
2311
- while (i < endPos) {
2312
- const r = input.step(i);
2313
- const rune = r >> 3;
2314
- const width = r & 7;
2315
-
2316
- // prevent infinite loop on EOF
2317
- if (width === 0) {
2318
- break;
3293
+ let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
3294
+ let pc = onepass.start;
3295
+ let inst;
3296
+ while (true) {
3297
+ inst = onepass.inst[pc];
3298
+ pc = inst.out;
3299
+ switch (inst.op) {
3300
+ case Inst.MATCH:
3301
+ {
3302
+ matched = true;
3303
+ if (matchcap.length > 0) {
3304
+ matchcap[0] = 0;
3305
+ matchcap[1] = pos;
3306
+ }
3307
+ return ncap === 0 ? [] : Array.from(matchcap);
3308
+ }
3309
+ case Inst.RUNE:
3310
+ if (!inst.matchRune(rune)) return null;
3311
+ break;
3312
+ case Inst.RUNE1:
3313
+ if (rune !== inst.runes[0]) return null;
3314
+ break;
3315
+ case Inst.RUNE_ANY:
3316
+ break;
3317
+ case Inst.RUNE_ANY_NOT_NL:
3318
+ if (rune === 10) return null;
3319
+ break;
3320
+ case Inst.ALT:
3321
+ case Inst.ALT_MATCH:
3322
+ pc = OnePass.next(inst, rune);
3323
+ continue;
3324
+ case Inst.FAIL:
3325
+ return null;
3326
+ case Inst.NOP:
3327
+ continue;
3328
+ case Inst.EMPTY_WIDTH:
3329
+ if ((inst.arg & ~flag) !== 0) return null;
3330
+ continue;
3331
+ case Inst.CAPTURE:
3332
+ if (inst.arg < matchcap.length) {
3333
+ matchcap[inst.arg] = pos;
3334
+ }
3335
+ continue;
3336
+ default:
3337
+ throw new RE2JSInternalException('bad inst');
2319
3338
  }
2320
- currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
2321
-
2322
- // If we hit an unrecoverable DFA error or bailout, signal fallback
2323
- if (currentState === null) return null;
2324
- if (currentState.isMatch) {
2325
- if (anchor === RE2Flags.ANCHOR_BOTH) {
2326
- if (i + width === endPos) return true;
3339
+ if (width === 0) break;
3340
+ flag = Utils.emptyOpContext(rune, rune1);
3341
+ pos += width;
3342
+ rune = rune1;
3343
+ width = width1;
3344
+ if (rune !== -1) {
3345
+ r1 = input.step(pos + width);
3346
+ if (r1 !== MachineInputBase.EOF()) {
3347
+ rune1 = r1 >> 3;
3348
+ width1 = r1 & 7;
2327
3349
  } else {
2328
- return true;
3350
+ rune1 = -1;
3351
+ width1 = 0;
2329
3352
  }
2330
3353
  }
2331
-
2332
- // If we hit a dead end, and anchored, fail early
2333
- if (currentState.nfaStates.length === 0) {
2334
- if (anchor !== RE2Flags.UNANCHORED) return false;
2335
- }
2336
- i += width;
2337
3354
  }
2338
- return false;
3355
+ if (!matched) return null;
3356
+ return ncap === 0 ? [] : Array.from(matchcap);
2339
3357
  }
2340
3358
  }
2341
3359
 
@@ -2420,7 +3438,7 @@ class Regexp {
2420
3438
  this.max = 0; // max for REPEAT
2421
3439
  this.cap = 0; // capturing index, for CAPTURE
2422
3440
  this.name = null; // capturing name, for CAPTURE
2423
- this.namedGroups = {}; // map of group name -> capturing index
3441
+ this.namedGroups = Object.create(null); // map of group name -> capturing index
2424
3442
  }
2425
3443
  reinit() {
2426
3444
  this.flags = 0;
@@ -2430,7 +3448,7 @@ class Regexp {
2430
3448
  this.min = 0;
2431
3449
  this.max = 0;
2432
3450
  this.name = null;
2433
- this.namedGroups = {};
3451
+ this.namedGroups = Object.create(null);
2434
3452
  }
2435
3453
  toString() {
2436
3454
  return this.appendTo();
@@ -2690,6 +3708,188 @@ class Regexp {
2690
3708
  }
2691
3709
  }
2692
3710
 
3711
+ class Prefilter {
3712
+ static Type = {
3713
+ NONE: 0,
3714
+ EXACT: 1,
3715
+ AND: 2,
3716
+ OR: 3
3717
+ };
3718
+ constructor(type) {
3719
+ this.type = type;
3720
+ this.subs = [];
3721
+ this.str = '';
3722
+ this.bytes = null;
3723
+ }
3724
+ eval(input, pos) {
3725
+ switch (this.type) {
3726
+ case Prefilter.Type.NONE:
3727
+ return true;
3728
+ case Prefilter.Type.EXACT:
3729
+ return input.hasString(this, pos);
3730
+ case Prefilter.Type.AND:
3731
+ for (let i = 0; i < this.subs.length; i++) {
3732
+ if (!this.subs[i].eval(input, pos)) return false;
3733
+ }
3734
+ return true;
3735
+ case Prefilter.Type.OR:
3736
+ for (let i = 0; i < this.subs.length; i++) {
3737
+ if (this.subs[i].eval(input, pos)) return true;
3738
+ }
3739
+ return false;
3740
+ default:
3741
+ return true;
3742
+ }
3743
+ }
3744
+ }
3745
+ class PrefilterTree {
3746
+ static build(re) {
3747
+ const pf = PrefilterTree.fromRegexp(re);
3748
+ return PrefilterTree.simplify(pf);
3749
+ }
3750
+ static fromRegexp(re) {
3751
+ if (!re) return new Prefilter(Prefilter.Type.NONE);
3752
+ switch (re.op) {
3753
+ case Regexp.Op.NO_MATCH:
3754
+ case Regexp.Op.EMPTY_MATCH:
3755
+ case Regexp.Op.BEGIN_LINE:
3756
+ case Regexp.Op.END_LINE:
3757
+ case Regexp.Op.BEGIN_TEXT:
3758
+ case Regexp.Op.END_TEXT:
3759
+ case Regexp.Op.WORD_BOUNDARY:
3760
+ case Regexp.Op.NO_WORD_BOUNDARY:
3761
+ case Regexp.Op.CHAR_CLASS:
3762
+ case Regexp.Op.ANY_CHAR_NOT_NL:
3763
+ case Regexp.Op.ANY_CHAR:
3764
+ {
3765
+ return new Prefilter(Prefilter.Type.NONE);
3766
+ }
3767
+ case Regexp.Op.LITERAL:
3768
+ {
3769
+ if (re.runes.length === 0 || (re.flags & RE2Flags.FOLD_CASE) !== 0) {
3770
+ // Skip case-folded literals for simplicity
3771
+ return new Prefilter(Prefilter.Type.NONE);
3772
+ }
3773
+ const pf = new Prefilter(Prefilter.Type.EXACT);
3774
+ let str = '';
3775
+ for (let i = 0; i < re.runes.length; i++) {
3776
+ str += String.fromCodePoint(re.runes[i]);
3777
+ }
3778
+ pf.str = str;
3779
+ pf.bytes = Utils.stringToUtf8ByteArray(pf.str);
3780
+ return pf;
3781
+ }
3782
+ case Regexp.Op.CAPTURE:
3783
+ case Regexp.Op.PLUS:
3784
+ {
3785
+ return PrefilterTree.fromRegexp(re.subs[0]);
3786
+ }
3787
+ case Regexp.Op.REPEAT:
3788
+ {
3789
+ if (re.min >= 1) {
3790
+ return PrefilterTree.fromRegexp(re.subs[0]);
3791
+ }
3792
+ return new Prefilter(Prefilter.Type.NONE);
3793
+ }
3794
+ case Regexp.Op.CONCAT:
3795
+ {
3796
+ const pf = new Prefilter(Prefilter.Type.AND);
3797
+ for (const sub of re.subs) {
3798
+ pf.subs.push(PrefilterTree.fromRegexp(sub));
3799
+ }
3800
+ return pf;
3801
+ }
3802
+ case Regexp.Op.ALTERNATE:
3803
+ {
3804
+ const pf = new Prefilter(Prefilter.Type.OR);
3805
+ for (const sub of re.subs) {
3806
+ pf.subs.push(PrefilterTree.fromRegexp(sub));
3807
+ }
3808
+ return pf;
3809
+ }
3810
+ default:
3811
+ return new Prefilter(Prefilter.Type.NONE);
3812
+ }
3813
+ }
3814
+ static simplify(pf) {
3815
+ if (pf.type === Prefilter.Type.EXACT || pf.type === Prefilter.Type.NONE) {
3816
+ return pf;
3817
+ }
3818
+ if (pf.type === Prefilter.Type.AND) {
3819
+ const newSubs = [];
3820
+ for (const sub of pf.subs) {
3821
+ const s = PrefilterTree.simplify(sub);
3822
+ if (s.type !== Prefilter.Type.NONE) {
3823
+ if (s.type === Prefilter.Type.AND) {
3824
+ newSubs.push(...s.subs);
3825
+ } else {
3826
+ newSubs.push(s);
3827
+ }
3828
+ }
3829
+ }
3830
+ if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
3831
+ if (newSubs.length === 1) return newSubs[0];
3832
+ pf.subs = newSubs;
3833
+ return pf;
3834
+ }
3835
+ if (pf.type === Prefilter.Type.OR) {
3836
+ const newSubs = [];
3837
+ for (const sub of pf.subs) {
3838
+ const s = PrefilterTree.simplify(sub);
3839
+ if (s.type === Prefilter.Type.NONE) {
3840
+ // If any branch of an OR has no requirements, the whole OR has no requirements
3841
+ return new Prefilter(Prefilter.Type.NONE);
3842
+ }
3843
+ if (s.type === Prefilter.Type.OR) {
3844
+ newSubs.push(...s.subs);
3845
+ } else {
3846
+ newSubs.push(s);
3847
+ }
3848
+ }
3849
+ if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
3850
+ if (newSubs.length === 1) return newSubs[0];
3851
+
3852
+ // De-duplicate EXACT branches
3853
+ const seen = new Set();
3854
+ const uniqueSubs = [];
3855
+ for (const sub of newSubs) {
3856
+ if (sub.type === Prefilter.Type.EXACT) {
3857
+ if (!seen.has(sub.str)) {
3858
+ seen.add(sub.str);
3859
+ uniqueSubs.push(sub);
3860
+ }
3861
+ } else {
3862
+ uniqueSubs.push(sub);
3863
+ }
3864
+ }
3865
+ pf.subs = uniqueSubs;
3866
+ return pf;
3867
+ }
3868
+ return pf;
3869
+ }
3870
+ }
3871
+
3872
+ /**
3873
+ * A list of instruction pointers waiting to be patched.
3874
+ * Tracks both `head` and `tail` to allow O(1) appending during compilation.
3875
+ * * Values are encoded integers, not standard memory pointers:
3876
+ * - Program instruction index: `l >> 1`
3877
+ * - Patch `.out` field if: `(l & 1) === 0`
3878
+ * - Patch `.arg` field if: `(l & 1) === 1`
3879
+ * - `0` denotes an empty list.
3880
+ * * @see https://swtch.com/~rsc/regexp/regexp1.html
3881
+ */
3882
+ class PatchList {
3883
+ /**
3884
+ * @param {number} head - Encoded pointer to the start of the patch list.
3885
+ * @param {number} tail - Encoded pointer to the end of the patch list.
3886
+ */
3887
+ constructor(head = 0, tail = 0) {
3888
+ this.head = head;
3889
+ this.tail = tail;
3890
+ }
3891
+ }
3892
+
2693
3893
  /**
2694
3894
  * A Prog is a compiled regular expression program.
2695
3895
  */
@@ -2791,39 +3991,30 @@ class Prog {
2791
3991
  return i.arg;
2792
3992
  }
2793
3993
  patch(l, val) {
2794
- while (l !== 0) {
2795
- const i = this.inst[l >> 1];
2796
- if ((l & 1) === 0) {
2797
- l = i.out;
3994
+ let head = l.head;
3995
+ while (head !== 0) {
3996
+ const i = this.inst[head >> 1];
3997
+ if ((head & 1) === 0) {
3998
+ head = i.out;
2798
3999
  i.out = val;
2799
4000
  } else {
2800
- l = i.arg;
4001
+ head = i.arg;
2801
4002
  i.arg = val;
2802
4003
  }
2803
4004
  }
2804
4005
  }
2805
4006
  append(l1, l2) {
2806
- if (l1 === 0) {
2807
- return l2;
2808
- }
2809
- if (l2 === 0) {
2810
- return l1;
2811
- }
2812
- let last = l1;
2813
- for (;;) {
2814
- const next = this.next(last);
2815
- if (next === 0) {
2816
- break;
2817
- }
2818
- last = next;
2819
- }
2820
- const i = this.inst[last >> 1];
2821
- if ((last & 1) === 0) {
2822
- i.out = l2;
4007
+ if (l1.head === 0) return l2;
4008
+ if (l2.head === 0) return l1;
4009
+
4010
+ // We know exactly where the tail is
4011
+ const i = this.inst[l1.tail >> 1];
4012
+ if ((l1.tail & 1) === 0) {
4013
+ i.out = l2.head;
2823
4014
  } else {
2824
- i.arg = l2;
4015
+ i.arg = l2.head;
2825
4016
  }
2826
- return l1;
4017
+ return new PatchList(l1.head, l2.tail);
2827
4018
  }
2828
4019
  /**
2829
4020
  *
@@ -2852,7 +4043,7 @@ class Prog {
2852
4043
  * @class
2853
4044
  */
2854
4045
  class Frag {
2855
- constructor(i = 0, out = 0, nullable = false) {
4046
+ constructor(i = 0, out = new PatchList(), nullable = false) {
2856
4047
  this.i = i; // an instruction address (pc).
2857
4048
  this.out = out; // a patch list; see explanation in Prog.js
2858
4049
  this.nullable = nullable; // whether the fragment can match the empty string
@@ -2877,6 +4068,33 @@ class Compiler {
2877
4068
  c.prog.start = f.i;
2878
4069
  return c.prog;
2879
4070
  }
4071
+ static compileSet(regexps) {
4072
+ const c = new Compiler();
4073
+ if (regexps.length === 0) {
4074
+ c.prog.start = c.newInst(Inst.FAIL).i;
4075
+ return c.prog;
4076
+ }
4077
+ let starts = [];
4078
+ for (let i = 0; i < regexps.length; i++) {
4079
+ const f = c.compile(regexps[i]);
4080
+ const m = c.newInst(Inst.MATCH);
4081
+ c.prog.getInst(m.i).arg = i; // Store the regex index
4082
+ c.prog.patch(f.out, m.i);
4083
+ starts.push(f.i);
4084
+ }
4085
+
4086
+ // Link starts together via ALT
4087
+ let start = starts[0];
4088
+ for (let i = 1; i < starts.length; i++) {
4089
+ const f = c.newInst(Inst.ALT);
4090
+ const inst = c.prog.getInst(f.i);
4091
+ inst.out = start;
4092
+ inst.arg = starts[i];
4093
+ start = f.i;
4094
+ }
4095
+ c.prog.start = start;
4096
+ return c.prog;
4097
+ }
2880
4098
  constructor() {
2881
4099
  this.prog = new Prog();
2882
4100
  this.newInst(Inst.FAIL);
@@ -2889,7 +4107,7 @@ class Compiler {
2889
4107
  // Returns a no-op fragment. Sometimes unavoidable.
2890
4108
  nop() {
2891
4109
  const f = this.newInst(Inst.NOP);
2892
- f.out = f.i << 1;
4110
+ f.out = new PatchList(f.i << 1, f.i << 1);
2893
4111
  return f;
2894
4112
  }
2895
4113
  fail() {
@@ -2900,7 +4118,7 @@ class Compiler {
2900
4118
  // Given a fragment a, returns a fragment with capturing parens around a.
2901
4119
  cap(arg) {
2902
4120
  const f = this.newInst(Inst.CAPTURE);
2903
- f.out = f.i << 1;
4121
+ f.out = new PatchList(f.i << 1, f.i << 1);
2904
4122
  this.prog.getInst(f.i).arg = arg;
2905
4123
  if (this.prog.numCap < arg + 1) {
2906
4124
  this.prog.numCap = arg + 1;
@@ -2948,10 +4166,10 @@ class Compiler {
2948
4166
  const i = this.prog.getInst(f.i);
2949
4167
  if (nongreedy) {
2950
4168
  i.arg = f1.i;
2951
- f.out = f.i << 1;
4169
+ f.out = new PatchList(f.i << 1, f.i << 1);
2952
4170
  } else {
2953
4171
  i.out = f1.i;
2954
- f.out = f.i << 1 | 1;
4172
+ f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
2955
4173
  }
2956
4174
  this.prog.patch(f1.out, f.i);
2957
4175
  return f;
@@ -2963,10 +4181,10 @@ class Compiler {
2963
4181
  const i = this.prog.getInst(f.i);
2964
4182
  if (nongreedy) {
2965
4183
  i.arg = f1.i;
2966
- f.out = f.i << 1;
4184
+ f.out = new PatchList(f.i << 1, f.i << 1);
2967
4185
  } else {
2968
4186
  i.out = f1.i;
2969
- f.out = f.i << 1 | 1;
4187
+ f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
2970
4188
  }
2971
4189
  f.out = this.prog.append(f.out, f1.out);
2972
4190
  return f;
@@ -2989,7 +4207,7 @@ class Compiler {
2989
4207
  empty(op) {
2990
4208
  const f = this.newInst(Inst.EMPTY_WIDTH);
2991
4209
  this.prog.getInst(f.i).arg = op;
2992
- f.out = f.i << 1;
4210
+ f.out = new PatchList(f.i << 1, f.i << 1);
2993
4211
  return f;
2994
4212
  }
2995
4213
 
@@ -3004,7 +4222,7 @@ class Compiler {
3004
4222
  flags &= -2;
3005
4223
  }
3006
4224
  i.arg = flags;
3007
- f.out = f.i << 1;
4225
+ f.out = new PatchList(f.i << 1, f.i << 1);
3008
4226
  if ((flags & RE2Flags.FOLD_CASE) === 0 && runes.length === 1 || runes.length === 2 && runes[0] === runes[1]) {
3009
4227
  i.op = Inst.RUNE1;
3010
4228
  } else if (runes.length === 2 && runes[0] === 0 && runes[1] === Unicode.MAX_RUNE) {
@@ -3109,23 +4327,92 @@ class Simplify {
3109
4327
  }
3110
4328
  switch (re.op) {
3111
4329
  case Regexp.Op.CAPTURE:
4330
+ {
4331
+ const sub = Simplify.simplify(re.subs[0]);
4332
+ if (sub !== re.subs[0]) {
4333
+ const nre = Regexp.fromRegexp(re);
4334
+ nre.runes = [];
4335
+ nre.subs = [sub];
4336
+ return nre;
4337
+ }
4338
+ return re;
4339
+ }
3112
4340
  case Regexp.Op.CONCAT:
3113
4341
  case Regexp.Op.ALTERNATE:
3114
4342
  {
3115
- let nre = re;
4343
+ const newSubs = [];
4344
+ let changed = false;
3116
4345
  for (let i = 0; i < re.subs.length; i++) {
3117
4346
  const sub = re.subs[i];
3118
4347
  const nsub = Simplify.simplify(sub);
3119
- if (nre === re && nsub !== sub) {
3120
- nre = Regexp.fromRegexp(re);
3121
- nre.runes = [];
3122
- nre.subs = re.subs.slice(0, re.subs.length);
4348
+ if (nsub !== sub) {
4349
+ changed = true;
4350
+ }
4351
+ if (re.op === Regexp.Op.CONCAT) {
4352
+ // If any part of a CONCAT is mathematically impossible,
4353
+ // the entire CONCAT sequence becomes impossible.
4354
+ if (nsub.op === Regexp.Op.NO_MATCH) {
4355
+ return new Regexp(Regexp.Op.NO_MATCH);
4356
+ }
4357
+ // Drop empty 0-width match nodes entirely from sequences
4358
+ if (nsub.op === Regexp.Op.EMPTY_MATCH) {
4359
+ changed = true;
4360
+ continue;
4361
+ }
4362
+ // Flatten nested concatenations
4363
+ if (nsub.op === Regexp.Op.CONCAT) {
4364
+ changed = true;
4365
+ newSubs.push(...nsub.subs);
4366
+ continue;
4367
+ }
4368
+ } else if (re.op === Regexp.Op.ALTERNATE) {
4369
+ // Drop impossible branches from alternations
4370
+ if (nsub.op === Regexp.Op.NO_MATCH) {
4371
+ changed = true;
4372
+ continue;
4373
+ }
4374
+ // Flatten nested alternations
4375
+ if (nsub.op === Regexp.Op.ALTERNATE) {
4376
+ changed = true;
4377
+ newSubs.push(...nsub.subs);
4378
+ continue;
4379
+ }
4380
+ }
4381
+ newSubs.push(nsub);
4382
+ }
4383
+ if (changed) {
4384
+ // If we filtered out all nodes, return the mathematically correct fallback
4385
+ if (newSubs.length === 0) {
4386
+ return new Regexp(re.op === Regexp.Op.CONCAT ? Regexp.Op.EMPTY_MATCH : Regexp.Op.NO_MATCH);
3123
4387
  }
3124
- if (nre !== re) {
3125
- nre.subs[i] = nsub;
4388
+ // If only 1 node remains, we don't need a CONCAT/ALT container at all
4389
+ if (newSubs.length === 1) {
4390
+ return newSubs[0];
3126
4391
  }
4392
+ const nre = Regexp.fromRegexp(re);
4393
+ nre.runes = [];
4394
+ nre.subs = newSubs;
4395
+ return nre;
4396
+ }
4397
+ return re;
4398
+ }
4399
+ case Regexp.Op.CHAR_CLASS:
4400
+ {
4401
+ if (re.runes === null) return re;
4402
+
4403
+ // Empty character classes match nothing.
4404
+ if (re.runes.length === 0) {
4405
+ return new Regexp(Regexp.Op.NO_MATCH);
4406
+ }
4407
+ // Full character classes match everything.
4408
+ if (re.runes.length === 2 && re.runes[0] === 0 && re.runes[1] === Unicode.MAX_RUNE) {
4409
+ return new Regexp(Regexp.Op.ANY_CHAR);
4410
+ }
4411
+ // Standard catch-all except newline
4412
+ 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) {
4413
+ return new Regexp(Regexp.Op.ANY_CHAR_NOT_NL);
3127
4414
  }
3128
- return nre;
4415
+ return re;
3129
4416
  }
3130
4417
  case Regexp.Op.STAR:
3131
4418
  case Regexp.Op.PLUS:
@@ -3162,7 +4449,9 @@ class Simplify {
3162
4449
  }
3163
4450
  subs.push(Simplify.simplify1(Regexp.Op.PLUS, re.flags, sub, null));
3164
4451
  nre.subs = subs.slice(0);
3165
- return nre;
4452
+
4453
+ // Ensure newly created CONCAT is properly flattened
4454
+ return Simplify.simplify(nre);
3166
4455
  }
3167
4456
  // Special case x{0} handled above.
3168
4457
 
@@ -3200,7 +4489,8 @@ class Simplify {
3200
4489
  if (prefixSubs !== null) {
3201
4490
  const prefix = new Regexp(Regexp.Op.CONCAT);
3202
4491
  prefix.subs = prefixSubs.slice(0);
3203
- return prefix;
4492
+ // Ensure newly created CONCAT is properly flattened
4493
+ return Simplify.simplify(prefix);
3204
4494
  }
3205
4495
 
3206
4496
  // Some degenerate case like min > max or min < max < 0.
@@ -3233,6 +4523,13 @@ class Simplify {
3233
4523
  return sub;
3234
4524
  }
3235
4525
 
4526
+ // Handle impossible targets gracefully.
4527
+ // e.g. Trying to match "NO_MATCH" 0 or 1 times (QUEST/STAR) evaluates to EMPTY_MATCH.
4528
+ if (sub.op === Regexp.Op.NO_MATCH) {
4529
+ if (op === Regexp.Op.PLUS) return sub; // 1+ times is impossible
4530
+ return new Regexp(Regexp.Op.EMPTY_MATCH);
4531
+ }
4532
+
3236
4533
  // The operators are idempotent if the flags match.
3237
4534
  if (op === sub.op && (flags & RE2Flags.NON_GREEDY) === (sub.flags & RE2Flags.NON_GREEDY)) {
3238
4535
  return sub;
@@ -3240,10 +4537,10 @@ class Simplify {
3240
4537
  if (re !== null && re.op === op && (re.flags & RE2Flags.NON_GREEDY) === (flags & RE2Flags.NON_GREEDY) && sub === re.subs[0]) {
3241
4538
  return re;
3242
4539
  }
3243
- re = new Regexp(op);
3244
- re.flags = flags;
3245
- re.subs = [sub];
3246
- return re;
4540
+ const nre = new Regexp(op);
4541
+ nre.flags = flags;
4542
+ nre.subs = [sub];
4543
+ return nre;
3247
4544
  }
3248
4545
  }
3249
4546
 
@@ -3589,16 +4886,6 @@ class CharClass {
3589
4886
  }
3590
4887
  }
3591
4888
 
3592
- class Pair {
3593
- static of(first, second) {
3594
- return new Pair(first, second);
3595
- }
3596
- constructor(first, second) {
3597
- this.first = first;
3598
- this.second = second;
3599
- }
3600
- }
3601
-
3602
4889
  // StringIterator: a stream of runes with an opaque cursor, permitting
3603
4890
  // rewinding. The units of the cursor are not specified beyond the
3604
4891
  // fact that ASCII characters are single width. (Cursor positions
@@ -3745,18 +5032,59 @@ class Parser {
3745
5032
  // stride).
3746
5033
  static ANY_TABLE = new UnicodeRangeTable(new Uint32Array([0, Unicode.MAX_RUNE, 1]));
3747
5034
 
5035
+ // Ascii tables
5036
+ static ASCII_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1]));
5037
+ static ASCII_FOLD_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1, 0x017f, 0x017f, 1,
5038
+ // Old English long s (ſ), folds to S/s.
5039
+ 0x212a, 0x212a, 1 // Kelvin K, folds to K/k.
5040
+ ]));
5041
+
3748
5042
  // unicodeTable() returns the Unicode RangeTable identified by name
3749
5043
  // and the table of additional fold-equivalent code points.
3750
5044
  // Returns null if |name| does not identify a Unicode character range.
3751
5045
  static unicodeTable(name) {
3752
5046
  if (name === 'Any') {
3753
- return Pair.of(Parser.ANY_TABLE, Parser.ANY_TABLE);
5047
+ return {
5048
+ tab: Parser.ANY_TABLE,
5049
+ fold: Parser.ANY_TABLE,
5050
+ sign: 1
5051
+ };
5052
+ }
5053
+ if (name === 'Ascii') {
5054
+ return {
5055
+ tab: Parser.ASCII_TABLE,
5056
+ fold: Parser.ASCII_FOLD_TABLE,
5057
+ sign: 1
5058
+ };
5059
+ }
5060
+ if (name === 'Assigned') {
5061
+ // Assigned is the mathematical inversion of Cn (Unassigned)
5062
+ return {
5063
+ tab: UnicodeTables.CATEGORIES.get('Cn'),
5064
+ fold: UnicodeTables.CATEGORIES.get('Cn'),
5065
+ sign: -1
5066
+ };
5067
+ }
5068
+ if (name === 'Lc') {
5069
+ return {
5070
+ tab: UnicodeTables.CATEGORIES.get('LC'),
5071
+ fold: UnicodeTables.FOLD_CATEGORIES.get('LC'),
5072
+ sign: 1
5073
+ };
3754
5074
  }
3755
5075
  if (UnicodeTables.CATEGORIES.has(name)) {
3756
- return Pair.of(UnicodeTables.CATEGORIES.get(name), UnicodeTables.FOLD_CATEGORIES.get(name));
5076
+ return {
5077
+ tab: UnicodeTables.CATEGORIES.get(name),
5078
+ fold: UnicodeTables.FOLD_CATEGORIES.get(name),
5079
+ sign: 1
5080
+ };
3757
5081
  }
3758
5082
  if (UnicodeTables.SCRIPTS.has(name)) {
3759
- return Pair.of(UnicodeTables.SCRIPTS.get(name), UnicodeTables.FOLD_SCRIPT.get(name));
5083
+ return {
5084
+ tab: UnicodeTables.SCRIPTS.get(name),
5085
+ fold: UnicodeTables.FOLD_SCRIPT.get(name),
5086
+ sign: 1
5087
+ };
3760
5088
  }
3761
5089
  return null;
3762
5090
  }
@@ -4065,7 +5393,7 @@ class Parser {
4065
5393
  this.flags = flags;
4066
5394
  // number of capturing groups seen
4067
5395
  this.numCap = 0;
4068
- this.namedGroups = {};
5396
+ this.namedGroups = Object.create(null);
4069
5397
  // Stack of parsed expressions.
4070
5398
  this.stack = [];
4071
5399
  this.free = null;
@@ -4476,8 +5804,9 @@ class Parser {
4476
5804
  let i = 0;
4477
5805
  for (let sub of subs) {
4478
5806
  if (sub.op === op) {
4479
- newsubs.splice(i, sub.subs.length, ...sub.subs);
4480
- i += sub.subs.length;
5807
+ for (let j = 0; j < sub.subs.length; j++) {
5808
+ newsubs[i++] = sub.subs[j];
5809
+ }
4481
5810
  this.reuse(sub);
4482
5811
  } else {
4483
5812
  newsubs[i++] = sub;
@@ -4908,9 +6237,11 @@ class Parser {
4908
6237
  const i = lit.indexOf('\\E');
4909
6238
  if (i >= 0) {
4910
6239
  lit = lit.substring(0, i);
6240
+ t.skipString(lit);
6241
+ t.skipString('\\E');
6242
+ } else {
6243
+ t.skipString(lit);
4911
6244
  }
4912
- t.skipString(lit);
4913
- t.skipString('\\E');
4914
6245
  let j = 0;
4915
6246
  while (j < lit.length) {
4916
6247
  const codepoint = lit.codePointAt(j);
@@ -4926,6 +6257,9 @@ class Parser {
4926
6257
  t.rewindTo(savedPos);
4927
6258
  break;
4928
6259
  }
6260
+ } else {
6261
+ // Unconditionally rewind if PERL_X is off, or if string ended abruptly
6262
+ t.rewindTo(savedPos);
4929
6263
  }
4930
6264
  const re = this.newRegexp(Regexp.Op.CHAR_CLASS);
4931
6265
  re.flags = this.flags;
@@ -5251,8 +6585,11 @@ class Parser {
5251
6585
  if (pair === null) {
5252
6586
  throw new RE2JSSyntaxException(Parser.ERR_INVALID_CHAR_RANGE, t.from(startPos));
5253
6587
  }
5254
- const tab = pair.first;
5255
- const fold = pair.second; // fold-equivalent table
6588
+ if (pair.sign < 0) {
6589
+ sign = 0 - sign;
6590
+ }
6591
+ const tab = pair.tab;
6592
+ const fold = pair.fold; // fold-equivalent table
5256
6593
  // Variation of CharClass.appendGroup() for tables.
5257
6594
  if ((this.flags & RE2Flags.FOLD_CASE) === 0 || fold === null) {
5258
6595
  cc.appendTableWithSign(tab, sign);
@@ -5396,6 +6733,7 @@ class RE2 {
5396
6733
  res.prefixUTF8 = re2.prefixUTF8;
5397
6734
  res.prefixComplete = re2.prefixComplete;
5398
6735
  res.prefixRune = re2.prefixRune;
6736
+ res.prefilter = re2.prefilter;
5399
6737
  return res;
5400
6738
  }
5401
6739
 
@@ -5438,8 +6776,10 @@ class RE2 {
5438
6776
  let re = Parser.parse(expr, mode);
5439
6777
  const maxCap = re.maxCap();
5440
6778
  re = Simplify.simplify(re);
6779
+ const prefilter = PrefilterTree.build(re);
5441
6780
  const prog = Compiler.compileRegexp(re);
5442
6781
  const re2 = new RE2(expr, prog, maxCap, longest);
6782
+ re2.prefilter = prefilter.type === Prefilter.Type.NONE ? null : prefilter;
5443
6783
  const [prefixCompl, prefixStr] = prog.prefix();
5444
6784
  re2.prefixComplete = prefixCompl;
5445
6785
  re2.prefix = prefixStr;
@@ -5471,12 +6811,78 @@ class RE2 {
5471
6811
  this.prefixComplete = false; // true if prefix is the entire regexp
5472
6812
  this.prefixRune = 0; // first rune in prefix
5473
6813
  this.pooled = new AtomicReference(); // Cache of machines for running regexp. Forms a Treiber stack.
5474
- this.dfa = new DFA(prog); // Initialize the Lazy DFA
6814
+ this.dfa = new DFA(this.prog); // initialize Lazy DFA
6815
+ this.onepass = OnePass.compile(this.prog); // compile OnePass
6816
+ this.prefilter = null;
6817
+ }
6818
+ matchPrefixComplete(input, pos, anchor, ncap) {
6819
+ // If strictly anchored, execution must start at 0
6820
+ if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
6821
+ return null;
6822
+ }
6823
+ let matchStart = -1;
6824
+ let matchEnd = -1;
6825
+ const pLen = input.prefixLength(this);
6826
+ if (anchor === RE2Flags.UNANCHORED) {
6827
+ const idx = input.index(this, pos);
6828
+ if (idx < 0) return null;
6829
+ matchStart = pos + idx;
6830
+ matchEnd = matchStart + pLen;
6831
+ } else if (anchor === RE2Flags.ANCHOR_BOTH) {
6832
+ if (input.endPos() !== pLen) return null;
6833
+ const idx = input.index(this, 0);
6834
+ if (idx !== 0) return null;
6835
+ matchStart = 0;
6836
+ matchEnd = pLen;
6837
+ } else if (anchor === RE2Flags.ANCHOR_START) {
6838
+ const idx = input.index(this, 0);
6839
+ if (idx !== 0) return null;
6840
+ matchStart = 0;
6841
+ matchEnd = pLen;
6842
+ }
6843
+ if (matchStart < 0) return null;
6844
+
6845
+ // If captures are requested (e.g. findSubmatch instead of test), populate bounds
6846
+ if (ncap > 0) {
6847
+ const matchcap = new Int32Array(ncap).fill(-1);
6848
+ matchcap[0] = matchStart;
6849
+ matchcap[1] = matchEnd;
6850
+ return Array.from(matchcap);
6851
+ }
6852
+ return []; // Matched successfully, but no capture data requested
5475
6853
  }
5476
6854
  executeEngine(input, pos, anchor, ncap) {
6855
+ // LITERAL FAST PATH
6856
+ // If the entire regex is just a literal string (and no nested capture boundaries are requested),
6857
+ // bypass all state machines and execute via V8's blistering fast native indexOf
6858
+ if (this.prefixComplete && (ncap === 0 || this.numSubexp === 0)) {
6859
+ return this.matchPrefixComplete(input, pos, anchor, ncap);
6860
+ }
6861
+
6862
+ // PREFILTER FAST PATH
6863
+ // If the unanchored query requires specific literal strings (e.g. "a.*b"),
6864
+ // verify those strings exist using high-speed JS string searches before waking up the state engines.
6865
+ if (this.prefilter !== null && anchor === RE2Flags.UNANCHORED) {
6866
+ if (!this.prefilter.eval(input, pos)) {
6867
+ return null;
6868
+ }
6869
+ }
6870
+
6871
+ // FAST PATH: OnePass DFA engine.
6872
+ // If compiled successfully, it perfectly supports capture groups
6873
+ // and is blisteringly fast since it skips thread queues completely.
6874
+ if (this.onepass !== null) {
6875
+ return OnePass.execute(this, input, pos, anchor, ncap);
6876
+ }
6877
+
5477
6878
  // If the user wants capturing groups (ncap > 0), the DFA mathematically CANNOT do it.
5478
6879
  // We must use the NFA.
5479
6880
  if (ncap > 0) {
6881
+ // Backtracker bit-state execution bounds check
6882
+ if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
6883
+ return Backtracker.execute(this, input, pos, anchor, ncap);
6884
+ }
6885
+ // NFA execution
5480
6886
  return this.doExecuteNFA(input, pos, anchor, ncap);
5481
6887
  }
5482
6888
  const dfaResult = this.dfa.match(input, pos, anchor);
@@ -5485,6 +6891,11 @@ class RE2 {
5485
6891
  return dfaResult ? [] : null; // Return empty array to signify "matched but no captures"
5486
6892
  }
5487
6893
 
6894
+ // Backtracker bit-state execution bounds check
6895
+ if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
6896
+ return Backtracker.execute(this, input, pos, anchor, ncap);
6897
+ }
6898
+
5488
6899
  // Fallback to NFA
5489
6900
  return this.doExecuteNFA(input, pos, anchor, ncap);
5490
6901
  }
@@ -6065,6 +7476,50 @@ class RE2 {
6065
7476
  }
6066
7477
  }
6067
7478
 
7479
+ class RE2Set {
7480
+ constructor(anchor = RE2Flags.UNANCHORED, flags = RE2Flags.PERL) {
7481
+ this.anchor = anchor;
7482
+ this.flags = flags;
7483
+ this.regexps = [];
7484
+ this.prog = null;
7485
+ this.dfa = null;
7486
+ this.dummyRe2 = null;
7487
+ }
7488
+ add(pattern) {
7489
+ if (this.prog) {
7490
+ throw new RE2JSCompileException('Cannot add patterns after compile');
7491
+ }
7492
+ const re = Parser.parse(pattern, this.flags);
7493
+ this.regexps.push(Simplify.simplify(re));
7494
+ return this.regexps.length - 1;
7495
+ }
7496
+ compile() {
7497
+ if (this.prog) return;
7498
+ this.prog = Compiler.compileSet(this.regexps);
7499
+ this.dfa = new DFA(this.prog);
7500
+ this.dummyRe2 = {
7501
+ prog: this.prog,
7502
+ cond: this.prog.startCond(),
7503
+ prefix: '',
7504
+ prefixRune: 0,
7505
+ longest: false
7506
+ };
7507
+ }
7508
+ match(input) {
7509
+ if (!this.prog) this.compile();
7510
+ const machineInput = Array.isArray(input) ? MachineInput.fromUTF8(input) : MachineInput.fromUTF16(input);
7511
+
7512
+ // Fast path: Try the blistering fast DFA
7513
+ const dfaResult = this.dfa.matchSet(machineInput, 0, this.anchor);
7514
+ if (dfaResult !== null) return dfaResult;
7515
+
7516
+ // Safe Fallback: Handle boundaries (\b) or massive state explosions via NFA
7517
+ const machine = Machine.fromRE2(this.dummyRe2);
7518
+ machine.init(0);
7519
+ return machine.matchSet(machineInput, 0, this.anchor);
7520
+ }
7521
+ }
7522
+
6068
7523
  /**
6069
7524
  * Transform JS regex string to RE2 regex string
6070
7525
  */
@@ -6075,13 +7530,6 @@ class TranslateRegExpString {
6075
7530
  static isHexadecimal(ch) {
6076
7531
  return '0' <= ch && ch <= '9' || 'A' <= ch && ch <= 'F' || 'a' <= ch && ch <= 'f';
6077
7532
  }
6078
- static getUtf8CharSize(ch) {
6079
- const code = ch.charCodeAt(0);
6080
- if (code < 0x80) return 1; // 1-byte (ASCII)
6081
- if (code < 0x800) return 2; // 2-byte
6082
- if (code < 0x10000) return 3; // 3-byte
6083
- return 4; // 4-byte (surrogate pairs, rare characters)
6084
- }
6085
7533
  static translate(data) {
6086
7534
  if (typeof data !== 'string') {
6087
7535
  return data;
@@ -6154,7 +7602,8 @@ class TranslateRegExpString {
6154
7602
  default:
6155
7603
  {
6156
7604
  result += '\\';
6157
- let symSize = TranslateRegExpString.getUtf8CharSize(ch);
7605
+ let cp = data.codePointAt(i + 1);
7606
+ let symSize = Utils.charCount(cp);
6158
7607
  result += data.substring(i + 1, i + 1 + symSize);
6159
7608
  i += symSize + 1;
6160
7609
  continue;
@@ -6174,7 +7623,8 @@ class TranslateRegExpString {
6174
7623
  continue;
6175
7624
  }
6176
7625
  }
6177
- let symSize = TranslateRegExpString.getUtf8CharSize(ch);
7626
+ let cp = data.codePointAt(i);
7627
+ let symSize = Utils.charCount(cp);
6178
7628
  result += data.substring(i, i + symSize);
6179
7629
  i += symSize;
6180
7630
  }
@@ -6537,5 +7987,7 @@ exports.RE2JSCompileException = RE2JSCompileException;
6537
7987
  exports.RE2JSException = RE2JSException;
6538
7988
  exports.RE2JSFlagsException = RE2JSFlagsException;
6539
7989
  exports.RE2JSGroupException = RE2JSGroupException;
7990
+ exports.RE2JSInternalException = RE2JSInternalException;
6540
7991
  exports.RE2JSSyntaxException = RE2JSSyntaxException;
7992
+ exports.RE2Set = RE2Set;
6541
7993
  //# sourceMappingURL=index.cjs.cjs.map