1 module dcharWidth;
2 
3 import std.process : environment;
4 import std.typecons : tuple,Tuple;
5 import std.format;
6 
7 
8 alias table = int[][];
9 
10 uint first(int[] xs) {
11   return xs[0];
12 }
13 uint last(int[] xs) {
14   return xs[1];
15 }
16 
17 private bool	eastAsianWidth;
18 private Condition defaultCondition;
19 
20 static this() {
21   if (auto env = environment.get("RUNEWIDTH_EASTASIAN")){
22 		eastAsianWidth = env == "1";
23   }
24   else {
25 		eastAsianWidth = isEastAsian();
26   }
27 
28   defaultCondition = Condition(eastAsianWidth);
29 }
30 
31 bool inTables(A...)(dchar r, A tables) {
32   foreach (t; tables) {
33     if (r.inTable(t)) {
34       return true;
35     }
36   }
37   return false;
38 }
39 
40 bool inTable(dchar r, table t) {
41 	if (r < t[0].first) {
42 		return false;
43 	}
44 
45 	long bot = 0;
46 	long top = t.length - 1;
47 	while (top >= bot) {
48 		long mid = (bot + top) / 2;
49 
50 		if (t[mid].last < r) {
51 			bot = mid + 1;
52     }
53     else if (t[mid].first > r) {
54 			top = mid - 1;
55     }
56     else {
57       return true;
58     }
59 	}
60 
61 	return false;
62 }
63 
64 auto private_ = [
65 	[0x00E000, 0x00F8FF], [0x0F0000, 0x0FFFFD], [0x100000, 0x10FFFD],
66 ];
67 
68 auto nonprint = [
69 	[0x0000, 0x001F], [0x007F, 0x009F], [0x00AD, 0x00AD],
70 	[0x070F, 0x070F], [0x180B, 0x180E], [0x200B, 0x200F],
71 	[0x2028, 0x2029],
72 	[0x202A, 0x202E], [0x206A, 0x206F], [0xD800, 0xDFFF],
73 	[0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB], [0xFFFE, 0xFFFF],
74 ];
75 
76 auto combining = [
77 	[0x0300, 0x036F], [0x0483, 0x0489], [0x0591, 0x05BD],
78 	[0x05BF, 0x05BF], [0x05C1, 0x05C2], [0x05C4, 0x05C5],
79 	[0x05C7, 0x05C7], [0x0610, 0x061A], [0x064B, 0x065F],
80 	[0x0670, 0x0670], [0x06D6, 0x06DC], [0x06DF, 0x06E4],
81 	[0x06E7, 0x06E8], [0x06EA, 0x06ED], [0x0711, 0x0711],
82 	[0x0730, 0x074A], [0x07A6, 0x07B0], [0x07EB, 0x07F3],
83 	[0x0816, 0x0819], [0x081B, 0x0823], [0x0825, 0x0827],
84 	[0x0829, 0x082D], [0x0859, 0x085B], [0x08D4, 0x08E1],
85 	[0x08E3, 0x0903], [0x093A, 0x093C], [0x093E, 0x094F],
86 	[0x0951, 0x0957], [0x0962, 0x0963], [0x0981, 0x0983],
87 	[0x09BC, 0x09BC], [0x09BE, 0x09C4], [0x09C7, 0x09C8],
88 	[0x09CB, 0x09CD], [0x09D7, 0x09D7], [0x09E2, 0x09E3],
89 	[0x0A01, 0x0A03], [0x0A3C, 0x0A3C], [0x0A3E, 0x0A42],
90 	[0x0A47, 0x0A48], [0x0A4B, 0x0A4D], [0x0A51, 0x0A51],
91 	[0x0A70, 0x0A71], [0x0A75, 0x0A75], [0x0A81, 0x0A83],
92 	[0x0ABC, 0x0ABC], [0x0ABE, 0x0AC5], [0x0AC7, 0x0AC9],
93 	[0x0ACB, 0x0ACD], [0x0AE2, 0x0AE3], [0x0B01, 0x0B03],
94 	[0x0B3C, 0x0B3C], [0x0B3E, 0x0B44], [0x0B47, 0x0B48],
95 	[0x0B4B, 0x0B4D], [0x0B56, 0x0B57], [0x0B62, 0x0B63],
96 	[0x0B82, 0x0B82], [0x0BBE, 0x0BC2], [0x0BC6, 0x0BC8],
97 	[0x0BCA, 0x0BCD], [0x0BD7, 0x0BD7], [0x0C00, 0x0C03],
98 	[0x0C3E, 0x0C44], [0x0C46, 0x0C48], [0x0C4A, 0x0C4D],
99 	[0x0C55, 0x0C56], [0x0C62, 0x0C63], [0x0C81, 0x0C83],
100 	[0x0CBC, 0x0CBC], [0x0CBE, 0x0CC4], [0x0CC6, 0x0CC8],
101 	[0x0CCA, 0x0CCD], [0x0CD5, 0x0CD6], [0x0CE2, 0x0CE3],
102 	[0x0D01, 0x0D03], [0x0D3E, 0x0D44], [0x0D46, 0x0D48],
103 	[0x0D4A, 0x0D4D], [0x0D57, 0x0D57], [0x0D62, 0x0D63],
104 	[0x0D82, 0x0D83], [0x0DCA, 0x0DCA], [0x0DCF, 0x0DD4],
105 	[0x0DD6, 0x0DD6], [0x0DD8, 0x0DDF], [0x0DF2, 0x0DF3],
106 	[0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],
107 	[0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],
108 	[0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],
109 	[0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F3E, 0x0F3F],
110 	[0x0F71, 0x0F84], [0x0F86, 0x0F87], [0x0F8D, 0x0F97],
111 	[0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102B, 0x103E],
112 	[0x1056, 0x1059], [0x105E, 0x1060], [0x1062, 0x1064],
113 	[0x1067, 0x106D], [0x1071, 0x1074], [0x1082, 0x108D],
114 	[0x108F, 0x108F], [0x109A, 0x109D], [0x135D, 0x135F],
115 	[0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],
116 	[0x1772, 0x1773], [0x17B4, 0x17D3], [0x17DD, 0x17DD],
117 	[0x180B, 0x180D], [0x1885, 0x1886], [0x18A9, 0x18A9],
118 	[0x1920, 0x192B], [0x1930, 0x193B], [0x1A17, 0x1A1B],
119 	[0x1A55, 0x1A5E], [0x1A60, 0x1A7C], [0x1A7F, 0x1A7F],
120 	[0x1AB0, 0x1ABE], [0x1B00, 0x1B04], [0x1B34, 0x1B44],
121 	[0x1B6B, 0x1B73], [0x1B80, 0x1B82], [0x1BA1, 0x1BAD],
122 	[0x1BE6, 0x1BF3], [0x1C24, 0x1C37], [0x1CD0, 0x1CD2],
123 	[0x1CD4, 0x1CE8], [0x1CED, 0x1CED], [0x1CF2, 0x1CF4],
124 	[0x1CF8, 0x1CF9], [0x1DC0, 0x1DF5], [0x1DFB, 0x1DFF],
125 	[0x20D0, 0x20F0], [0x2CEF, 0x2CF1], [0x2D7F, 0x2D7F],
126 	[0x2DE0, 0x2DFF], [0x302A, 0x302F], [0x3099, 0x309A],
127 	[0xA66F, 0xA672], [0xA674, 0xA67D], [0xA69E, 0xA69F],
128 	[0xA6F0, 0xA6F1], [0xA802, 0xA802], [0xA806, 0xA806],
129 	[0xA80B, 0xA80B], [0xA823, 0xA827], [0xA880, 0xA881],
130 	[0xA8B4, 0xA8C5], [0xA8E0, 0xA8F1], [0xA926, 0xA92D],
131 	[0xA947, 0xA953], [0xA980, 0xA983], [0xA9B3, 0xA9C0],
132 	[0xA9E5, 0xA9E5], [0xAA29, 0xAA36], [0xAA43, 0xAA43],
133 	[0xAA4C, 0xAA4D], [0xAA7B, 0xAA7D], [0xAAB0, 0xAAB0],
134 	[0xAAB2, 0xAAB4], [0xAAB7, 0xAAB8], [0xAABE, 0xAABF],
135 	[0xAAC1, 0xAAC1], [0xAAEB, 0xAAEF], [0xAAF5, 0xAAF6],
136 	[0xABE3, 0xABEA], [0xABEC, 0xABED], [0xFB1E, 0xFB1E],
137 	[0xFE00, 0xFE0F], [0xFE20, 0xFE2F], [0x101FD, 0x101FD],
138 	[0x102E0, 0x102E0], [0x10376, 0x1037A], [0x10A01, 0x10A03],
139 	[0x10A05, 0x10A06], [0x10A0C, 0x10A0F], [0x10A38, 0x10A3A],
140 	[0x10A3F, 0x10A3F], [0x10AE5, 0x10AE6], [0x11000, 0x11002],
141 	[0x11038, 0x11046], [0x1107F, 0x11082], [0x110B0, 0x110BA],
142 	[0x11100, 0x11102], [0x11127, 0x11134], [0x11173, 0x11173],
143 	[0x11180, 0x11182], [0x111B3, 0x111C0], [0x111CA, 0x111CC],
144 	[0x1122C, 0x11237], [0x1123E, 0x1123E], [0x112DF, 0x112EA],
145 	[0x11300, 0x11303], [0x1133C, 0x1133C], [0x1133E, 0x11344],
146 	[0x11347, 0x11348], [0x1134B, 0x1134D], [0x11357, 0x11357],
147 	[0x11362, 0x11363], [0x11366, 0x1136C], [0x11370, 0x11374],
148 	[0x11435, 0x11446], [0x114B0, 0x114C3], [0x115AF, 0x115B5],
149 	[0x115B8, 0x115C0], [0x115DC, 0x115DD], [0x11630, 0x11640],
150 	[0x116AB, 0x116B7], [0x1171D, 0x1172B], [0x11C2F, 0x11C36],
151 	[0x11C38, 0x11C3F], [0x11C92, 0x11CA7], [0x11CA9, 0x11CB6],
152 	[0x16AF0, 0x16AF4], [0x16B30, 0x16B36], [0x16F51, 0x16F7E],
153 	[0x16F8F, 0x16F92], [0x1BC9D, 0x1BC9E], [0x1D165, 0x1D169],
154 	[0x1D16D, 0x1D172], [0x1D17B, 0x1D182], [0x1D185, 0x1D18B],
155 	[0x1D1AA, 0x1D1AD], [0x1D242, 0x1D244], [0x1DA00, 0x1DA36],
156 	[0x1DA3B, 0x1DA6C], [0x1DA75, 0x1DA75], [0x1DA84, 0x1DA84],
157 	[0x1DA9B, 0x1DA9F], [0x1DAA1, 0x1DAAF], [0x1E000, 0x1E006],
158 	[0x1E008, 0x1E018], [0x1E01B, 0x1E021], [0x1E023, 0x1E024],
159 	[0x1E026, 0x1E02A], [0x1E8D0, 0x1E8D6], [0x1E944, 0x1E94A],
160 	[0xE0100, 0xE01EF],
161 ];
162 
163 auto doublewidth = [
164 	[0x1100, 0x115F], [0x231A, 0x231B], [0x2329, 0x232A],
165 	[0x23E9, 0x23EC], [0x23F0, 0x23F0], [0x23F3, 0x23F3],
166 	[0x25FD, 0x25FE], [0x2614, 0x2615], [0x2648, 0x2653],
167 	[0x267F, 0x267F], [0x2693, 0x2693], [0x26A1, 0x26A1],
168 	[0x26AA, 0x26AB], [0x26BD, 0x26BE], [0x26C4, 0x26C5],
169 	[0x26CE, 0x26CE], [0x26D4, 0x26D4], [0x26EA, 0x26EA],
170 	[0x26F2, 0x26F3], [0x26F5, 0x26F5], [0x26FA, 0x26FA],
171 	[0x26FD, 0x26FD], [0x2705, 0x2705], [0x270A, 0x270B],
172 	[0x2728, 0x2728], [0x274C, 0x274C], [0x274E, 0x274E],
173 	[0x2753, 0x2755], [0x2757, 0x2757], [0x2795, 0x2797],
174 	[0x27B0, 0x27B0], [0x27BF, 0x27BF], [0x2B1B, 0x2B1C],
175 	[0x2B50, 0x2B50], [0x2B55, 0x2B55], [0x2E80, 0x2E99],
176 	[0x2E9B, 0x2EF3], [0x2F00, 0x2FD5], [0x2FF0, 0x2FFB],
177 	[0x3000, 0x303E], [0x3041, 0x3096], [0x3099, 0x30FF],
178 	[0x3105, 0x312D], [0x3131, 0x318E], [0x3190, 0x31BA],
179 	[0x31C0, 0x31E3], [0x31F0, 0x321E], [0x3220, 0x3247],
180 	[0x3250, 0x32FE], [0x3300, 0x4DBF], [0x4E00, 0xA48C],
181 	[0xA490, 0xA4C6], [0xA960, 0xA97C], [0xAC00, 0xD7A3],
182 	[0xF900, 0xFAFF], [0xFE10, 0xFE19], [0xFE30, 0xFE52],
183 	[0xFE54, 0xFE66], [0xFE68, 0xFE6B], [0xFF01, 0xFF60],
184 	[0xFFE0, 0xFFE6], [0x16FE0, 0x16FE0], [0x17000, 0x187EC],
185 	[0x18800, 0x18AF2], [0x1B000, 0x1B001], [0x1F004, 0x1F004],
186 	[0x1F0CF, 0x1F0CF], [0x1F18E, 0x1F18E], [0x1F191, 0x1F19A],
187 	[0x1F200, 0x1F202], [0x1F210, 0x1F23B], [0x1F240, 0x1F248],
188 	[0x1F250, 0x1F251], [0x1F300, 0x1F320], [0x1F32D, 0x1F335],
189 	[0x1F337, 0x1F37C], [0x1F37E, 0x1F393], [0x1F3A0, 0x1F3CA],
190 	[0x1F3CF, 0x1F3D3], [0x1F3E0, 0x1F3F0], [0x1F3F4, 0x1F3F4],
191 	[0x1F3F8, 0x1F43E], [0x1F440, 0x1F440], [0x1F442, 0x1F4FC],
192 	[0x1F4FF, 0x1F53D], [0x1F54B, 0x1F54E], [0x1F550, 0x1F567],
193 	[0x1F57A, 0x1F57A], [0x1F595, 0x1F596], [0x1F5A4, 0x1F5A4],
194 	[0x1F5FB, 0x1F64F], [0x1F680, 0x1F6C5], [0x1F6CC, 0x1F6CC],
195 	[0x1F6D0, 0x1F6D2], [0x1F6EB, 0x1F6EC], [0x1F6F4, 0x1F6F6],
196 	[0x1F910, 0x1F91E], [0x1F920, 0x1F927], [0x1F930, 0x1F930],
197 	[0x1F933, 0x1F93E], [0x1F940, 0x1F94B], [0x1F950, 0x1F95E],
198 	[0x1F980, 0x1F991], [0x1F9C0, 0x1F9C0], [0x20000, 0x2FFFD],
199 	[0x30000, 0x3FFFD],
200 ];
201 
202 auto ambiguous = [
203 	[0x00A1, 0x00A1], [0x00A4, 0x00A4], [0x00A7, 0x00A8],
204 	[0x00AA, 0x00AA], [0x00AD, 0x00AE], [0x00B0, 0x00B4],
205 	[0x00B6, 0x00BA], [0x00BC, 0x00BF], [0x00C6, 0x00C6],
206 	[0x00D0, 0x00D0], [0x00D7, 0x00D8], [0x00DE, 0x00E1],
207 	[0x00E6, 0x00E6], [0x00E8, 0x00EA], [0x00EC, 0x00ED],
208 	[0x00F0, 0x00F0], [0x00F2, 0x00F3], [0x00F7, 0x00FA],
209 	[0x00FC, 0x00FC], [0x00FE, 0x00FE], [0x0101, 0x0101],
210 	[0x0111, 0x0111], [0x0113, 0x0113], [0x011B, 0x011B],
211 	[0x0126, 0x0127], [0x012B, 0x012B], [0x0131, 0x0133],
212 	[0x0138, 0x0138], [0x013F, 0x0142], [0x0144, 0x0144],
213 	[0x0148, 0x014B], [0x014D, 0x014D], [0x0152, 0x0153],
214 	[0x0166, 0x0167], [0x016B, 0x016B], [0x01CE, 0x01CE],
215 	[0x01D0, 0x01D0], [0x01D2, 0x01D2], [0x01D4, 0x01D4],
216 	[0x01D6, 0x01D6], [0x01D8, 0x01D8], [0x01DA, 0x01DA],
217 	[0x01DC, 0x01DC], [0x0251, 0x0251], [0x0261, 0x0261],
218 	[0x02C4, 0x02C4], [0x02C7, 0x02C7], [0x02C9, 0x02CB],
219 	[0x02CD, 0x02CD], [0x02D0, 0x02D0], [0x02D8, 0x02DB],
220 	[0x02DD, 0x02DD], [0x02DF, 0x02DF], [0x0300, 0x036F],
221 	[0x0391, 0x03A1], [0x03A3, 0x03A9], [0x03B1, 0x03C1],
222 	[0x03C3, 0x03C9], [0x0401, 0x0401], [0x0410, 0x044F],
223 	[0x0451, 0x0451], [0x2010, 0x2010], [0x2013, 0x2016],
224 	[0x2018, 0x2019], [0x201C, 0x201D], [0x2020, 0x2022],
225 	[0x2024, 0x2027], [0x2030, 0x2030], [0x2032, 0x2033],
226 	[0x2035, 0x2035], [0x203B, 0x203B], [0x203E, 0x203E],
227 	[0x2074, 0x2074], [0x207F, 0x207F], [0x2081, 0x2084],
228 	[0x20AC, 0x20AC], [0x2103, 0x2103], [0x2105, 0x2105],
229 	[0x2109, 0x2109], [0x2113, 0x2113], [0x2116, 0x2116],
230 	[0x2121, 0x2122], [0x2126, 0x2126], [0x212B, 0x212B],
231 	[0x2153, 0x2154], [0x215B, 0x215E], [0x2160, 0x216B],
232 	[0x2170, 0x2179], [0x2189, 0x2189], [0x2190, 0x2199],
233 	[0x21B8, 0x21B9], [0x21D2, 0x21D2], [0x21D4, 0x21D4],
234 	[0x21E7, 0x21E7], [0x2200, 0x2200], [0x2202, 0x2203],
235 	[0x2207, 0x2208], [0x220B, 0x220B], [0x220F, 0x220F],
236 	[0x2211, 0x2211], [0x2215, 0x2215], [0x221A, 0x221A],
237 	[0x221D, 0x2220], [0x2223, 0x2223], [0x2225, 0x2225],
238 	[0x2227, 0x222C], [0x222E, 0x222E], [0x2234, 0x2237],
239 	[0x223C, 0x223D], [0x2248, 0x2248], [0x224C, 0x224C],
240 	[0x2252, 0x2252], [0x2260, 0x2261], [0x2264, 0x2267],
241 	[0x226A, 0x226B], [0x226E, 0x226F], [0x2282, 0x2283],
242 	[0x2286, 0x2287], [0x2295, 0x2295], [0x2299, 0x2299],
243 	[0x22A5, 0x22A5], [0x22BF, 0x22BF], [0x2312, 0x2312],
244 	[0x2460, 0x24E9], [0x24EB, 0x254B], [0x2550, 0x2573],
245 	[0x2580, 0x258F], [0x2592, 0x2595], [0x25A0, 0x25A1],
246 	[0x25A3, 0x25A9], [0x25B2, 0x25B3], [0x25B6, 0x25B7],
247 	[0x25BC, 0x25BD], [0x25C0, 0x25C1], [0x25C6, 0x25C8],
248 	[0x25CB, 0x25CB], [0x25CE, 0x25D1], [0x25E2, 0x25E5],
249 	[0x25EF, 0x25EF], [0x2605, 0x2606], [0x2609, 0x2609],
250 	[0x260E, 0x260F], [0x261C, 0x261C], [0x261E, 0x261E],
251 	[0x2640, 0x2640], [0x2642, 0x2642], [0x2660, 0x2661],
252 	[0x2663, 0x2665], [0x2667, 0x266A], [0x266C, 0x266D],
253 	[0x266F, 0x266F], [0x269E, 0x269F], [0x26BF, 0x26BF],
254 	[0x26C6, 0x26CD], [0x26CF, 0x26D3], [0x26D5, 0x26E1],
255 	[0x26E3, 0x26E3], [0x26E8, 0x26E9], [0x26EB, 0x26F1],
256 	[0x26F4, 0x26F4], [0x26F6, 0x26F9], [0x26FB, 0x26FC],
257 	[0x26FE, 0x26FF], [0x273D, 0x273D], [0x2776, 0x277F],
258 	[0x2B56, 0x2B59], [0x3248, 0x324F], [0xE000, 0xF8FF],
259 	[0xFE00, 0xFE0F], [0xFFFD, 0xFFFD], [0x1F100, 0x1F10A],
260 	[0x1F110, 0x1F12D], [0x1F130, 0x1F169], [0x1F170, 0x1F18D],
261 	[0x1F18F, 0x1F190], [0x1F19B, 0x1F1AC], [0xE0100, 0xE01EF],
262 	[0xF0000, 0xFFFFD], [0x100000, 0x10FFFD],
263 ];
264 
265 auto emoji = [
266 	[0x1F1E6, 0x1F1FF], [0x1F321, 0x1F321], [0x1F324, 0x1F32C],
267 	[0x1F336, 0x1F336], [0x1F37D, 0x1F37D], [0x1F396, 0x1F397],
268 	[0x1F399, 0x1F39B], [0x1F39E, 0x1F39F], [0x1F3CB, 0x1F3CE],
269 	[0x1F3D4, 0x1F3DF], [0x1F3F3, 0x1F3F5], [0x1F3F7, 0x1F3F7],
270 	[0x1F43F, 0x1F43F], [0x1F441, 0x1F441], [0x1F4FD, 0x1F4FD],
271 	[0x1F549, 0x1F54A], [0x1F56F, 0x1F570], [0x1F573, 0x1F579],
272 	[0x1F587, 0x1F587], [0x1F58A, 0x1F58D], [0x1F590, 0x1F590],
273 	[0x1F5A5, 0x1F5A5], [0x1F5A8, 0x1F5A8], [0x1F5B1, 0x1F5B2],
274 	[0x1F5BC, 0x1F5BC], [0x1F5C2, 0x1F5C4], [0x1F5D1, 0x1F5D3],
275 	[0x1F5DC, 0x1F5DE], [0x1F5E1, 0x1F5E1], [0x1F5E3, 0x1F5E3],
276 	[0x1F5E8, 0x1F5E8], [0x1F5EF, 0x1F5EF], [0x1F5F3, 0x1F5F3],
277 	[0x1F5FA, 0x1F5FA], [0x1F6CB, 0x1F6CF], [0x1F6E0, 0x1F6E5],
278 	[0x1F6E9, 0x1F6E9], [0x1F6F0, 0x1F6F0], [0x1F6F3, 0x1F6F3],
279 ];
280 
281 auto notassigned = [
282 	[0x0378, 0x0379], [0x0380, 0x0383], [0x038B, 0x038B],
283 	[0x038D, 0x038D], [0x03A2, 0x03A2], [0x0530, 0x0530],
284 	[0x0557, 0x0558], [0x0560, 0x0560], [0x0588, 0x0588],
285 	[0x058B, 0x058C], [0x0590, 0x0590], [0x05C8, 0x05CF],
286 	[0x05EB, 0x05EF], [0x05F5, 0x05FF], [0x061D, 0x061D],
287 	[0x070E, 0x070E], [0x074B, 0x074C], [0x07B2, 0x07BF],
288 	[0x07FB, 0x07FF], [0x082E, 0x082F], [0x083F, 0x083F],
289 	[0x085C, 0x085D], [0x085F, 0x089F], [0x08B5, 0x08B5],
290 	[0x08BE, 0x08D3], [0x0984, 0x0984], [0x098D, 0x098E],
291 	[0x0991, 0x0992], [0x09A9, 0x09A9], [0x09B1, 0x09B1],
292 	[0x09B3, 0x09B5], [0x09BA, 0x09BB], [0x09C5, 0x09C6],
293 	[0x09C9, 0x09CA], [0x09CF, 0x09D6], [0x09D8, 0x09DB],
294 	[0x09DE, 0x09DE], [0x09E4, 0x09E5], [0x09FC, 0x0A00],
295 	[0x0A04, 0x0A04], [0x0A0B, 0x0A0E], [0x0A11, 0x0A12],
296 	[0x0A29, 0x0A29], [0x0A31, 0x0A31], [0x0A34, 0x0A34],
297 	[0x0A37, 0x0A37], [0x0A3A, 0x0A3B], [0x0A3D, 0x0A3D],
298 	[0x0A43, 0x0A46], [0x0A49, 0x0A4A], [0x0A4E, 0x0A50],
299 	[0x0A52, 0x0A58], [0x0A5D, 0x0A5D], [0x0A5F, 0x0A65],
300 	[0x0A76, 0x0A80], [0x0A84, 0x0A84], [0x0A8E, 0x0A8E],
301 	[0x0A92, 0x0A92], [0x0AA9, 0x0AA9], [0x0AB1, 0x0AB1],
302 	[0x0AB4, 0x0AB4], [0x0ABA, 0x0ABB], [0x0AC6, 0x0AC6],
303 	[0x0ACA, 0x0ACA], [0x0ACE, 0x0ACF], [0x0AD1, 0x0ADF],
304 	[0x0AE4, 0x0AE5], [0x0AF2, 0x0AF8], [0x0AFA, 0x0B00],
305 	[0x0B04, 0x0B04], [0x0B0D, 0x0B0E], [0x0B11, 0x0B12],
306 	[0x0B29, 0x0B29], [0x0B31, 0x0B31], [0x0B34, 0x0B34],
307 	[0x0B3A, 0x0B3B], [0x0B45, 0x0B46], [0x0B49, 0x0B4A],
308 	[0x0B4E, 0x0B55], [0x0B58, 0x0B5B], [0x0B5E, 0x0B5E],
309 	[0x0B64, 0x0B65], [0x0B78, 0x0B81], [0x0B84, 0x0B84],
310 	[0x0B8B, 0x0B8D], [0x0B91, 0x0B91], [0x0B96, 0x0B98],
311 	[0x0B9B, 0x0B9B], [0x0B9D, 0x0B9D], [0x0BA0, 0x0BA2],
312 	[0x0BA5, 0x0BA7], [0x0BAB, 0x0BAD], [0x0BBA, 0x0BBD],
313 	[0x0BC3, 0x0BC5], [0x0BC9, 0x0BC9], [0x0BCE, 0x0BCF],
314 	[0x0BD1, 0x0BD6], [0x0BD8, 0x0BE5], [0x0BFB, 0x0BFF],
315 	[0x0C04, 0x0C04], [0x0C0D, 0x0C0D], [0x0C11, 0x0C11],
316 	[0x0C29, 0x0C29], [0x0C3A, 0x0C3C], [0x0C45, 0x0C45],
317 	[0x0C49, 0x0C49], [0x0C4E, 0x0C54], [0x0C57, 0x0C57],
318 	[0x0C5B, 0x0C5F], [0x0C64, 0x0C65], [0x0C70, 0x0C77],
319 	[0x0C84, 0x0C84], [0x0C8D, 0x0C8D], [0x0C91, 0x0C91],
320 	[0x0CA9, 0x0CA9], [0x0CB4, 0x0CB4], [0x0CBA, 0x0CBB],
321 	[0x0CC5, 0x0CC5], [0x0CC9, 0x0CC9], [0x0CCE, 0x0CD4],
322 	[0x0CD7, 0x0CDD], [0x0CDF, 0x0CDF], [0x0CE4, 0x0CE5],
323 	[0x0CF0, 0x0CF0], [0x0CF3, 0x0D00], [0x0D04, 0x0D04],
324 	[0x0D0D, 0x0D0D], [0x0D11, 0x0D11], [0x0D3B, 0x0D3C],
325 	[0x0D45, 0x0D45], [0x0D49, 0x0D49], [0x0D50, 0x0D53],
326 	[0x0D64, 0x0D65], [0x0D80, 0x0D81], [0x0D84, 0x0D84],
327 	[0x0D97, 0x0D99], [0x0DB2, 0x0DB2], [0x0DBC, 0x0DBC],
328 	[0x0DBE, 0x0DBF], [0x0DC7, 0x0DC9], [0x0DCB, 0x0DCE],
329 	[0x0DD5, 0x0DD5], [0x0DD7, 0x0DD7], [0x0DE0, 0x0DE5],
330 	[0x0DF0, 0x0DF1], [0x0DF5, 0x0E00], [0x0E3B, 0x0E3E],
331 	[0x0E5C, 0x0E80], [0x0E83, 0x0E83], [0x0E85, 0x0E86],
332 	[0x0E89, 0x0E89], [0x0E8B, 0x0E8C], [0x0E8E, 0x0E93],
333 	[0x0E98, 0x0E98], [0x0EA0, 0x0EA0], [0x0EA4, 0x0EA4],
334 	[0x0EA6, 0x0EA6], [0x0EA8, 0x0EA9], [0x0EAC, 0x0EAC],
335 	[0x0EBA, 0x0EBA], [0x0EBE, 0x0EBF], [0x0EC5, 0x0EC5],
336 	[0x0EC7, 0x0EC7], [0x0ECE, 0x0ECF], [0x0EDA, 0x0EDB],
337 	[0x0EE0, 0x0EFF], [0x0F48, 0x0F48], [0x0F6D, 0x0F70],
338 	[0x0F98, 0x0F98], [0x0FBD, 0x0FBD], [0x0FCD, 0x0FCD],
339 	[0x0FDB, 0x0FFF], [0x10C6, 0x10C6], [0x10C8, 0x10CC],
340 	[0x10CE, 0x10CF], [0x1249, 0x1249], [0x124E, 0x124F],
341 	[0x1257, 0x1257], [0x1259, 0x1259], [0x125E, 0x125F],
342 	[0x1289, 0x1289], [0x128E, 0x128F], [0x12B1, 0x12B1],
343 	[0x12B6, 0x12B7], [0x12BF, 0x12BF], [0x12C1, 0x12C1],
344 	[0x12C6, 0x12C7], [0x12D7, 0x12D7], [0x1311, 0x1311],
345 	[0x1316, 0x1317], [0x135B, 0x135C], [0x137D, 0x137F],
346 	[0x139A, 0x139F], [0x13F6, 0x13F7], [0x13FE, 0x13FF],
347 	[0x169D, 0x169F], [0x16F9, 0x16FF], [0x170D, 0x170D],
348 	[0x1715, 0x171F], [0x1737, 0x173F], [0x1754, 0x175F],
349 	[0x176D, 0x176D], [0x1771, 0x1771], [0x1774, 0x177F],
350 	[0x17DE, 0x17DF], [0x17EA, 0x17EF], [0x17FA, 0x17FF],
351 	[0x180F, 0x180F], [0x181A, 0x181F], [0x1878, 0x187F],
352 	[0x18AB, 0x18AF], [0x18F6, 0x18FF], [0x191F, 0x191F],
353 	[0x192C, 0x192F], [0x193C, 0x193F], [0x1941, 0x1943],
354 	[0x196E, 0x196F], [0x1975, 0x197F], [0x19AC, 0x19AF],
355 	[0x19CA, 0x19CF], [0x19DB, 0x19DD], [0x1A1C, 0x1A1D],
356 	[0x1A5F, 0x1A5F], [0x1A7D, 0x1A7E], [0x1A8A, 0x1A8F],
357 	[0x1A9A, 0x1A9F], [0x1AAE, 0x1AAF], [0x1ABF, 0x1AFF],
358 	[0x1B4C, 0x1B4F], [0x1B7D, 0x1B7F], [0x1BF4, 0x1BFB],
359 	[0x1C38, 0x1C3A], [0x1C4A, 0x1C4C], [0x1C89, 0x1CBF],
360 	[0x1CC8, 0x1CCF], [0x1CF7, 0x1CF7], [0x1CFA, 0x1CFF],
361 	[0x1DF6, 0x1DFA], [0x1F16, 0x1F17], [0x1F1E, 0x1F1F],
362 	[0x1F46, 0x1F47], [0x1F4E, 0x1F4F], [0x1F58, 0x1F58],
363 	[0x1F5A, 0x1F5A], [0x1F5C, 0x1F5C], [0x1F5E, 0x1F5E],
364 	[0x1F7E, 0x1F7F], [0x1FB5, 0x1FB5], [0x1FC5, 0x1FC5],
365 	[0x1FD4, 0x1FD5], [0x1FDC, 0x1FDC], [0x1FF0, 0x1FF1],
366 	[0x1FF5, 0x1FF5], [0x1FFF, 0x1FFF], [0x2065, 0x2065],
367 	[0x2072, 0x2073], [0x208F, 0x208F], [0x209D, 0x209F],
368 	[0x20BF, 0x20CF], [0x20F1, 0x20FF], [0x218C, 0x218F],
369 	[0x23FF, 0x23FF], [0x2427, 0x243F], [0x244B, 0x245F],
370 	[0x2B74, 0x2B75], [0x2B96, 0x2B97], [0x2BBA, 0x2BBC],
371 	[0x2BC9, 0x2BC9], [0x2BD2, 0x2BEB], [0x2BF0, 0x2BFF],
372 	[0x2C2F, 0x2C2F], [0x2C5F, 0x2C5F], [0x2CF4, 0x2CF8],
373 	[0x2D26, 0x2D26], [0x2D28, 0x2D2C], [0x2D2E, 0x2D2F],
374 	[0x2D68, 0x2D6E], [0x2D71, 0x2D7E], [0x2D97, 0x2D9F],
375 	[0x2DA7, 0x2DA7], [0x2DAF, 0x2DAF], [0x2DB7, 0x2DB7],
376 	[0x2DBF, 0x2DBF], [0x2DC7, 0x2DC7], [0x2DCF, 0x2DCF],
377 	[0x2DD7, 0x2DD7], [0x2DDF, 0x2DDF], [0x2E45, 0x2E7F],
378 	[0x2E9A, 0x2E9A], [0x2EF4, 0x2EFF], [0x2FD6, 0x2FEF],
379 	[0x2FFC, 0x2FFF], [0x3040, 0x3040], [0x3097, 0x3098],
380 	[0x3100, 0x3104], [0x312E, 0x3130], [0x318F, 0x318F],
381 	[0x31BB, 0x31BF], [0x31E4, 0x31EF], [0x321F, 0x321F],
382 	[0x32FF, 0x32FF], [0x4DB6, 0x4DBF], [0x9FD6, 0x9FFF],
383 	[0xA48D, 0xA48F], [0xA4C7, 0xA4CF], [0xA62C, 0xA63F],
384 	[0xA6F8, 0xA6FF], [0xA7AF, 0xA7AF], [0xA7B8, 0xA7F6],
385 	[0xA82C, 0xA82F], [0xA83A, 0xA83F], [0xA878, 0xA87F],
386 	[0xA8C6, 0xA8CD], [0xA8DA, 0xA8DF], [0xA8FE, 0xA8FF],
387 	[0xA954, 0xA95E], [0xA97D, 0xA97F], [0xA9CE, 0xA9CE],
388 	[0xA9DA, 0xA9DD], [0xA9FF, 0xA9FF], [0xAA37, 0xAA3F],
389 	[0xAA4E, 0xAA4F], [0xAA5A, 0xAA5B], [0xAAC3, 0xAADA],
390 	[0xAAF7, 0xAB00], [0xAB07, 0xAB08], [0xAB0F, 0xAB10],
391 	[0xAB17, 0xAB1F], [0xAB27, 0xAB27], [0xAB2F, 0xAB2F],
392 	[0xAB66, 0xAB6F], [0xABEE, 0xABEF], [0xABFA, 0xABFF],
393 	[0xD7A4, 0xD7AF], [0xD7C7, 0xD7CA], [0xD7FC, 0xD7FF],
394 	[0xFA6E, 0xFA6F], [0xFADA, 0xFAFF], [0xFB07, 0xFB12],
395 	[0xFB18, 0xFB1C], [0xFB37, 0xFB37], [0xFB3D, 0xFB3D],
396 	[0xFB3F, 0xFB3F], [0xFB42, 0xFB42], [0xFB45, 0xFB45],
397 	[0xFBC2, 0xFBD2], [0xFD40, 0xFD4F], [0xFD90, 0xFD91],
398 	[0xFDC8, 0xFDEF], [0xFDFE, 0xFDFF], [0xFE1A, 0xFE1F],
399 	[0xFE53, 0xFE53], [0xFE67, 0xFE67], [0xFE6C, 0xFE6F],
400 	[0xFE75, 0xFE75], [0xFEFD, 0xFEFE], [0xFF00, 0xFF00],
401 	[0xFFBF, 0xFFC1], [0xFFC8, 0xFFC9], [0xFFD0, 0xFFD1],
402 	[0xFFD8, 0xFFD9], [0xFFDD, 0xFFDF], [0xFFE7, 0xFFE7],
403 	[0xFFEF, 0xFFF8], [0xFFFE, 0xFFFF], [0x1000C, 0x1000C],
404 	[0x10027, 0x10027], [0x1003B, 0x1003B], [0x1003E, 0x1003E],
405 	[0x1004E, 0x1004F], [0x1005E, 0x1007F], [0x100FB, 0x100FF],
406 	[0x10103, 0x10106], [0x10134, 0x10136], [0x1018F, 0x1018F],
407 	[0x1019C, 0x1019F], [0x101A1, 0x101CF], [0x101FE, 0x1027F],
408 	[0x1029D, 0x1029F], [0x102D1, 0x102DF], [0x102FC, 0x102FF],
409 	[0x10324, 0x1032F], [0x1034B, 0x1034F], [0x1037B, 0x1037F],
410 	[0x1039E, 0x1039E], [0x103C4, 0x103C7], [0x103D6, 0x103FF],
411 	[0x1049E, 0x1049F], [0x104AA, 0x104AF], [0x104D4, 0x104D7],
412 	[0x104FC, 0x104FF], [0x10528, 0x1052F], [0x10564, 0x1056E],
413 	[0x10570, 0x105FF], [0x10737, 0x1073F], [0x10756, 0x1075F],
414 	[0x10768, 0x107FF], [0x10806, 0x10807], [0x10809, 0x10809],
415 	[0x10836, 0x10836], [0x10839, 0x1083B], [0x1083D, 0x1083E],
416 	[0x10856, 0x10856], [0x1089F, 0x108A6], [0x108B0, 0x108DF],
417 	[0x108F3, 0x108F3], [0x108F6, 0x108FA], [0x1091C, 0x1091E],
418 	[0x1093A, 0x1093E], [0x10940, 0x1097F], [0x109B8, 0x109BB],
419 	[0x109D0, 0x109D1], [0x10A04, 0x10A04], [0x10A07, 0x10A0B],
420 	[0x10A14, 0x10A14], [0x10A18, 0x10A18], [0x10A34, 0x10A37],
421 	[0x10A3B, 0x10A3E], [0x10A48, 0x10A4F], [0x10A59, 0x10A5F],
422 	[0x10AA0, 0x10ABF], [0x10AE7, 0x10AEA], [0x10AF7, 0x10AFF],
423 	[0x10B36, 0x10B38], [0x10B56, 0x10B57], [0x10B73, 0x10B77],
424 	[0x10B92, 0x10B98], [0x10B9D, 0x10BA8], [0x10BB0, 0x10BFF],
425 	[0x10C49, 0x10C7F], [0x10CB3, 0x10CBF], [0x10CF3, 0x10CF9],
426 	[0x10D00, 0x10E5F], [0x10E7F, 0x10FFF], [0x1104E, 0x11051],
427 	[0x11070, 0x1107E], [0x110C2, 0x110CF], [0x110E9, 0x110EF],
428 	[0x110FA, 0x110FF], [0x11135, 0x11135], [0x11144, 0x1114F],
429 	[0x11177, 0x1117F], [0x111CE, 0x111CF], [0x111E0, 0x111E0],
430 	[0x111F5, 0x111FF], [0x11212, 0x11212], [0x1123F, 0x1127F],
431 	[0x11287, 0x11287], [0x11289, 0x11289], [0x1128E, 0x1128E],
432 	[0x1129E, 0x1129E], [0x112AA, 0x112AF], [0x112EB, 0x112EF],
433 	[0x112FA, 0x112FF], [0x11304, 0x11304], [0x1130D, 0x1130E],
434 	[0x11311, 0x11312], [0x11329, 0x11329], [0x11331, 0x11331],
435 	[0x11334, 0x11334], [0x1133A, 0x1133B], [0x11345, 0x11346],
436 	[0x11349, 0x1134A], [0x1134E, 0x1134F], [0x11351, 0x11356],
437 	[0x11358, 0x1135C], [0x11364, 0x11365], [0x1136D, 0x1136F],
438 	[0x11375, 0x113FF], [0x1145A, 0x1145A], [0x1145C, 0x1145C],
439 	[0x1145E, 0x1147F], [0x114C8, 0x114CF], [0x114DA, 0x1157F],
440 	[0x115B6, 0x115B7], [0x115DE, 0x115FF], [0x11645, 0x1164F],
441 	[0x1165A, 0x1165F], [0x1166D, 0x1167F], [0x116B8, 0x116BF],
442 	[0x116CA, 0x116FF], [0x1171A, 0x1171C], [0x1172C, 0x1172F],
443 	[0x11740, 0x1189F], [0x118F3, 0x118FE], [0x11900, 0x11ABF],
444 	[0x11AF9, 0x11BFF], [0x11C09, 0x11C09], [0x11C37, 0x11C37],
445 	[0x11C46, 0x11C4F], [0x11C6D, 0x11C6F], [0x11C90, 0x11C91],
446 	[0x11CA8, 0x11CA8], [0x11CB7, 0x11FFF], [0x1239A, 0x123FF],
447 	[0x1246F, 0x1246F], [0x12475, 0x1247F], [0x12544, 0x12FFF],
448 	[0x1342F, 0x143FF], [0x14647, 0x167FF], [0x16A39, 0x16A3F],
449 	[0x16A5F, 0x16A5F], [0x16A6A, 0x16A6D], [0x16A70, 0x16ACF],
450 	[0x16AEE, 0x16AEF], [0x16AF6, 0x16AFF], [0x16B46, 0x16B4F],
451 	[0x16B5A, 0x16B5A], [0x16B62, 0x16B62], [0x16B78, 0x16B7C],
452 	[0x16B90, 0x16EFF], [0x16F45, 0x16F4F], [0x16F7F, 0x16F8E],
453 	[0x16FA0, 0x16FDF], [0x16FE1, 0x16FFF], [0x187ED, 0x187FF],
454 	[0x18AF3, 0x1AFFF], [0x1B002, 0x1BBFF], [0x1BC6B, 0x1BC6F],
455 	[0x1BC7D, 0x1BC7F], [0x1BC89, 0x1BC8F], [0x1BC9A, 0x1BC9B],
456 	[0x1BCA4, 0x1CFFF], [0x1D0F6, 0x1D0FF], [0x1D127, 0x1D128],
457 	[0x1D1E9, 0x1D1FF], [0x1D246, 0x1D2FF], [0x1D357, 0x1D35F],
458 	[0x1D372, 0x1D3FF], [0x1D455, 0x1D455], [0x1D49D, 0x1D49D],
459 	[0x1D4A0, 0x1D4A1], [0x1D4A3, 0x1D4A4], [0x1D4A7, 0x1D4A8],
460 	[0x1D4AD, 0x1D4AD], [0x1D4BA, 0x1D4BA], [0x1D4BC, 0x1D4BC],
461 	[0x1D4C4, 0x1D4C4], [0x1D506, 0x1D506], [0x1D50B, 0x1D50C],
462 	[0x1D515, 0x1D515], [0x1D51D, 0x1D51D], [0x1D53A, 0x1D53A],
463 	[0x1D53F, 0x1D53F], [0x1D545, 0x1D545], [0x1D547, 0x1D549],
464 	[0x1D551, 0x1D551], [0x1D6A6, 0x1D6A7], [0x1D7CC, 0x1D7CD],
465 	[0x1DA8C, 0x1DA9A], [0x1DAA0, 0x1DAA0], [0x1DAB0, 0x1DFFF],
466 	[0x1E007, 0x1E007], [0x1E019, 0x1E01A], [0x1E022, 0x1E022],
467 	[0x1E025, 0x1E025], [0x1E02B, 0x1E7FF], [0x1E8C5, 0x1E8C6],
468 	[0x1E8D7, 0x1E8FF], [0x1E94B, 0x1E94F], [0x1E95A, 0x1E95D],
469 	[0x1E960, 0x1EDFF], [0x1EE04, 0x1EE04], [0x1EE20, 0x1EE20],
470 	[0x1EE23, 0x1EE23], [0x1EE25, 0x1EE26], [0x1EE28, 0x1EE28],
471 	[0x1EE33, 0x1EE33], [0x1EE38, 0x1EE38], [0x1EE3A, 0x1EE3A],
472 	[0x1EE3C, 0x1EE41], [0x1EE43, 0x1EE46], [0x1EE48, 0x1EE48],
473 	[0x1EE4A, 0x1EE4A], [0x1EE4C, 0x1EE4C], [0x1EE50, 0x1EE50],
474 	[0x1EE53, 0x1EE53], [0x1EE55, 0x1EE56], [0x1EE58, 0x1EE58],
475 	[0x1EE5A, 0x1EE5A], [0x1EE5C, 0x1EE5C], [0x1EE5E, 0x1EE5E],
476 	[0x1EE60, 0x1EE60], [0x1EE63, 0x1EE63], [0x1EE65, 0x1EE66],
477 	[0x1EE6B, 0x1EE6B], [0x1EE73, 0x1EE73], [0x1EE78, 0x1EE78],
478 	[0x1EE7D, 0x1EE7D], [0x1EE7F, 0x1EE7F], [0x1EE8A, 0x1EE8A],
479 	[0x1EE9C, 0x1EEA0], [0x1EEA4, 0x1EEA4], [0x1EEAA, 0x1EEAA],
480 	[0x1EEBC, 0x1EEEF], [0x1EEF2, 0x1EFFF], [0x1F02C, 0x1F02F],
481 	[0x1F094, 0x1F09F], [0x1F0AF, 0x1F0B0], [0x1F0C0, 0x1F0C0],
482 	[0x1F0D0, 0x1F0D0], [0x1F0F6, 0x1F0FF], [0x1F10D, 0x1F10F],
483 	[0x1F12F, 0x1F12F], [0x1F16C, 0x1F16F], [0x1F1AD, 0x1F1E5],
484 	[0x1F203, 0x1F20F], [0x1F23C, 0x1F23F], [0x1F249, 0x1F24F],
485 	[0x1F252, 0x1F2FF], [0x1F6D3, 0x1F6DF], [0x1F6ED, 0x1F6EF],
486 	[0x1F6F7, 0x1F6FF], [0x1F774, 0x1F77F], [0x1F7D5, 0x1F7FF],
487 	[0x1F80C, 0x1F80F], [0x1F848, 0x1F84F], [0x1F85A, 0x1F85F],
488 	[0x1F888, 0x1F88F], [0x1F8AE, 0x1F90F], [0x1F91F, 0x1F91F],
489 	[0x1F928, 0x1F92F], [0x1F931, 0x1F932], [0x1F93F, 0x1F93F],
490 	[0x1F94C, 0x1F94F], [0x1F95F, 0x1F97F], [0x1F992, 0x1F9BF],
491 	[0x1F9C1, 0x1FFFF], [0x2A6D7, 0x2A6FF], [0x2B735, 0x2B73F],
492 	[0x2B81E, 0x2B81F], [0x2CEA2, 0x2F7FF], [0x2FA1E, 0xE0000],
493 	[0xE0002, 0xE001F], [0xE0080, 0xE00FF], [0xE01F0, 0xEFFFF],
494 	[0xFFFFE, 0xFFFFF],
495 ];
496 
497 auto neutral = [
498 	[0x0000, 0x001F], [0x007F, 0x007F], [0x0080, 0x009F],
499 	[0x00A0, 0x00A0], [0x00A9, 0x00A9], [0x00AB, 0x00AB],
500 	[0x00B5, 0x00B5], [0x00BB, 0x00BB], [0x00C0, 0x00C5],
501 	[0x00C7, 0x00CF], [0x00D1, 0x00D6], [0x00D9, 0x00DD],
502 	[0x00E2, 0x00E5], [0x00E7, 0x00E7], [0x00EB, 0x00EB],
503 	[0x00EE, 0x00EF], [0x00F1, 0x00F1], [0x00F4, 0x00F6],
504 	[0x00FB, 0x00FB], [0x00FD, 0x00FD], [0x00FF, 0x00FF],
505 	[0x0100, 0x0100], [0x0102, 0x0110], [0x0112, 0x0112],
506 	[0x0114, 0x011A], [0x011C, 0x0125], [0x0128, 0x012A],
507 	[0x012C, 0x0130], [0x0134, 0x0137], [0x0139, 0x013E],
508 	[0x0143, 0x0143], [0x0145, 0x0147], [0x014C, 0x014C],
509 	[0x014E, 0x0151], [0x0154, 0x0165], [0x0168, 0x016A],
510 	[0x016C, 0x017F], [0x0180, 0x01BA], [0x01BB, 0x01BB],
511 	[0x01BC, 0x01BF], [0x01C0, 0x01C3], [0x01C4, 0x01CD],
512 	[0x01CF, 0x01CF], [0x01D1, 0x01D1], [0x01D3, 0x01D3],
513 	[0x01D5, 0x01D5], [0x01D7, 0x01D7], [0x01D9, 0x01D9],
514 	[0x01DB, 0x01DB], [0x01DD, 0x024F], [0x0250, 0x0250],
515 	[0x0252, 0x0260], [0x0262, 0x0293], [0x0294, 0x0294],
516 	[0x0295, 0x02AF], [0x02B0, 0x02C1], [0x02C2, 0x02C3],
517 	[0x02C5, 0x02C5], [0x02C6, 0x02C6], [0x02C8, 0x02C8],
518 	[0x02CC, 0x02CC], [0x02CE, 0x02CF], [0x02D1, 0x02D1],
519 	[0x02D2, 0x02D7], [0x02DC, 0x02DC], [0x02DE, 0x02DE],
520 	[0x02E0, 0x02E4], [0x02E5, 0x02EB], [0x02EC, 0x02EC],
521 	[0x02ED, 0x02ED], [0x02EE, 0x02EE], [0x02EF, 0x02FF],
522 	[0x0370, 0x0373], [0x0374, 0x0374], [0x0375, 0x0375],
523 	[0x0376, 0x0377], [0x037A, 0x037A], [0x037B, 0x037D],
524 	[0x037E, 0x037E], [0x037F, 0x037F], [0x0384, 0x0385],
525 	[0x0386, 0x0386], [0x0387, 0x0387], [0x0388, 0x038A],
526 	[0x038C, 0x038C], [0x038E, 0x0390], [0x03AA, 0x03B0],
527 	[0x03C2, 0x03C2], [0x03CA, 0x03F5], [0x03F6, 0x03F6],
528 	[0x03F7, 0x03FF], [0x0400, 0x0400], [0x0402, 0x040F],
529 	[0x0450, 0x0450], [0x0452, 0x0481], [0x0482, 0x0482],
530 	[0x0483, 0x0487], [0x0488, 0x0489], [0x048A, 0x04FF],
531 	[0x0500, 0x052F], [0x0531, 0x0556], [0x0559, 0x0559],
532 	[0x055A, 0x055F], [0x0561, 0x0587], [0x0589, 0x0589],
533 	[0x058A, 0x058A], [0x058D, 0x058E], [0x058F, 0x058F],
534 	[0x0591, 0x05BD], [0x05BE, 0x05BE], [0x05BF, 0x05BF],
535 	[0x05C0, 0x05C0], [0x05C1, 0x05C2], [0x05C3, 0x05C3],
536 	[0x05C4, 0x05C5], [0x05C6, 0x05C6], [0x05C7, 0x05C7],
537 	[0x05D0, 0x05EA], [0x05F0, 0x05F2], [0x05F3, 0x05F4],
538 	[0x0600, 0x0605], [0x0606, 0x0608], [0x0609, 0x060A],
539 	[0x060B, 0x060B], [0x060C, 0x060D], [0x060E, 0x060F],
540 	[0x0610, 0x061A], [0x061B, 0x061B], [0x061C, 0x061C],
541 	[0x061E, 0x061F], [0x0620, 0x063F], [0x0640, 0x0640],
542 	[0x0641, 0x064A], [0x064B, 0x065F], [0x0660, 0x0669],
543 	[0x066A, 0x066D], [0x066E, 0x066F], [0x0670, 0x0670],
544 	[0x0671, 0x06D3], [0x06D4, 0x06D4], [0x06D5, 0x06D5],
545 	[0x06D6, 0x06DC], [0x06DD, 0x06DD], [0x06DE, 0x06DE],
546 	[0x06DF, 0x06E4], [0x06E5, 0x06E6], [0x06E7, 0x06E8],
547 	[0x06E9, 0x06E9], [0x06EA, 0x06ED], [0x06EE, 0x06EF],
548 	[0x06F0, 0x06F9], [0x06FA, 0x06FC], [0x06FD, 0x06FE],
549 	[0x06FF, 0x06FF], [0x0700, 0x070D], [0x070F, 0x070F],
550 	[0x0710, 0x0710], [0x0711, 0x0711], [0x0712, 0x072F],
551 	[0x0730, 0x074A], [0x074D, 0x074F], [0x0750, 0x077F],
552 	[0x0780, 0x07A5], [0x07A6, 0x07B0], [0x07B1, 0x07B1],
553 	[0x07C0, 0x07C9], [0x07CA, 0x07EA], [0x07EB, 0x07F3],
554 	[0x07F4, 0x07F5], [0x07F6, 0x07F6], [0x07F7, 0x07F9],
555 	[0x07FA, 0x07FA], [0x0800, 0x0815], [0x0816, 0x0819],
556 	[0x081A, 0x081A], [0x081B, 0x0823], [0x0824, 0x0824],
557 	[0x0825, 0x0827], [0x0828, 0x0828], [0x0829, 0x082D],
558 	[0x0830, 0x083E], [0x0840, 0x0858], [0x0859, 0x085B],
559 	[0x085E, 0x085E], [0x08A0, 0x08B4], [0x08B6, 0x08BD],
560 	[0x08D4, 0x08E1], [0x08E2, 0x08E2], [0x08E3, 0x08FF],
561 	[0x0900, 0x0902], [0x0903, 0x0903], [0x0904, 0x0939],
562 	[0x093A, 0x093A], [0x093B, 0x093B], [0x093C, 0x093C],
563 	[0x093D, 0x093D], [0x093E, 0x0940], [0x0941, 0x0948],
564 	[0x0949, 0x094C], [0x094D, 0x094D], [0x094E, 0x094F],
565 	[0x0950, 0x0950], [0x0951, 0x0957], [0x0958, 0x0961],
566 	[0x0962, 0x0963], [0x0964, 0x0965], [0x0966, 0x096F],
567 	[0x0970, 0x0970], [0x0971, 0x0971], [0x0972, 0x097F],
568 	[0x0980, 0x0980], [0x0981, 0x0981], [0x0982, 0x0983],
569 	[0x0985, 0x098C], [0x098F, 0x0990], [0x0993, 0x09A8],
570 	[0x09AA, 0x09B0], [0x09B2, 0x09B2], [0x09B6, 0x09B9],
571 	[0x09BC, 0x09BC], [0x09BD, 0x09BD], [0x09BE, 0x09C0],
572 	[0x09C1, 0x09C4], [0x09C7, 0x09C8], [0x09CB, 0x09CC],
573 	[0x09CD, 0x09CD], [0x09CE, 0x09CE], [0x09D7, 0x09D7],
574 	[0x09DC, 0x09DD], [0x09DF, 0x09E1], [0x09E2, 0x09E3],
575 	[0x09E6, 0x09EF], [0x09F0, 0x09F1], [0x09F2, 0x09F3],
576 	[0x09F4, 0x09F9], [0x09FA, 0x09FA], [0x09FB, 0x09FB],
577 	[0x0A01, 0x0A02], [0x0A03, 0x0A03], [0x0A05, 0x0A0A],
578 	[0x0A0F, 0x0A10], [0x0A13, 0x0A28], [0x0A2A, 0x0A30],
579 	[0x0A32, 0x0A33], [0x0A35, 0x0A36], [0x0A38, 0x0A39],
580 	[0x0A3C, 0x0A3C], [0x0A3E, 0x0A40], [0x0A41, 0x0A42],
581 	[0x0A47, 0x0A48], [0x0A4B, 0x0A4D], [0x0A51, 0x0A51],
582 	[0x0A59, 0x0A5C], [0x0A5E, 0x0A5E], [0x0A66, 0x0A6F],
583 	[0x0A70, 0x0A71], [0x0A72, 0x0A74], [0x0A75, 0x0A75],
584 	[0x0A81, 0x0A82], [0x0A83, 0x0A83], [0x0A85, 0x0A8D],
585 	[0x0A8F, 0x0A91], [0x0A93, 0x0AA8], [0x0AAA, 0x0AB0],
586 	[0x0AB2, 0x0AB3], [0x0AB5, 0x0AB9], [0x0ABC, 0x0ABC],
587 	[0x0ABD, 0x0ABD], [0x0ABE, 0x0AC0], [0x0AC1, 0x0AC5],
588 	[0x0AC7, 0x0AC8], [0x0AC9, 0x0AC9], [0x0ACB, 0x0ACC],
589 	[0x0ACD, 0x0ACD], [0x0AD0, 0x0AD0], [0x0AE0, 0x0AE1],
590 	[0x0AE2, 0x0AE3], [0x0AE6, 0x0AEF], [0x0AF0, 0x0AF0],
591 	[0x0AF1, 0x0AF1], [0x0AF9, 0x0AF9], [0x0B01, 0x0B01],
592 	[0x0B02, 0x0B03], [0x0B05, 0x0B0C], [0x0B0F, 0x0B10],
593 	[0x0B13, 0x0B28], [0x0B2A, 0x0B30], [0x0B32, 0x0B33],
594 	[0x0B35, 0x0B39], [0x0B3C, 0x0B3C], [0x0B3D, 0x0B3D],
595 	[0x0B3E, 0x0B3E], [0x0B3F, 0x0B3F], [0x0B40, 0x0B40],
596 	[0x0B41, 0x0B44], [0x0B47, 0x0B48], [0x0B4B, 0x0B4C],
597 	[0x0B4D, 0x0B4D], [0x0B56, 0x0B56], [0x0B57, 0x0B57],
598 	[0x0B5C, 0x0B5D], [0x0B5F, 0x0B61], [0x0B62, 0x0B63],
599 	[0x0B66, 0x0B6F], [0x0B70, 0x0B70], [0x0B71, 0x0B71],
600 	[0x0B72, 0x0B77], [0x0B82, 0x0B82], [0x0B83, 0x0B83],
601 	[0x0B85, 0x0B8A], [0x0B8E, 0x0B90], [0x0B92, 0x0B95],
602 	[0x0B99, 0x0B9A], [0x0B9C, 0x0B9C], [0x0B9E, 0x0B9F],
603 	[0x0BA3, 0x0BA4], [0x0BA8, 0x0BAA], [0x0BAE, 0x0BB9],
604 	[0x0BBE, 0x0BBF], [0x0BC0, 0x0BC0], [0x0BC1, 0x0BC2],
605 	[0x0BC6, 0x0BC8], [0x0BCA, 0x0BCC], [0x0BCD, 0x0BCD],
606 	[0x0BD0, 0x0BD0], [0x0BD7, 0x0BD7], [0x0BE6, 0x0BEF],
607 	[0x0BF0, 0x0BF2], [0x0BF3, 0x0BF8], [0x0BF9, 0x0BF9],
608 	[0x0BFA, 0x0BFA], [0x0C00, 0x0C00], [0x0C01, 0x0C03],
609 	[0x0C05, 0x0C0C], [0x0C0E, 0x0C10], [0x0C12, 0x0C28],
610 	[0x0C2A, 0x0C39], [0x0C3D, 0x0C3D], [0x0C3E, 0x0C40],
611 	[0x0C41, 0x0C44], [0x0C46, 0x0C48], [0x0C4A, 0x0C4D],
612 	[0x0C55, 0x0C56], [0x0C58, 0x0C5A], [0x0C60, 0x0C61],
613 	[0x0C62, 0x0C63], [0x0C66, 0x0C6F], [0x0C78, 0x0C7E],
614 	[0x0C7F, 0x0C7F], [0x0C80, 0x0C80], [0x0C81, 0x0C81],
615 	[0x0C82, 0x0C83], [0x0C85, 0x0C8C], [0x0C8E, 0x0C90],
616 	[0x0C92, 0x0CA8], [0x0CAA, 0x0CB3], [0x0CB5, 0x0CB9],
617 	[0x0CBC, 0x0CBC], [0x0CBD, 0x0CBD], [0x0CBE, 0x0CBE],
618 	[0x0CBF, 0x0CBF], [0x0CC0, 0x0CC4], [0x0CC6, 0x0CC6],
619 	[0x0CC7, 0x0CC8], [0x0CCA, 0x0CCB], [0x0CCC, 0x0CCD],
620 	[0x0CD5, 0x0CD6], [0x0CDE, 0x0CDE], [0x0CE0, 0x0CE1],
621 	[0x0CE2, 0x0CE3], [0x0CE6, 0x0CEF], [0x0CF1, 0x0CF2],
622 	[0x0D01, 0x0D01], [0x0D02, 0x0D03], [0x0D05, 0x0D0C],
623 	[0x0D0E, 0x0D10], [0x0D12, 0x0D3A], [0x0D3D, 0x0D3D],
624 	[0x0D3E, 0x0D40], [0x0D41, 0x0D44], [0x0D46, 0x0D48],
625 	[0x0D4A, 0x0D4C], [0x0D4D, 0x0D4D], [0x0D4E, 0x0D4E],
626 	[0x0D4F, 0x0D4F], [0x0D54, 0x0D56], [0x0D57, 0x0D57],
627 	[0x0D58, 0x0D5E], [0x0D5F, 0x0D61], [0x0D62, 0x0D63],
628 	[0x0D66, 0x0D6F], [0x0D70, 0x0D78], [0x0D79, 0x0D79],
629 	[0x0D7A, 0x0D7F], [0x0D82, 0x0D83], [0x0D85, 0x0D96],
630 	[0x0D9A, 0x0DB1], [0x0DB3, 0x0DBB], [0x0DBD, 0x0DBD],
631 	[0x0DC0, 0x0DC6], [0x0DCA, 0x0DCA], [0x0DCF, 0x0DD1],
632 	[0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6], [0x0DD8, 0x0DDF],
633 	[0x0DE6, 0x0DEF], [0x0DF2, 0x0DF3], [0x0DF4, 0x0DF4],
634 	[0x0E01, 0x0E30], [0x0E31, 0x0E31], [0x0E32, 0x0E33],
635 	[0x0E34, 0x0E3A], [0x0E3F, 0x0E3F], [0x0E40, 0x0E45],
636 	[0x0E46, 0x0E46], [0x0E47, 0x0E4E], [0x0E4F, 0x0E4F],
637 	[0x0E50, 0x0E59], [0x0E5A, 0x0E5B], [0x0E81, 0x0E82],
638 	[0x0E84, 0x0E84], [0x0E87, 0x0E88], [0x0E8A, 0x0E8A],
639 	[0x0E8D, 0x0E8D], [0x0E94, 0x0E97], [0x0E99, 0x0E9F],
640 	[0x0EA1, 0x0EA3], [0x0EA5, 0x0EA5], [0x0EA7, 0x0EA7],
641 	[0x0EAA, 0x0EAB], [0x0EAD, 0x0EB0], [0x0EB1, 0x0EB1],
642 	[0x0EB2, 0x0EB3], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],
643 	[0x0EBD, 0x0EBD], [0x0EC0, 0x0EC4], [0x0EC6, 0x0EC6],
644 	[0x0EC8, 0x0ECD], [0x0ED0, 0x0ED9], [0x0EDC, 0x0EDF],
645 	[0x0F00, 0x0F00], [0x0F01, 0x0F03], [0x0F04, 0x0F12],
646 	[0x0F13, 0x0F13], [0x0F14, 0x0F14], [0x0F15, 0x0F17],
647 	[0x0F18, 0x0F19], [0x0F1A, 0x0F1F], [0x0F20, 0x0F29],
648 	[0x0F2A, 0x0F33], [0x0F34, 0x0F34], [0x0F35, 0x0F35],
649 	[0x0F36, 0x0F36], [0x0F37, 0x0F37], [0x0F38, 0x0F38],
650 	[0x0F39, 0x0F39], [0x0F3A, 0x0F3A], [0x0F3B, 0x0F3B],
651 	[0x0F3C, 0x0F3C], [0x0F3D, 0x0F3D], [0x0F3E, 0x0F3F],
652 	[0x0F40, 0x0F47], [0x0F49, 0x0F6C], [0x0F71, 0x0F7E],
653 	[0x0F7F, 0x0F7F], [0x0F80, 0x0F84], [0x0F85, 0x0F85],
654 	[0x0F86, 0x0F87], [0x0F88, 0x0F8C], [0x0F8D, 0x0F97],
655 	[0x0F99, 0x0FBC], [0x0FBE, 0x0FC5], [0x0FC6, 0x0FC6],
656 	[0x0FC7, 0x0FCC], [0x0FCE, 0x0FCF], [0x0FD0, 0x0FD4],
657 	[0x0FD5, 0x0FD8], [0x0FD9, 0x0FDA], [0x1000, 0x102A],
658 	[0x102B, 0x102C], [0x102D, 0x1030], [0x1031, 0x1031],
659 	[0x1032, 0x1037], [0x1038, 0x1038], [0x1039, 0x103A],
660 	[0x103B, 0x103C], [0x103D, 0x103E], [0x103F, 0x103F],
661 	[0x1040, 0x1049], [0x104A, 0x104F], [0x1050, 0x1055],
662 	[0x1056, 0x1057], [0x1058, 0x1059], [0x105A, 0x105D],
663 	[0x105E, 0x1060], [0x1061, 0x1061], [0x1062, 0x1064],
664 	[0x1065, 0x1066], [0x1067, 0x106D], [0x106E, 0x1070],
665 	[0x1071, 0x1074], [0x1075, 0x1081], [0x1082, 0x1082],
666 	[0x1083, 0x1084], [0x1085, 0x1086], [0x1087, 0x108C],
667 	[0x108D, 0x108D], [0x108E, 0x108E], [0x108F, 0x108F],
668 	[0x1090, 0x1099], [0x109A, 0x109C], [0x109D, 0x109D],
669 	[0x109E, 0x109F], [0x10A0, 0x10C5], [0x10C7, 0x10C7],
670 	[0x10CD, 0x10CD], [0x10D0, 0x10FA], [0x10FB, 0x10FB],
671 	[0x10FC, 0x10FC], [0x10FD, 0x10FF], [0x1160, 0x11FF],
672 	[0x1200, 0x1248], [0x124A, 0x124D], [0x1250, 0x1256],
673 	[0x1258, 0x1258], [0x125A, 0x125D], [0x1260, 0x1288],
674 	[0x128A, 0x128D], [0x1290, 0x12B0], [0x12B2, 0x12B5],
675 	[0x12B8, 0x12BE], [0x12C0, 0x12C0], [0x12C2, 0x12C5],
676 	[0x12C8, 0x12D6], [0x12D8, 0x1310], [0x1312, 0x1315],
677 	[0x1318, 0x135A], [0x135D, 0x135F], [0x1360, 0x1368],
678 	[0x1369, 0x137C], [0x1380, 0x138F], [0x1390, 0x1399],
679 	[0x13A0, 0x13F5], [0x13F8, 0x13FD], [0x1400, 0x1400],
680 	[0x1401, 0x166C], [0x166D, 0x166E], [0x166F, 0x167F],
681 	[0x1680, 0x1680], [0x1681, 0x169A], [0x169B, 0x169B],
682 	[0x169C, 0x169C], [0x16A0, 0x16EA], [0x16EB, 0x16ED],
683 	[0x16EE, 0x16F0], [0x16F1, 0x16F8], [0x1700, 0x170C],
684 	[0x170E, 0x1711], [0x1712, 0x1714], [0x1720, 0x1731],
685 	[0x1732, 0x1734], [0x1735, 0x1736], [0x1740, 0x1751],
686 	[0x1752, 0x1753], [0x1760, 0x176C], [0x176E, 0x1770],
687 	[0x1772, 0x1773], [0x1780, 0x17B3], [0x17B4, 0x17B5],
688 	[0x17B6, 0x17B6], [0x17B7, 0x17BD], [0x17BE, 0x17C5],
689 	[0x17C6, 0x17C6], [0x17C7, 0x17C8], [0x17C9, 0x17D3],
690 	[0x17D4, 0x17D6], [0x17D7, 0x17D7], [0x17D8, 0x17DA],
691 	[0x17DB, 0x17DB], [0x17DC, 0x17DC], [0x17DD, 0x17DD],
692 	[0x17E0, 0x17E9], [0x17F0, 0x17F9], [0x1800, 0x1805],
693 	[0x1806, 0x1806], [0x1807, 0x180A], [0x180B, 0x180D],
694 	[0x180E, 0x180E], [0x1810, 0x1819], [0x1820, 0x1842],
695 	[0x1843, 0x1843], [0x1844, 0x1877], [0x1880, 0x1884],
696 	[0x1885, 0x1886], [0x1887, 0x18A8], [0x18A9, 0x18A9],
697 	[0x18AA, 0x18AA], [0x18B0, 0x18F5], [0x1900, 0x191E],
698 	[0x1920, 0x1922], [0x1923, 0x1926], [0x1927, 0x1928],
699 	[0x1929, 0x192B], [0x1930, 0x1931], [0x1932, 0x1932],
700 	[0x1933, 0x1938], [0x1939, 0x193B], [0x1940, 0x1940],
701 	[0x1944, 0x1945], [0x1946, 0x194F], [0x1950, 0x196D],
702 	[0x1970, 0x1974], [0x1980, 0x19AB], [0x19B0, 0x19C9],
703 	[0x19D0, 0x19D9], [0x19DA, 0x19DA], [0x19DE, 0x19DF],
704 	[0x19E0, 0x19FF], [0x1A00, 0x1A16], [0x1A17, 0x1A18],
705 	[0x1A19, 0x1A1A], [0x1A1B, 0x1A1B], [0x1A1E, 0x1A1F],
706 	[0x1A20, 0x1A54], [0x1A55, 0x1A55], [0x1A56, 0x1A56],
707 	[0x1A57, 0x1A57], [0x1A58, 0x1A5E], [0x1A60, 0x1A60],
708 	[0x1A61, 0x1A61], [0x1A62, 0x1A62], [0x1A63, 0x1A64],
709 	[0x1A65, 0x1A6C], [0x1A6D, 0x1A72], [0x1A73, 0x1A7C],
710 	[0x1A7F, 0x1A7F], [0x1A80, 0x1A89], [0x1A90, 0x1A99],
711 	[0x1AA0, 0x1AA6], [0x1AA7, 0x1AA7], [0x1AA8, 0x1AAD],
712 	[0x1AB0, 0x1ABD], [0x1ABE, 0x1ABE], [0x1B00, 0x1B03],
713 	[0x1B04, 0x1B04], [0x1B05, 0x1B33], [0x1B34, 0x1B34],
714 	[0x1B35, 0x1B35], [0x1B36, 0x1B3A], [0x1B3B, 0x1B3B],
715 	[0x1B3C, 0x1B3C], [0x1B3D, 0x1B41], [0x1B42, 0x1B42],
716 	[0x1B43, 0x1B44], [0x1B45, 0x1B4B], [0x1B50, 0x1B59],
717 	[0x1B5A, 0x1B60], [0x1B61, 0x1B6A], [0x1B6B, 0x1B73],
718 	[0x1B74, 0x1B7C], [0x1B80, 0x1B81], [0x1B82, 0x1B82],
719 	[0x1B83, 0x1BA0], [0x1BA1, 0x1BA1], [0x1BA2, 0x1BA5],
720 	[0x1BA6, 0x1BA7], [0x1BA8, 0x1BA9], [0x1BAA, 0x1BAA],
721 	[0x1BAB, 0x1BAD], [0x1BAE, 0x1BAF], [0x1BB0, 0x1BB9],
722 	[0x1BBA, 0x1BBF], [0x1BC0, 0x1BE5], [0x1BE6, 0x1BE6],
723 	[0x1BE7, 0x1BE7], [0x1BE8, 0x1BE9], [0x1BEA, 0x1BEC],
724 	[0x1BED, 0x1BED], [0x1BEE, 0x1BEE], [0x1BEF, 0x1BF1],
725 	[0x1BF2, 0x1BF3], [0x1BFC, 0x1BFF], [0x1C00, 0x1C23],
726 	[0x1C24, 0x1C2B], [0x1C2C, 0x1C33], [0x1C34, 0x1C35],
727 	[0x1C36, 0x1C37], [0x1C3B, 0x1C3F], [0x1C40, 0x1C49],
728 	[0x1C4D, 0x1C4F], [0x1C50, 0x1C59], [0x1C5A, 0x1C77],
729 	[0x1C78, 0x1C7D], [0x1C7E, 0x1C7F], [0x1C80, 0x1C88],
730 	[0x1CC0, 0x1CC7], [0x1CD0, 0x1CD2], [0x1CD3, 0x1CD3],
731 	[0x1CD4, 0x1CE0], [0x1CE1, 0x1CE1], [0x1CE2, 0x1CE8],
732 	[0x1CE9, 0x1CEC], [0x1CED, 0x1CED], [0x1CEE, 0x1CF1],
733 	[0x1CF2, 0x1CF3], [0x1CF4, 0x1CF4], [0x1CF5, 0x1CF6],
734 	[0x1CF8, 0x1CF9], [0x1D00, 0x1D2B], [0x1D2C, 0x1D6A],
735 	[0x1D6B, 0x1D77], [0x1D78, 0x1D78], [0x1D79, 0x1D7F],
736 	[0x1D80, 0x1D9A], [0x1D9B, 0x1DBF], [0x1DC0, 0x1DF5],
737 	[0x1DFB, 0x1DFF], [0x1E00, 0x1EFF], [0x1F00, 0x1F15],
738 	[0x1F18, 0x1F1D], [0x1F20, 0x1F45], [0x1F48, 0x1F4D],
739 	[0x1F50, 0x1F57], [0x1F59, 0x1F59], [0x1F5B, 0x1F5B],
740 	[0x1F5D, 0x1F5D], [0x1F5F, 0x1F7D], [0x1F80, 0x1FB4],
741 	[0x1FB6, 0x1FBC], [0x1FBD, 0x1FBD], [0x1FBE, 0x1FBE],
742 	[0x1FBF, 0x1FC1], [0x1FC2, 0x1FC4], [0x1FC6, 0x1FCC],
743 	[0x1FCD, 0x1FCF], [0x1FD0, 0x1FD3], [0x1FD6, 0x1FDB],
744 	[0x1FDD, 0x1FDF], [0x1FE0, 0x1FEC], [0x1FED, 0x1FEF],
745 	[0x1FF2, 0x1FF4], [0x1FF6, 0x1FFC], [0x1FFD, 0x1FFE],
746 	[0x2000, 0x200A], [0x200B, 0x200F], [0x2011, 0x2012],
747 	[0x2017, 0x2017], [0x201A, 0x201A], [0x201B, 0x201B],
748 	[0x201E, 0x201E], [0x201F, 0x201F], [0x2023, 0x2023],
749 	[0x2028, 0x2028], [0x2029, 0x2029], [0x202A, 0x202E],
750 	[0x202F, 0x202F], [0x2031, 0x2031], [0x2034, 0x2034],
751 	[0x2036, 0x2038], [0x2039, 0x2039], [0x203A, 0x203A],
752 	[0x203C, 0x203D], [0x203F, 0x2040], [0x2041, 0x2043],
753 	[0x2044, 0x2044], [0x2045, 0x2045], [0x2046, 0x2046],
754 	[0x2047, 0x2051], [0x2052, 0x2052], [0x2053, 0x2053],
755 	[0x2054, 0x2054], [0x2055, 0x205E], [0x205F, 0x205F],
756 	[0x2060, 0x2064], [0x2066, 0x206F], [0x2070, 0x2070],
757 	[0x2071, 0x2071], [0x2075, 0x2079], [0x207A, 0x207C],
758 	[0x207D, 0x207D], [0x207E, 0x207E], [0x2080, 0x2080],
759 	[0x2085, 0x2089], [0x208A, 0x208C], [0x208D, 0x208D],
760 	[0x208E, 0x208E], [0x2090, 0x209C], [0x20A0, 0x20A8],
761 	[0x20AA, 0x20AB], [0x20AD, 0x20BE], [0x20D0, 0x20DC],
762 	[0x20DD, 0x20E0], [0x20E1, 0x20E1], [0x20E2, 0x20E4],
763 	[0x20E5, 0x20F0], [0x2100, 0x2101], [0x2102, 0x2102],
764 	[0x2104, 0x2104], [0x2106, 0x2106], [0x2107, 0x2107],
765 	[0x2108, 0x2108], [0x210A, 0x2112], [0x2114, 0x2114],
766 	[0x2115, 0x2115], [0x2117, 0x2117], [0x2118, 0x2118],
767 	[0x2119, 0x211D], [0x211E, 0x2120], [0x2123, 0x2123],
768 	[0x2124, 0x2124], [0x2125, 0x2125], [0x2127, 0x2127],
769 	[0x2128, 0x2128], [0x2129, 0x2129], [0x212A, 0x212A],
770 	[0x212C, 0x212D], [0x212E, 0x212E], [0x212F, 0x2134],
771 	[0x2135, 0x2138], [0x2139, 0x2139], [0x213A, 0x213B],
772 	[0x213C, 0x213F], [0x2140, 0x2144], [0x2145, 0x2149],
773 	[0x214A, 0x214A], [0x214B, 0x214B], [0x214C, 0x214D],
774 	[0x214E, 0x214E], [0x214F, 0x214F], [0x2150, 0x2152],
775 	[0x2155, 0x215A], [0x215F, 0x215F], [0x216C, 0x216F],
776 	[0x217A, 0x2182], [0x2183, 0x2184], [0x2185, 0x2188],
777 	[0x218A, 0x218B], [0x219A, 0x219B], [0x219C, 0x219F],
778 	[0x21A0, 0x21A0], [0x21A1, 0x21A2], [0x21A3, 0x21A3],
779 	[0x21A4, 0x21A5], [0x21A6, 0x21A6], [0x21A7, 0x21AD],
780 	[0x21AE, 0x21AE], [0x21AF, 0x21B7], [0x21BA, 0x21CD],
781 	[0x21CE, 0x21CF], [0x21D0, 0x21D1], [0x21D3, 0x21D3],
782 	[0x21D5, 0x21E6], [0x21E8, 0x21F3], [0x21F4, 0x21FF],
783 	[0x2201, 0x2201], [0x2204, 0x2206], [0x2209, 0x220A],
784 	[0x220C, 0x220E], [0x2210, 0x2210], [0x2212, 0x2214],
785 	[0x2216, 0x2219], [0x221B, 0x221C], [0x2221, 0x2222],
786 	[0x2224, 0x2224], [0x2226, 0x2226], [0x222D, 0x222D],
787 	[0x222F, 0x2233], [0x2238, 0x223B], [0x223E, 0x2247],
788 	[0x2249, 0x224B], [0x224D, 0x2251], [0x2253, 0x225F],
789 	[0x2262, 0x2263], [0x2268, 0x2269], [0x226C, 0x226D],
790 	[0x2270, 0x2281], [0x2284, 0x2285], [0x2288, 0x2294],
791 	[0x2296, 0x2298], [0x229A, 0x22A4], [0x22A6, 0x22BE],
792 	[0x22C0, 0x22FF], [0x2300, 0x2307], [0x2308, 0x2308],
793 	[0x2309, 0x2309], [0x230A, 0x230A], [0x230B, 0x230B],
794 	[0x230C, 0x2311], [0x2313, 0x2319], [0x231C, 0x231F],
795 	[0x2320, 0x2321], [0x2322, 0x2328], [0x232B, 0x237B],
796 	[0x237C, 0x237C], [0x237D, 0x239A], [0x239B, 0x23B3],
797 	[0x23B4, 0x23DB], [0x23DC, 0x23E1], [0x23E2, 0x23E8],
798 	[0x23ED, 0x23EF], [0x23F1, 0x23F2], [0x23F4, 0x23FE],
799 	[0x2400, 0x2426], [0x2440, 0x244A], [0x24EA, 0x24EA],
800 	[0x254C, 0x254F], [0x2574, 0x257F], [0x2590, 0x2591],
801 	[0x2596, 0x259F], [0x25A2, 0x25A2], [0x25AA, 0x25B1],
802 	[0x25B4, 0x25B5], [0x25B8, 0x25BB], [0x25BE, 0x25BF],
803 	[0x25C2, 0x25C5], [0x25C9, 0x25CA], [0x25CC, 0x25CD],
804 	[0x25D2, 0x25E1], [0x25E6, 0x25EE], [0x25F0, 0x25F7],
805 	[0x25F8, 0x25FC], [0x25FF, 0x25FF], [0x2600, 0x2604],
806 	[0x2607, 0x2608], [0x260A, 0x260D], [0x2610, 0x2613],
807 	[0x2616, 0x261B], [0x261D, 0x261D], [0x261F, 0x263F],
808 	[0x2641, 0x2641], [0x2643, 0x2647], [0x2654, 0x265F],
809 	[0x2662, 0x2662], [0x2666, 0x2666], [0x266B, 0x266B],
810 	[0x266E, 0x266E], [0x2670, 0x267E], [0x2680, 0x2692],
811 	[0x2694, 0x269D], [0x26A0, 0x26A0], [0x26A2, 0x26A9],
812 	[0x26AC, 0x26BC], [0x26C0, 0x26C3], [0x26E2, 0x26E2],
813 	[0x26E4, 0x26E7], [0x2700, 0x2704], [0x2706, 0x2709],
814 	[0x270C, 0x2727], [0x2729, 0x273C], [0x273E, 0x274B],
815 	[0x274D, 0x274D], [0x274F, 0x2752], [0x2756, 0x2756],
816 	[0x2758, 0x2767], [0x2768, 0x2768], [0x2769, 0x2769],
817 	[0x276A, 0x276A], [0x276B, 0x276B], [0x276C, 0x276C],
818 	[0x276D, 0x276D], [0x276E, 0x276E], [0x276F, 0x276F],
819 	[0x2770, 0x2770], [0x2771, 0x2771], [0x2772, 0x2772],
820 	[0x2773, 0x2773], [0x2774, 0x2774], [0x2775, 0x2775],
821 	[0x2780, 0x2793], [0x2794, 0x2794], [0x2798, 0x27AF],
822 	[0x27B1, 0x27BE], [0x27C0, 0x27C4], [0x27C5, 0x27C5],
823 	[0x27C6, 0x27C6], [0x27C7, 0x27E5], [0x27EE, 0x27EE],
824 	[0x27EF, 0x27EF], [0x27F0, 0x27FF], [0x2800, 0x28FF],
825 	[0x2900, 0x297F], [0x2980, 0x2982], [0x2983, 0x2983],
826 	[0x2984, 0x2984], [0x2987, 0x2987], [0x2988, 0x2988],
827 	[0x2989, 0x2989], [0x298A, 0x298A], [0x298B, 0x298B],
828 	[0x298C, 0x298C], [0x298D, 0x298D], [0x298E, 0x298E],
829 	[0x298F, 0x298F], [0x2990, 0x2990], [0x2991, 0x2991],
830 	[0x2992, 0x2992], [0x2993, 0x2993], [0x2994, 0x2994],
831 	[0x2995, 0x2995], [0x2996, 0x2996], [0x2997, 0x2997],
832 	[0x2998, 0x2998], [0x2999, 0x29D7], [0x29D8, 0x29D8],
833 	[0x29D9, 0x29D9], [0x29DA, 0x29DA], [0x29DB, 0x29DB],
834 	[0x29DC, 0x29FB], [0x29FC, 0x29FC], [0x29FD, 0x29FD],
835 	[0x29FE, 0x29FF], [0x2A00, 0x2AFF], [0x2B00, 0x2B1A],
836 	[0x2B1D, 0x2B2F], [0x2B30, 0x2B44], [0x2B45, 0x2B46],
837 	[0x2B47, 0x2B4C], [0x2B4D, 0x2B4F], [0x2B51, 0x2B54],
838 	[0x2B5A, 0x2B73], [0x2B76, 0x2B95], [0x2B98, 0x2BB9],
839 	[0x2BBD, 0x2BC8], [0x2BCA, 0x2BD1], [0x2BEC, 0x2BEF],
840 	[0x2C00, 0x2C2E], [0x2C30, 0x2C5E], [0x2C60, 0x2C7B],
841 	[0x2C7C, 0x2C7D], [0x2C7E, 0x2C7F], [0x2C80, 0x2CE4],
842 	[0x2CE5, 0x2CEA], [0x2CEB, 0x2CEE], [0x2CEF, 0x2CF1],
843 	[0x2CF2, 0x2CF3], [0x2CF9, 0x2CFC], [0x2CFD, 0x2CFD],
844 	[0x2CFE, 0x2CFF], [0x2D00, 0x2D25], [0x2D27, 0x2D27],
845 	[0x2D2D, 0x2D2D], [0x2D30, 0x2D67], [0x2D6F, 0x2D6F],
846 	[0x2D70, 0x2D70], [0x2D7F, 0x2D7F], [0x2D80, 0x2D96],
847 	[0x2DA0, 0x2DA6], [0x2DA8, 0x2DAE], [0x2DB0, 0x2DB6],
848 	[0x2DB8, 0x2DBE], [0x2DC0, 0x2DC6], [0x2DC8, 0x2DCE],
849 	[0x2DD0, 0x2DD6], [0x2DD8, 0x2DDE], [0x2DE0, 0x2DFF],
850 	[0x2E00, 0x2E01], [0x2E02, 0x2E02], [0x2E03, 0x2E03],
851 	[0x2E04, 0x2E04], [0x2E05, 0x2E05], [0x2E06, 0x2E08],
852 	[0x2E09, 0x2E09], [0x2E0A, 0x2E0A], [0x2E0B, 0x2E0B],
853 	[0x2E0C, 0x2E0C], [0x2E0D, 0x2E0D], [0x2E0E, 0x2E16],
854 	[0x2E17, 0x2E17], [0x2E18, 0x2E19], [0x2E1A, 0x2E1A],
855 	[0x2E1B, 0x2E1B], [0x2E1C, 0x2E1C], [0x2E1D, 0x2E1D],
856 	[0x2E1E, 0x2E1F], [0x2E20, 0x2E20], [0x2E21, 0x2E21],
857 	[0x2E22, 0x2E22], [0x2E23, 0x2E23], [0x2E24, 0x2E24],
858 	[0x2E25, 0x2E25], [0x2E26, 0x2E26], [0x2E27, 0x2E27],
859 	[0x2E28, 0x2E28], [0x2E29, 0x2E29], [0x2E2A, 0x2E2E],
860 	[0x2E2F, 0x2E2F], [0x2E30, 0x2E39], [0x2E3A, 0x2E3B],
861 	[0x2E3C, 0x2E3F], [0x2E40, 0x2E40], [0x2E41, 0x2E41],
862 	[0x2E42, 0x2E42], [0x2E43, 0x2E44], [0x303F, 0x303F],
863 	[0x4DC0, 0x4DFF], [0xA4D0, 0xA4F7], [0xA4F8, 0xA4FD],
864 	[0xA4FE, 0xA4FF], [0xA500, 0xA60B], [0xA60C, 0xA60C],
865 	[0xA60D, 0xA60F], [0xA610, 0xA61F], [0xA620, 0xA629],
866 	[0xA62A, 0xA62B], [0xA640, 0xA66D], [0xA66E, 0xA66E],
867 	[0xA66F, 0xA66F], [0xA670, 0xA672], [0xA673, 0xA673],
868 	[0xA674, 0xA67D], [0xA67E, 0xA67E], [0xA67F, 0xA67F],
869 	[0xA680, 0xA69B], [0xA69C, 0xA69D], [0xA69E, 0xA69F],
870 	[0xA6A0, 0xA6E5], [0xA6E6, 0xA6EF], [0xA6F0, 0xA6F1],
871 	[0xA6F2, 0xA6F7], [0xA700, 0xA716], [0xA717, 0xA71F],
872 	[0xA720, 0xA721], [0xA722, 0xA76F], [0xA770, 0xA770],
873 	[0xA771, 0xA787], [0xA788, 0xA788], [0xA789, 0xA78A],
874 	[0xA78B, 0xA78E], [0xA78F, 0xA78F], [0xA790, 0xA7AE],
875 	[0xA7B0, 0xA7B7], [0xA7F7, 0xA7F7], [0xA7F8, 0xA7F9],
876 	[0xA7FA, 0xA7FA], [0xA7FB, 0xA7FF], [0xA800, 0xA801],
877 	[0xA802, 0xA802], [0xA803, 0xA805], [0xA806, 0xA806],
878 	[0xA807, 0xA80A], [0xA80B, 0xA80B], [0xA80C, 0xA822],
879 	[0xA823, 0xA824], [0xA825, 0xA826], [0xA827, 0xA827],
880 	[0xA828, 0xA82B], [0xA830, 0xA835], [0xA836, 0xA837],
881 	[0xA838, 0xA838], [0xA839, 0xA839], [0xA840, 0xA873],
882 	[0xA874, 0xA877], [0xA880, 0xA881], [0xA882, 0xA8B3],
883 	[0xA8B4, 0xA8C3], [0xA8C4, 0xA8C5], [0xA8CE, 0xA8CF],
884 	[0xA8D0, 0xA8D9], [0xA8E0, 0xA8F1], [0xA8F2, 0xA8F7],
885 	[0xA8F8, 0xA8FA], [0xA8FB, 0xA8FB], [0xA8FC, 0xA8FC],
886 	[0xA8FD, 0xA8FD], [0xA900, 0xA909], [0xA90A, 0xA925],
887 	[0xA926, 0xA92D], [0xA92E, 0xA92F], [0xA930, 0xA946],
888 	[0xA947, 0xA951], [0xA952, 0xA953], [0xA95F, 0xA95F],
889 	[0xA980, 0xA982], [0xA983, 0xA983], [0xA984, 0xA9B2],
890 	[0xA9B3, 0xA9B3], [0xA9B4, 0xA9B5], [0xA9B6, 0xA9B9],
891 	[0xA9BA, 0xA9BB], [0xA9BC, 0xA9BC], [0xA9BD, 0xA9C0],
892 	[0xA9C1, 0xA9CD], [0xA9CF, 0xA9CF], [0xA9D0, 0xA9D9],
893 	[0xA9DE, 0xA9DF], [0xA9E0, 0xA9E4], [0xA9E5, 0xA9E5],
894 	[0xA9E6, 0xA9E6], [0xA9E7, 0xA9EF], [0xA9F0, 0xA9F9],
895 	[0xA9FA, 0xA9FE], [0xAA00, 0xAA28], [0xAA29, 0xAA2E],
896 	[0xAA2F, 0xAA30], [0xAA31, 0xAA32], [0xAA33, 0xAA34],
897 	[0xAA35, 0xAA36], [0xAA40, 0xAA42], [0xAA43, 0xAA43],
898 	[0xAA44, 0xAA4B], [0xAA4C, 0xAA4C], [0xAA4D, 0xAA4D],
899 	[0xAA50, 0xAA59], [0xAA5C, 0xAA5F], [0xAA60, 0xAA6F],
900 	[0xAA70, 0xAA70], [0xAA71, 0xAA76], [0xAA77, 0xAA79],
901 	[0xAA7A, 0xAA7A], [0xAA7B, 0xAA7B], [0xAA7C, 0xAA7C],
902 	[0xAA7D, 0xAA7D], [0xAA7E, 0xAA7F], [0xAA80, 0xAAAF],
903 	[0xAAB0, 0xAAB0], [0xAAB1, 0xAAB1], [0xAAB2, 0xAAB4],
904 	[0xAAB5, 0xAAB6], [0xAAB7, 0xAAB8], [0xAAB9, 0xAABD],
905 	[0xAABE, 0xAABF], [0xAAC0, 0xAAC0], [0xAAC1, 0xAAC1],
906 	[0xAAC2, 0xAAC2], [0xAADB, 0xAADC], [0xAADD, 0xAADD],
907 	[0xAADE, 0xAADF], [0xAAE0, 0xAAEA], [0xAAEB, 0xAAEB],
908 	[0xAAEC, 0xAAED], [0xAAEE, 0xAAEF], [0xAAF0, 0xAAF1],
909 	[0xAAF2, 0xAAF2], [0xAAF3, 0xAAF4], [0xAAF5, 0xAAF5],
910 	[0xAAF6, 0xAAF6], [0xAB01, 0xAB06], [0xAB09, 0xAB0E],
911 	[0xAB11, 0xAB16], [0xAB20, 0xAB26], [0xAB28, 0xAB2E],
912 	[0xAB30, 0xAB5A], [0xAB5B, 0xAB5B], [0xAB5C, 0xAB5F],
913 	[0xAB60, 0xAB65], [0xAB70, 0xABBF], [0xABC0, 0xABE2],
914 	[0xABE3, 0xABE4], [0xABE5, 0xABE5], [0xABE6, 0xABE7],
915 	[0xABE8, 0xABE8], [0xABE9, 0xABEA], [0xABEB, 0xABEB],
916 	[0xABEC, 0xABEC], [0xABED, 0xABED], [0xABF0, 0xABF9],
917 	[0xD7B0, 0xD7C6], [0xD7CB, 0xD7FB], [0xD800, 0xDB7F],
918 	[0xDB80, 0xDBFF], [0xDC00, 0xDFFF], [0xFB00, 0xFB06],
919 	[0xFB13, 0xFB17], [0xFB1D, 0xFB1D], [0xFB1E, 0xFB1E],
920 	[0xFB1F, 0xFB28], [0xFB29, 0xFB29], [0xFB2A, 0xFB36],
921 	[0xFB38, 0xFB3C], [0xFB3E, 0xFB3E], [0xFB40, 0xFB41],
922 	[0xFB43, 0xFB44], [0xFB46, 0xFB4F], [0xFB50, 0xFBB1],
923 	[0xFBB2, 0xFBC1], [0xFBD3, 0xFD3D], [0xFD3E, 0xFD3E],
924 	[0xFD3F, 0xFD3F], [0xFD50, 0xFD8F], [0xFD92, 0xFDC7],
925 	[0xFDF0, 0xFDFB], [0xFDFC, 0xFDFC], [0xFDFD, 0xFDFD],
926 	[0xFE20, 0xFE2F], [0xFE70, 0xFE74], [0xFE76, 0xFEFC],
927 	[0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB], [0xFFFC, 0xFFFC],
928 	[0x10000, 0x1000B], [0x1000D, 0x10026], [0x10028, 0x1003A],
929 	[0x1003C, 0x1003D], [0x1003F, 0x1004D], [0x10050, 0x1005D],
930 	[0x10080, 0x100FA], [0x10100, 0x10102], [0x10107, 0x10133],
931 	[0x10137, 0x1013F], [0x10140, 0x10174], [0x10175, 0x10178],
932 	[0x10179, 0x10189], [0x1018A, 0x1018B], [0x1018C, 0x1018E],
933 	[0x10190, 0x1019B], [0x101A0, 0x101A0], [0x101D0, 0x101FC],
934 	[0x101FD, 0x101FD], [0x10280, 0x1029C], [0x102A0, 0x102D0],
935 	[0x102E0, 0x102E0], [0x102E1, 0x102FB], [0x10300, 0x1031F],
936 	[0x10320, 0x10323], [0x10330, 0x10340], [0x10341, 0x10341],
937 	[0x10342, 0x10349], [0x1034A, 0x1034A], [0x10350, 0x10375],
938 	[0x10376, 0x1037A], [0x10380, 0x1039D], [0x1039F, 0x1039F],
939 	[0x103A0, 0x103C3], [0x103C8, 0x103CF], [0x103D0, 0x103D0],
940 	[0x103D1, 0x103D5], [0x10400, 0x1044F], [0x10450, 0x1047F],
941 	[0x10480, 0x1049D], [0x104A0, 0x104A9], [0x104B0, 0x104D3],
942 	[0x104D8, 0x104FB], [0x10500, 0x10527], [0x10530, 0x10563],
943 	[0x1056F, 0x1056F], [0x10600, 0x10736], [0x10740, 0x10755],
944 	[0x10760, 0x10767], [0x10800, 0x10805], [0x10808, 0x10808],
945 	[0x1080A, 0x10835], [0x10837, 0x10838], [0x1083C, 0x1083C],
946 	[0x1083F, 0x1083F], [0x10840, 0x10855], [0x10857, 0x10857],
947 	[0x10858, 0x1085F], [0x10860, 0x10876], [0x10877, 0x10878],
948 	[0x10879, 0x1087F], [0x10880, 0x1089E], [0x108A7, 0x108AF],
949 	[0x108E0, 0x108F2], [0x108F4, 0x108F5], [0x108FB, 0x108FF],
950 	[0x10900, 0x10915], [0x10916, 0x1091B], [0x1091F, 0x1091F],
951 	[0x10920, 0x10939], [0x1093F, 0x1093F], [0x10980, 0x1099F],
952 	[0x109A0, 0x109B7], [0x109BC, 0x109BD], [0x109BE, 0x109BF],
953 	[0x109C0, 0x109CF], [0x109D2, 0x109FF], [0x10A00, 0x10A00],
954 	[0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],
955 	[0x10A10, 0x10A13], [0x10A15, 0x10A17], [0x10A19, 0x10A33],
956 	[0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x10A40, 0x10A47],
957 	[0x10A50, 0x10A58], [0x10A60, 0x10A7C], [0x10A7D, 0x10A7E],
958 	[0x10A7F, 0x10A7F], [0x10A80, 0x10A9C], [0x10A9D, 0x10A9F],
959 	[0x10AC0, 0x10AC7], [0x10AC8, 0x10AC8], [0x10AC9, 0x10AE4],
960 	[0x10AE5, 0x10AE6], [0x10AEB, 0x10AEF], [0x10AF0, 0x10AF6],
961 	[0x10B00, 0x10B35], [0x10B39, 0x10B3F], [0x10B40, 0x10B55],
962 	[0x10B58, 0x10B5F], [0x10B60, 0x10B72], [0x10B78, 0x10B7F],
963 	[0x10B80, 0x10B91], [0x10B99, 0x10B9C], [0x10BA9, 0x10BAF],
964 	[0x10C00, 0x10C48], [0x10C80, 0x10CB2], [0x10CC0, 0x10CF2],
965 	[0x10CFA, 0x10CFF], [0x10E60, 0x10E7E], [0x11000, 0x11000],
966 	[0x11001, 0x11001], [0x11002, 0x11002], [0x11003, 0x11037],
967 	[0x11038, 0x11046], [0x11047, 0x1104D], [0x11052, 0x11065],
968 	[0x11066, 0x1106F], [0x1107F, 0x1107F], [0x11080, 0x11081],
969 	[0x11082, 0x11082], [0x11083, 0x110AF], [0x110B0, 0x110B2],
970 	[0x110B3, 0x110B6], [0x110B7, 0x110B8], [0x110B9, 0x110BA],
971 	[0x110BB, 0x110BC], [0x110BD, 0x110BD], [0x110BE, 0x110C1],
972 	[0x110D0, 0x110E8], [0x110F0, 0x110F9], [0x11100, 0x11102],
973 	[0x11103, 0x11126], [0x11127, 0x1112B], [0x1112C, 0x1112C],
974 	[0x1112D, 0x11134], [0x11136, 0x1113F], [0x11140, 0x11143],
975 	[0x11150, 0x11172], [0x11173, 0x11173], [0x11174, 0x11175],
976 	[0x11176, 0x11176], [0x11180, 0x11181], [0x11182, 0x11182],
977 	[0x11183, 0x111B2], [0x111B3, 0x111B5], [0x111B6, 0x111BE],
978 	[0x111BF, 0x111C0], [0x111C1, 0x111C4], [0x111C5, 0x111C9],
979 	[0x111CA, 0x111CC], [0x111CD, 0x111CD], [0x111D0, 0x111D9],
980 	[0x111DA, 0x111DA], [0x111DB, 0x111DB], [0x111DC, 0x111DC],
981 	[0x111DD, 0x111DF], [0x111E1, 0x111F4], [0x11200, 0x11211],
982 	[0x11213, 0x1122B], [0x1122C, 0x1122E], [0x1122F, 0x11231],
983 	[0x11232, 0x11233], [0x11234, 0x11234], [0x11235, 0x11235],
984 	[0x11236, 0x11237], [0x11238, 0x1123D], [0x1123E, 0x1123E],
985 	[0x11280, 0x11286], [0x11288, 0x11288], [0x1128A, 0x1128D],
986 	[0x1128F, 0x1129D], [0x1129F, 0x112A8], [0x112A9, 0x112A9],
987 	[0x112B0, 0x112DE], [0x112DF, 0x112DF], [0x112E0, 0x112E2],
988 	[0x112E3, 0x112EA], [0x112F0, 0x112F9], [0x11300, 0x11301],
989 	[0x11302, 0x11303], [0x11305, 0x1130C], [0x1130F, 0x11310],
990 	[0x11313, 0x11328], [0x1132A, 0x11330], [0x11332, 0x11333],
991 	[0x11335, 0x11339], [0x1133C, 0x1133C], [0x1133D, 0x1133D],
992 	[0x1133E, 0x1133F], [0x11340, 0x11340], [0x11341, 0x11344],
993 	[0x11347, 0x11348], [0x1134B, 0x1134D], [0x11350, 0x11350],
994 	[0x11357, 0x11357], [0x1135D, 0x11361], [0x11362, 0x11363],
995 	[0x11366, 0x1136C], [0x11370, 0x11374], [0x11400, 0x11434],
996 	[0x11435, 0x11437], [0x11438, 0x1143F], [0x11440, 0x11441],
997 	[0x11442, 0x11444], [0x11445, 0x11445], [0x11446, 0x11446],
998 	[0x11447, 0x1144A], [0x1144B, 0x1144F], [0x11450, 0x11459],
999 	[0x1145B, 0x1145B], [0x1145D, 0x1145D], [0x11480, 0x114AF],
1000 	[0x114B0, 0x114B2], [0x114B3, 0x114B8], [0x114B9, 0x114B9],
1001 	[0x114BA, 0x114BA], [0x114BB, 0x114BE], [0x114BF, 0x114C0],
1002 	[0x114C1, 0x114C1], [0x114C2, 0x114C3], [0x114C4, 0x114C5],
1003 	[0x114C6, 0x114C6], [0x114C7, 0x114C7], [0x114D0, 0x114D9],
1004 	[0x11580, 0x115AE], [0x115AF, 0x115B1], [0x115B2, 0x115B5],
1005 	[0x115B8, 0x115BB], [0x115BC, 0x115BD], [0x115BE, 0x115BE],
1006 	[0x115BF, 0x115C0], [0x115C1, 0x115D7], [0x115D8, 0x115DB],
1007 	[0x115DC, 0x115DD], [0x11600, 0x1162F], [0x11630, 0x11632],
1008 	[0x11633, 0x1163A], [0x1163B, 0x1163C], [0x1163D, 0x1163D],
1009 	[0x1163E, 0x1163E], [0x1163F, 0x11640], [0x11641, 0x11643],
1010 	[0x11644, 0x11644], [0x11650, 0x11659], [0x11660, 0x1166C],
1011 	[0x11680, 0x116AA], [0x116AB, 0x116AB], [0x116AC, 0x116AC],
1012 	[0x116AD, 0x116AD], [0x116AE, 0x116AF], [0x116B0, 0x116B5],
1013 	[0x116B6, 0x116B6], [0x116B7, 0x116B7], [0x116C0, 0x116C9],
1014 	[0x11700, 0x11719], [0x1171D, 0x1171F], [0x11720, 0x11721],
1015 	[0x11722, 0x11725], [0x11726, 0x11726], [0x11727, 0x1172B],
1016 	[0x11730, 0x11739], [0x1173A, 0x1173B], [0x1173C, 0x1173E],
1017 	[0x1173F, 0x1173F], [0x118A0, 0x118DF], [0x118E0, 0x118E9],
1018 	[0x118EA, 0x118F2], [0x118FF, 0x118FF], [0x11AC0, 0x11AF8],
1019 	[0x11C00, 0x11C08], [0x11C0A, 0x11C2E], [0x11C2F, 0x11C2F],
1020 	[0x11C30, 0x11C36], [0x11C38, 0x11C3D], [0x11C3E, 0x11C3E],
1021 	[0x11C3F, 0x11C3F], [0x11C40, 0x11C40], [0x11C41, 0x11C45],
1022 	[0x11C50, 0x11C59], [0x11C5A, 0x11C6C], [0x11C70, 0x11C71],
1023 	[0x11C72, 0x11C8F], [0x11C92, 0x11CA7], [0x11CA9, 0x11CA9],
1024 	[0x11CAA, 0x11CB0], [0x11CB1, 0x11CB1], [0x11CB2, 0x11CB3],
1025 	[0x11CB4, 0x11CB4], [0x11CB5, 0x11CB6], [0x12000, 0x12399],
1026 	[0x12400, 0x1246E], [0x12470, 0x12474], [0x12480, 0x12543],
1027 	[0x13000, 0x1342E], [0x14400, 0x14646], [0x16800, 0x16A38],
1028 	[0x16A40, 0x16A5E], [0x16A60, 0x16A69], [0x16A6E, 0x16A6F],
1029 	[0x16AD0, 0x16AED], [0x16AF0, 0x16AF4], [0x16AF5, 0x16AF5],
1030 	[0x16B00, 0x16B2F], [0x16B30, 0x16B36], [0x16B37, 0x16B3B],
1031 	[0x16B3C, 0x16B3F], [0x16B40, 0x16B43], [0x16B44, 0x16B44],
1032 	[0x16B45, 0x16B45], [0x16B50, 0x16B59], [0x16B5B, 0x16B61],
1033 	[0x16B63, 0x16B77], [0x16B7D, 0x16B8F], [0x16F00, 0x16F44],
1034 	[0x16F50, 0x16F50], [0x16F51, 0x16F7E], [0x16F8F, 0x16F92],
1035 	[0x16F93, 0x16F9F], [0x1BC00, 0x1BC6A], [0x1BC70, 0x1BC7C],
1036 	[0x1BC80, 0x1BC88], [0x1BC90, 0x1BC99], [0x1BC9C, 0x1BC9C],
1037 	[0x1BC9D, 0x1BC9E], [0x1BC9F, 0x1BC9F], [0x1BCA0, 0x1BCA3],
1038 	[0x1D000, 0x1D0F5], [0x1D100, 0x1D126], [0x1D129, 0x1D164],
1039 	[0x1D165, 0x1D166], [0x1D167, 0x1D169], [0x1D16A, 0x1D16C],
1040 	[0x1D16D, 0x1D172], [0x1D173, 0x1D17A], [0x1D17B, 0x1D182],
1041 	[0x1D183, 0x1D184], [0x1D185, 0x1D18B], [0x1D18C, 0x1D1A9],
1042 	[0x1D1AA, 0x1D1AD], [0x1D1AE, 0x1D1E8], [0x1D200, 0x1D241],
1043 	[0x1D242, 0x1D244], [0x1D245, 0x1D245], [0x1D300, 0x1D356],
1044 	[0x1D360, 0x1D371], [0x1D400, 0x1D454], [0x1D456, 0x1D49C],
1045 	[0x1D49E, 0x1D49F], [0x1D4A2, 0x1D4A2], [0x1D4A5, 0x1D4A6],
1046 	[0x1D4A9, 0x1D4AC], [0x1D4AE, 0x1D4B9], [0x1D4BB, 0x1D4BB],
1047 	[0x1D4BD, 0x1D4C3], [0x1D4C5, 0x1D505], [0x1D507, 0x1D50A],
1048 	[0x1D50D, 0x1D514], [0x1D516, 0x1D51C], [0x1D51E, 0x1D539],
1049 	[0x1D53B, 0x1D53E], [0x1D540, 0x1D544], [0x1D546, 0x1D546],
1050 	[0x1D54A, 0x1D550], [0x1D552, 0x1D6A5], [0x1D6A8, 0x1D6C0],
1051 	[0x1D6C1, 0x1D6C1], [0x1D6C2, 0x1D6DA], [0x1D6DB, 0x1D6DB],
1052 	[0x1D6DC, 0x1D6FA], [0x1D6FB, 0x1D6FB], [0x1D6FC, 0x1D714],
1053 	[0x1D715, 0x1D715], [0x1D716, 0x1D734], [0x1D735, 0x1D735],
1054 	[0x1D736, 0x1D74E], [0x1D74F, 0x1D74F], [0x1D750, 0x1D76E],
1055 	[0x1D76F, 0x1D76F], [0x1D770, 0x1D788], [0x1D789, 0x1D789],
1056 	[0x1D78A, 0x1D7A8], [0x1D7A9, 0x1D7A9], [0x1D7AA, 0x1D7C2],
1057 	[0x1D7C3, 0x1D7C3], [0x1D7C4, 0x1D7CB], [0x1D7CE, 0x1D7FF],
1058 	[0x1D800, 0x1D9FF], [0x1DA00, 0x1DA36], [0x1DA37, 0x1DA3A],
1059 	[0x1DA3B, 0x1DA6C], [0x1DA6D, 0x1DA74], [0x1DA75, 0x1DA75],
1060 	[0x1DA76, 0x1DA83], [0x1DA84, 0x1DA84], [0x1DA85, 0x1DA86],
1061 	[0x1DA87, 0x1DA8B], [0x1DA9B, 0x1DA9F], [0x1DAA1, 0x1DAAF],
1062 	[0x1E000, 0x1E006], [0x1E008, 0x1E018], [0x1E01B, 0x1E021],
1063 	[0x1E023, 0x1E024], [0x1E026, 0x1E02A], [0x1E800, 0x1E8C4],
1064 	[0x1E8C7, 0x1E8CF], [0x1E8D0, 0x1E8D6], [0x1E900, 0x1E943],
1065 	[0x1E944, 0x1E94A], [0x1E950, 0x1E959], [0x1E95E, 0x1E95F],
1066 	[0x1EE00, 0x1EE03], [0x1EE05, 0x1EE1F], [0x1EE21, 0x1EE22],
1067 	[0x1EE24, 0x1EE24], [0x1EE27, 0x1EE27], [0x1EE29, 0x1EE32],
1068 	[0x1EE34, 0x1EE37], [0x1EE39, 0x1EE39], [0x1EE3B, 0x1EE3B],
1069 	[0x1EE42, 0x1EE42], [0x1EE47, 0x1EE47], [0x1EE49, 0x1EE49],
1070 	[0x1EE4B, 0x1EE4B], [0x1EE4D, 0x1EE4F], [0x1EE51, 0x1EE52],
1071 	[0x1EE54, 0x1EE54], [0x1EE57, 0x1EE57], [0x1EE59, 0x1EE59],
1072 	[0x1EE5B, 0x1EE5B], [0x1EE5D, 0x1EE5D], [0x1EE5F, 0x1EE5F],
1073 	[0x1EE61, 0x1EE62], [0x1EE64, 0x1EE64], [0x1EE67, 0x1EE6A],
1074 	[0x1EE6C, 0x1EE72], [0x1EE74, 0x1EE77], [0x1EE79, 0x1EE7C],
1075 	[0x1EE7E, 0x1EE7E], [0x1EE80, 0x1EE89], [0x1EE8B, 0x1EE9B],
1076 	[0x1EEA1, 0x1EEA3], [0x1EEA5, 0x1EEA9], [0x1EEAB, 0x1EEBB],
1077 	[0x1EEF0, 0x1EEF1], [0x1F000, 0x1F003], [0x1F005, 0x1F02B],
1078 	[0x1F030, 0x1F093], [0x1F0A0, 0x1F0AE], [0x1F0B1, 0x1F0BF],
1079 	[0x1F0C1, 0x1F0CE], [0x1F0D1, 0x1F0F5], [0x1F10B, 0x1F10C],
1080 	[0x1F12E, 0x1F12E], [0x1F16A, 0x1F16B], [0x1F1E6, 0x1F1FF],
1081 	[0x1F321, 0x1F32C], [0x1F336, 0x1F336], [0x1F37D, 0x1F37D],
1082 	[0x1F394, 0x1F39F], [0x1F3CB, 0x1F3CE], [0x1F3D4, 0x1F3DF],
1083 	[0x1F3F1, 0x1F3F3], [0x1F3F5, 0x1F3F7], [0x1F43F, 0x1F43F],
1084 	[0x1F441, 0x1F441], [0x1F4FD, 0x1F4FE], [0x1F53E, 0x1F54A],
1085 	[0x1F54F, 0x1F54F], [0x1F568, 0x1F579], [0x1F57B, 0x1F594],
1086 	[0x1F597, 0x1F5A3], [0x1F5A5, 0x1F5FA], [0x1F650, 0x1F67F],
1087 	[0x1F6C6, 0x1F6CB], [0x1F6CD, 0x1F6CF], [0x1F6E0, 0x1F6EA],
1088 	[0x1F6F0, 0x1F6F3], [0x1F700, 0x1F773], [0x1F780, 0x1F7D4],
1089 	[0x1F800, 0x1F80B], [0x1F810, 0x1F847], [0x1F850, 0x1F859],
1090 	[0x1F860, 0x1F887], [0x1F890, 0x1F8AD], [0xE0001, 0xE0001],
1091 	[0xE0020, 0xE007F],
1092 ];
1093 
1094 struct Condition {
1095   public:
1096     bool eastAsianWidth;
1097 }
1098 
1099 // dcharWidth returns the number of cells in r.
1100 // See http://www.unicode.org/reports/tr11/
1101 int dcharWidth(Condition c, dchar r) {
1102 	if (r < 0 || r > 0x10FFFF ||
1103 		inTables(r, nonprint, combining, notassigned)) {
1104 		return 0;
1105   }
1106   if ((c.eastAsianWidth && isAmbiguousWidth(r)) ||
1107 		inTables(r, doublewidth, emoji)) {
1108 		return 2;
1109   }
1110   else {
1111 		return 1;
1112   }
1113 }
1114 
1115 unittest {
1116   alias TestCaseT = Tuple!(dchar, "in_", int, "out_", int, "eaout");
1117   auto runewidthtests = [
1118     TestCaseT('世', 2, 2),
1119 	  TestCaseT('界', 2, 2),
1120 	  TestCaseT('セ', 1, 1),
1121 	  TestCaseT('カ', 1, 1),
1122 	  TestCaseT('イ', 1, 1),
1123 	  TestCaseT('☆', 1, 2), // double width in ambiguous
1124 	  TestCaseT('\x00', 0, 0),
1125 	  TestCaseT('\x01', 0, 0),
1126 	  TestCaseT('\u0300', 0, 0),
1127 	  TestCaseT('\u2028', 0, 0),
1128 	  TestCaseT('\u2029', 0, 0),
1129   ];
1130 
1131 	auto c = Condition();
1132 	c.eastAsianWidth = false;
1133   foreach (tt; runewidthtests) {
1134     auto out_ = c.dcharWidth(tt.in_);
1135     assert(out_ == tt.out_, "dcharWidth(%s) = %d, want %d".format(tt.in_, out_, tt.out_));
1136   }
1137 
1138 	c.eastAsianWidth = true;
1139   foreach (tt; runewidthtests) {
1140     auto out_ = c.dcharWidth(tt.in_);
1141     assert(out_ == tt.eaout, "dcharWidth(%s) = %d, want %d".format(tt.in_, out_, tt.eaout));
1142   }
1143 }
1144 
1145 // stringWidth return width as you can see
1146 int stringWidth(S)(Condition c, S s) {
1147   auto width = 0;
1148   foreach (dchar r; s) {
1149 		width += c.dcharWidth(r);
1150   }
1151 	return width;
1152 }
1153 
1154 unittest {
1155   alias TestCaseT = Tuple!(string, "in_", int, "out_", int, "eaout");
1156   auto stringwidthtests = [
1157     TestCaseT("■㈱の世界①", 10, 12),
1158 	  TestCaseT("スター☆", 7, 8),
1159 	  TestCaseT("つのだ☆HIRO", 11, 12),
1160   ];
1161 
1162 	auto c = Condition();
1163 	c.eastAsianWidth = false;
1164 	foreach (tt; stringwidthtests) {
1165     auto out_ = c.stringWidth(tt.in_);
1166     assert(out_ == tt.out_, "stringWidth(%s) = %d, want %d".format(tt.in_, out_, tt.out_));
1167 	}
1168 
1169 	c.eastAsianWidth = true;
1170 	foreach (tt; stringwidthtests) {
1171     auto out_ = c.stringWidth(tt.in_);
1172     assert(out_ == tt.eaout, "stringWidth(%s) = %d, want %d".format(tt.in_, out_, tt.eaout));
1173 	}
1174 }
1175 
1176 
1177 // truncate return string truncated with w cells
1178 S truncate(S)(Condition c, S s, int w, S tail) {
1179   import std.conv : to;
1180 	if (c.stringWidth(s) <= w) {
1181 		return s;
1182 	}
1183 
1184 	auto r = s.to!dstring;
1185 	auto tw = c.stringWidth(tail);
1186 	w -= tw;
1187 	auto width = 0;
1188 	auto i = 0;
1189 	for (; i < r.length; i++) {
1190 		auto cw = c.dcharWidth(r[i]);
1191 		if (width+cw > w) {
1192 			break;
1193 		}
1194 		width += cw;
1195 	}
1196 	return r[0..i].to!S ~ tail;
1197 }
1198 
1199 // wrap return string wrapped with w cells
1200 S wrap(S)(Condition c, S s, int w) {
1201   import std.conv : to;
1202 	auto width = 0;
1203 	dchar[] out_ = [];
1204   foreach (dchar r; s) {
1205 		auto cw = dcharWidth(r);
1206 		if (r == '\n') {
1207 			out_ ~= r;
1208 			width = 0;
1209 			continue;
1210 		}
1211     else if (width+cw > w) {
1212 			out_ ~= '\n';
1213 			width = 0;
1214 			out_ ~= r;
1215 			width += cw;
1216 			continue;
1217 		}
1218 		out_ ~= r;
1219 		width += cw;
1220   }
1221 	return out_.to!S;
1222 }
1223 
1224 // fillLeft return string filled in left by spaces in w cells
1225 S fillLeft(S)(Condition c, S s, int w) {
1226   import std.range : repeat, take;
1227   import std.conv : to;
1228 	auto width = c.stringWidth(s);
1229 	auto count = w - width;
1230 	if (count > 0) {
1231     return ' '.repeat.take(count).to!S ~ s;
1232 	}
1233 	return s;
1234 }
1235 
1236 // fillRight return string filled in left by spaces in w cells
1237 S fillRight(S)(Condition c, S s, int w) {
1238   import std.range : repeat, take;
1239   import std.conv : to;
1240 
1241 	auto width = c.stringWidth(s);
1242 	auto count = w - width;
1243 	if (count > 0) {
1244     return s ~ ' '.repeat.take(count).to!S;
1245 	}
1246 	return s;
1247 }
1248 
1249 // dcharWidth returns the number of cells in r.
1250 // See http://www.unicode.org/reports/tr11/
1251 int dcharWidth(dchar r) {
1252 	return defaultCondition.dcharWidth(r);
1253 }
1254 
1255 // isAmbiguousWidth returns whether is ambiguous width or not.
1256 bool isAmbiguousWidth(dchar r) {
1257 	return inTables(r, private_, ambiguous);
1258 }
1259 
1260 unittest {
1261   alias TestCaseT = Tuple!(dchar, "in_", bool, "out_");
1262   auto isambiguouswidthtests = [
1263     TestCaseT('世', false),
1264 	  TestCaseT('■', true),
1265 	  TestCaseT('界', false),
1266 	  TestCaseT('○', true),
1267 	  TestCaseT('㈱', false),
1268 	  TestCaseT('①', true),
1269 	  TestCaseT('②', true),
1270 	  TestCaseT('③', true),
1271 	  TestCaseT('④', true),
1272 	  TestCaseT('⑤', true),
1273 	  TestCaseT('⑥', true),
1274 	  TestCaseT('⑦', true),
1275 	  TestCaseT('⑧', true),
1276 	  TestCaseT('⑨', true),
1277 	  TestCaseT('⑩', true),
1278 	  TestCaseT('⑪', true),
1279 	  TestCaseT('⑫', true),
1280 	  TestCaseT('⑬', true),
1281 	  TestCaseT('⑭', true),
1282 	  TestCaseT('⑮', true),
1283 	  TestCaseT('⑯', true),
1284 	  TestCaseT('⑰', true),
1285 	  TestCaseT('⑱', true),
1286 	  TestCaseT('⑲', true),
1287 	  TestCaseT('⑳', true),
1288 	  TestCaseT('☆', true),
1289   ];
1290 
1291 	foreach(tt; isambiguouswidthtests) {
1292     auto out_ = isAmbiguousWidth(tt.in_);
1293     assert(out_ == tt.out_, "isAmbiguousWidth(%s) = %s, want %s".format(tt.in_, out_, tt.out_));
1294 	}
1295 }
1296 
1297 // isNeutralWidth returns whether is neutral width or not.
1298 bool isNeutralWidth(dchar r) {
1299 	return inTable(r, neutral);
1300 }
1301 unittest {
1302   alias TestCaseT = Tuple!(dchar, "in_", bool, "out_");
1303   auto isneutralwidthtests = [
1304     TestCaseT('→', false),
1305     TestCaseT('┊', false),
1306     TestCaseT('┈', false),
1307     TestCaseT('~', false),
1308     TestCaseT('└', false),
1309     TestCaseT('⣀', true),
1310     TestCaseT('⣀', true),
1311   ];
1312 
1313 	foreach(tt; isneutralwidthtests) {
1314     auto out_ = isNeutralWidth(tt.in_);
1315     assert(out_ == tt.out_, "isNeutralWidth(%s) = %s, want %s".format(tt.in_, out_, tt.out_));
1316   }
1317 }
1318 
1319 // stringWidth return width as you can see
1320 int stringWidth(S)(S s) {
1321 	return defaultCondition.stringWidth(s);
1322 }
1323 
1324 unittest {
1325 	auto s = "こんにちわ\x00世界";
1326   auto out_ = stringWidth(s);
1327   assert(out_ == 14, "stringWidth(%s) = %d, want %d".format(s, out_, 14));
1328 }
1329 
1330 // truncate return string truncated with w cells
1331 S truncate(S)(S s, int w, S tail) {
1332 	return defaultCondition.truncate(s, w, tail);
1333 }
1334 
1335 unittest {
1336 	auto s = "あいうえお";
1337 	auto expected = "あいうえお";
1338   auto out_ = truncate(s, 10, "...");
1339 
1340 	assert(out_ == expected, "truncate(%s) = %s, want %s".format(s, out_, expected));
1341 }
1342 
1343 unittest {
1344 
1345 	auto s = "あいうえおあいうえおえおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお";
1346   auto expected = "あいうえおあいうえおえおおおおおおおおおおおおおおおおおおおおおおおおおおお...";
1347 
1348 	auto out_ = truncate(s, 80, "...");
1349   assert(out_ == expected, "truncate(%s) = %s, want %s".format(s, out_, expected));
1350 
1351 	auto width = stringWidth(out_);
1352   assert(width == 79, "width of truncate(%s) should be %d, but %d".format(s, 79, width));
1353 }
1354 
1355 unittest {
1356 	auto s = "aあいうえおあいうえおえおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお";
1357 	auto expected = "aあいうえおあいうえおえおおおおおおおおおおおおおおおおおおおおおおおおおおお...";
1358 
1359 	auto out_ = truncate(s, 80, "...");
1360 	assert(out_ == expected, "truncate(%s) = %s, want %s".format(s, out_, expected));
1361 	auto width = stringWidth(out_);
1362   assert(width == 80, "width of truncate(%s) should be %d, but %d".format(s, 80, width));
1363 }
1364 
1365 unittest {
1366 	auto s = "あいうえおあいうえおえおおおおおおおおおおおおおおおおおおおおおおおおおおおおお";
1367 	auto expected = "あいうえおあいうえおえおおおおおおおおおおおおおおおおおおおおおおおおおおおおお";
1368 
1369 	auto out_ = truncate(s, 80, "...");
1370 	assert(out_ == expected, "truncate(%s) = %s, want %s".format(s, out_, expected));
1371 
1372 	auto width = stringWidth(out_);
1373   assert(width == 80, "width of truncate(%s) should be %d, but %d".format(s, 80, width));
1374 }
1375 
1376 unittest {
1377 	auto s = "あいうえおあい";
1378 	auto expected = "あいうえおあい";
1379 	auto out_ = truncate(s, 80, "...");
1380   assert(out_ == expected, "truncate(%s) = %s, want %s".format(s, out_, expected));
1381 }
1382 
1383 // wrap return string wrapped with w cells
1384 S wrap(S)(S s, int w) {
1385 	return defaultCondition.wrap(s, w);
1386 }
1387 
1388 unittest {
1389 	auto s = `東京特許許可局局長はよく柿喰う客だ/東京特許許可局局長はよく柿喰う客だ
1390 123456789012345678901234567890
1391 END`;
1392 	auto expected = `東京特許許可局局長はよく柿喰う
1393 客だ/東京特許許可局局長はよく
1394 柿喰う客だ
1395 123456789012345678901234567890
1396 END`;
1397   auto out_ = wrap(s, 30);
1398 	assert(out_ == expected, "wrap(%s) = %s, want %s".format(s, out_, expected));
1399 }
1400 
1401 // fillLeft return string filled in left by spaces in w cells
1402 S fillLeft(S)(S s, int w) {
1403 	return defaultCondition.fillLeft(s, w);
1404 }
1405 
1406 unittest {
1407 	auto s = "あxいうえお";
1408 	auto expected = "    あxいうえお";
1409 
1410   auto out_ = fillLeft(s, 15);
1411   assert(out_ == expected, "fillLeft(%s) = %s, want %s".format(s, out_, expected));
1412 }
1413 
1414 unittest {
1415 	auto s = "あいうえお";
1416 	auto expected = "あいうえお";
1417 
1418 	auto out_ = fillLeft(s, 10);
1419   assert(out_ == expected, "fillLeft(%s) = %s, want %s".format(s, out_, expected));
1420 }
1421 
1422 // fillRight return string filled in left by spaces in w cells
1423 S fillRight(S)(S s, int w) {
1424 	return defaultCondition.fillRight(s, w);
1425 }
1426 
1427 unittest {
1428 	auto s = "あxいうえお";
1429 	auto expected = "あxいうえお    ";
1430 
1431   auto out_ = fillRight(s, 15);
1432   assert(out_ == expected, "fillRight(%s) = %s, want %s".format(s, out_, expected));
1433 }
1434 
1435 unittest {
1436 	auto s = "あいうえお";
1437 	auto expected = "あいうえお";
1438 
1439 	auto out_ = fillRight(s, 10);
1440   assert(out_ == expected, "fillRight(%s) = %s, want %s".format(s, out_, expected));
1441 }
1442 
1443 unittest {
1444 	auto old = environment.get("RUNEWIDTH_EASTASIAN", "");
1445 	scope(exit) environment["RUNEWIDTH_EASTASIAN"] = old;
1446 
1447 	environment["RUNEWIDTH_EASTASIAN"] = "1";
1448 
1449   auto w = dcharWidth('│');
1450   assert(w == 1, "RuneWidth('│') = %d, want %d".format(w, 1));
1451 }
1452 
1453 version(Posix) {
1454   import std.regex;
1455 
1456   private const reLoc = ctRegex!(r"^[a-z][a-z][a-z]?(?:_[A-Z][A-Z])?\.(.+)");
1457 
1458   int[string] mblenTable;
1459   static this() {
1460     mblenTable["utf-8"] =   6;
1461     mblenTable["utf8"] =    6;
1462     mblenTable["jis"] =     8;
1463     mblenTable["eucjp"] =   3;
1464     mblenTable["euckr"] =   2;
1465     mblenTable["euccn"] =   2;
1466     mblenTable["sjis"] =    2;
1467     mblenTable["cp932"] =   2;
1468     mblenTable["cp51932"] = 2;
1469     mblenTable["cp936"] =   2;
1470     mblenTable["cp949"] =   2;
1471     mblenTable["cp950"] =   2;
1472     mblenTable["big5"] =    2;
1473     mblenTable["gbk"] =     2;
1474     mblenTable["gb2312"] =  2;
1475   }
1476 
1477   bool isEastAsian(string locale) {
1478     import std.uni : toLower;
1479     import std.algorithm : startsWith, endsWith;
1480 
1481     auto charset = locale.toLower();
1482     auto r = matchAll(locale, reLoc);
1483     if (r.front.length == 2) {
1484       charset = r.front[1].toLower();
1485     }
1486 
1487     if (charset.endsWith("@cjk_narrow")) {
1488       return false;
1489     }
1490 
1491     foreach (pos, b; charset) {
1492       if (b == '@') {
1493         charset = charset[0..pos];
1494         break;
1495       }
1496     }
1497 
1498     auto max = 1;
1499     if (auto m = charset in mblenTable) {
1500       max = *m;
1501     }
1502 
1503     if (max > 1 && (charset[0] != 'u' ||
1504           startsWith(locale, "ja") ||
1505           startsWith(locale, "ko") ||
1506           startsWith(locale, "zh"))) {
1507       return true;
1508     }
1509     return false;
1510   }
1511 
1512   unittest {
1513     alias TestCaseT = Tuple!(string, "locale", bool, "want");
1514     auto testcases = [
1515       TestCaseT("foo@cjk_narrow", false),
1516       TestCaseT("foo@cjk", false),
1517       TestCaseT("utf-8@cjk", false),
1518       TestCaseT("ja_JP.CP932", true),
1519     ];
1520 
1521     foreach (tt; testcases) {
1522       auto got = isEastAsian(tt.locale);
1523       assert(got == tt.want, "isEastAsian(%s) should be %s".format(tt.locale, tt.want));
1524     }
1525   }
1526 
1527   // isEastAsian return true if the current locale is CJK
1528   bool isEastAsian() {
1529     auto locale = environment.get("LC_CTYPE", environment.get("LANG", ""));
1530 
1531     // ignore C locale
1532     if (locale == "POSIX" || locale == "C") {
1533       return false;
1534     }
1535     if (locale.length > 1 && locale[0] == 'C' && (locale[1] == '.' || locale[1] == '-')) {
1536       return false;
1537     }
1538 
1539     return isEastAsian(locale);
1540   }
1541 
1542 
1543   unittest {
1544     auto lcctype = environment.get("LC_CTYPE", "");
1545     scope(exit) environment["LC_CTYPE"] = lcctype;
1546 
1547     alias TestCaseT = Tuple!(string, "lcctype", bool, "want");
1548     auto testcases = [
1549       TestCaseT("ja_JP.UTF-8", true),
1550       TestCaseT("C", false),
1551       TestCaseT("POSIX", false),
1552       TestCaseT("en_US.UTF-8", false),
1553     ];
1554 
1555     foreach (tt; testcases) {
1556       environment["LC_CTYPE"] = tt.lcctype;
1557       auto got = isEastAsian();
1558       assert(got == tt.want, "isEastAsian() for LC_CTYPE=%s should be %s".format(tt.lcctype, tt.want));
1559     }
1560   }
1561 
1562   unittest {
1563     auto lcctype = environment.get("LC_CTYPE", "");
1564     scope(exit) environment["LC_CTYPE"] = lcctype;
1565     auto lang = environment.get("LANG", "");
1566     scope(exit) environment["LANG"] = lang;
1567 
1568 
1569     environment.remove("LC_CTYPE");
1570     alias TestCaseT = Tuple!(string, "lcctype", bool, "want");
1571     auto testcases = [
1572       TestCaseT("ja_JP.UTF-8", true),
1573       TestCaseT("C", false),
1574       TestCaseT("POSIX", false),
1575       TestCaseT("en_US.UTF-8", false),
1576       TestCaseT("C.UTF-8", false),
1577     ];
1578 
1579     foreach (tt; testcases) {
1580       environment["LANG"] = tt.lcctype;
1581       auto got = isEastAsian();
1582       assert(got == tt.want, "isEastAsian() for LANG=%s should be %s".format(tt.lcctype, tt.want));
1583     }
1584   }
1585 }
1586 
1587 version(Windows) {
1588   pragma(msg, "Not implemented for Windows yet");
1589 }