1/*
2 * Copyright (C) 2015 Frederic Wang (fred.wang@free.fr). All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
14 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
15 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
16 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
17 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
18 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "MathMLOperatorDictionary.h"
28#include <wtf/Optional.h>
29
30#if ENABLE(MATHML)
31
32namespace WebCore {
33
34using namespace MathMLOperatorDictionary;
35
36typedef std::pair<UChar32, Form> Key;
37struct Entry {
38 UChar32 character;
39 unsigned form : 2;
40 unsigned lspace : 3;
41 unsigned rspace : 3;
42 unsigned flags : 8;
43};
44static inline Key ExtractKey(const Entry* entry) { return Key(entry->character, static_cast<Form>(entry->form)); }
45static inline UChar32 ExtractChar(const Entry* entry) { return entry->character; }
46static inline Property ExtractProperty(const Entry& entry)
47{
48 Property property;
49 property.form = static_cast<Form>(entry.form);
50 property.leadingSpaceInMathUnit = entry.lspace;
51 property.trailingSpaceInMathUnit = entry.rspace;
52 property.flags = entry.flags;
53 return property;
54}
55
56// This table has been automatically generated from the Operator Dictionary of the MathML3 specification (appendix C).
57// Some people use the binary operator "U+2225 PARALLEL TO" as an opening and closing delimiter, so we add the corresponding stretchy prefix and postfix forms.
58static const unsigned dictionarySize = 1043;
59static const Entry dictionary[dictionarySize] = {
60 { 0x21, Postfix, 1, 0, 0}, // EXCLAMATION MARK
61 { 0x25, Infix, 3, 3, 0}, // PERCENT SIGN
62 { 0x26, Postfix, 0, 0, 0}, // AMPERSAND
63 { 0x27, Postfix, 0, 0, Accent}, // APOSTROPHE
64 { 0x28, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT PARENTHESIS
65 { 0x29, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT PARENTHESIS
66 { 0x2A, Infix, 3, 3, 0}, // ASTERISK
67 { 0x2B, Infix, 4, 4, 0}, // PLUS SIGN
68 { 0x2B, Prefix, 0, 1, 0}, // PLUS SIGN
69 { 0x2C, Infix, 0, 3, Separator}, // COMMA
70 { 0x2D, Infix, 4, 4, 0}, // HYPHEN-MINUS
71 { 0x2D, Prefix, 0, 1, 0}, // HYPHEN-MINUS
72 { 0x2E, Infix, 3, 3, 0}, // FULL STOP
73 { 0x2F, Infix, 1, 1, 0}, // SOLIDUS
74 { 0x3A, Infix, 1, 2, 0}, // COLON
75 { 0x3B, Infix, 0, 3, Separator}, // SEMICOLON
76 { 0x3C, Infix, 5, 5, 0}, // LESS-THAN SIGN
77 { 0x3D, Infix, 5, 5, 0}, // EQUALS SIGN
78 { 0x3E, Infix, 5, 5, 0}, // GREATER-THAN SIGN
79 { 0x3F, Infix, 1, 1, 0}, // QUESTION MARK
80 { 0x40, Infix, 1, 1, 0}, // COMMERCIAL AT
81 { 0x5B, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT SQUARE BRACKET
82 { 0x5C, Infix, 0, 0, 0}, // REVERSE SOLIDUS
83 { 0x5D, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT SQUARE BRACKET
84 { 0x5E, Postfix, 0, 0, Accent | Stretchy}, // CIRCUMFLEX ACCENT
85 { 0x5E, Infix, 1, 1, 0}, // CIRCUMFLEX ACCENT
86 { 0x5F, Postfix, 0, 0, Accent | Stretchy}, // LOW LINE
87 { 0x5F, Infix, 1, 1, 0}, // LOW LINE
88 { 0x60, Postfix, 0, 0, Accent}, // GRAVE ACCENT
89 { 0x7B, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT CURLY BRACKET
90 { 0x7C, Infix, 2, 2, Stretchy | Symmetric | Fence}, // VERTICAL LINE
91 { 0x7C, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // VERTICAL LINE
92 { 0x7C, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // VERTICAL LINE
93 { 0x7D, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT CURLY BRACKET
94 { 0x7E, Postfix, 0, 0, Accent | Stretchy}, // TILDE
95 { 0xA8, Postfix, 0, 0, Accent}, // DIAERESIS
96 { 0xAC, Prefix, 2, 1, 0}, // NOT SIGN
97 { 0xAF, Postfix, 0, 0, Accent | Stretchy}, // MACRON
98 { 0xB0, Postfix, 0, 0, 0}, // DEGREE SIGN
99 { 0xB1, Infix, 4, 4, 0}, // PLUS-MINUS SIGN
100 { 0xB1, Prefix, 0, 1, 0}, // PLUS-MINUS SIGN
101 { 0xB4, Postfix, 0, 0, Accent}, // ACUTE ACCENT
102 { 0xB7, Infix, 4, 4, 0}, // MIDDLE DOT
103 { 0xB8, Postfix, 0, 0, Accent}, // CEDILLA
104 { 0xD7, Infix, 4, 4, 0}, // MULTIPLICATION SIGN
105 { 0xF7, Infix, 4, 4, 0}, // DIVISION SIGN
106 { 0x2C6, Postfix, 0, 0, Accent | Stretchy}, // MODIFIER LETTER CIRCUMFLEX ACCENT
107 { 0x2C7, Postfix, 0, 0, Accent | Stretchy}, // CARON
108 { 0x2C9, Postfix, 0, 0, Accent | Stretchy}, // MODIFIER LETTER MACRON
109 { 0x2CA, Postfix, 0, 0, Accent}, // MODIFIER LETTER ACUTE ACCENT
110 { 0x2CB, Postfix, 0, 0, Accent}, // MODIFIER LETTER GRAVE ACCENT
111 { 0x2CD, Postfix, 0, 0, Accent | Stretchy}, // MODIFIER LETTER LOW MACRON
112 { 0x2D8, Postfix, 0, 0, Accent}, // BREVE
113 { 0x2D9, Postfix, 0, 0, Accent}, // DOT ABOVE
114 { 0x2DA, Postfix, 0, 0, Accent}, // RING ABOVE
115 { 0x2DC, Postfix, 0, 0, Accent | Stretchy}, // SMALL TILDE
116 { 0x2DD, Postfix, 0, 0, Accent}, // DOUBLE ACUTE ACCENT
117 { 0x2F7, Postfix, 0, 0, Accent | Stretchy}, // MODIFIER LETTER LOW TILDE
118 { 0x302, Postfix, 0, 0, Accent | Stretchy}, // COMBINING CIRCUMFLEX ACCENT
119 { 0x311, Postfix, 0, 0, Accent}, // COMBINING INVERTED BREVE
120 { 0x3F6, Infix, 5, 5, 0}, // GREEK REVERSED LUNATE EPSILON SYMBOL
121 { 0x2016, Prefix, 0, 0, Fence | Stretchy}, // DOUBLE VERTICAL LINE
122 { 0x2016, Postfix, 0, 0, Fence | Stretchy}, // DOUBLE VERTICAL LINE
123 { 0x2018, Prefix, 0, 0, Fence}, // LEFT SINGLE QUOTATION MARK
124 { 0x2019, Postfix, 0, 0, Fence}, // RIGHT SINGLE QUOTATION MARK
125 { 0x201C, Prefix, 0, 0, Fence}, // LEFT DOUBLE QUOTATION MARK
126 { 0x201D, Postfix, 0, 0, Fence}, // RIGHT DOUBLE QUOTATION MARK
127 { 0x2022, Infix, 4, 4, 0}, // BULLET
128 { 0x2026, Infix, 0, 0, 0}, // HORIZONTAL ELLIPSIS
129 { 0x2032, Postfix, 0, 2, 0}, // PRIME
130 { 0x203E, Postfix, 0, 0, Accent | Stretchy}, // OVERLINE
131 { 0x2044, Infix, 4, 4, Stretchy}, // FRACTION SLASH
132 { 0x2061, Infix, 0, 0, 0}, // FUNCTION APPLICATION
133 { 0x2062, Infix, 0, 0, 0}, // INVISIBLE TIMES
134 { 0x2063, Infix, 0, 0, Separator}, // INVISIBLE SEPARATOR
135 { 0x2064, Infix, 0, 0, 0}, // INVISIBLE PLUS
136 { 0x20DB, Postfix, 0, 0, Accent}, // COMBINING THREE DOTS ABOVE
137 { 0x20DC, Postfix, 0, 0, Accent}, // COMBINING FOUR DOTS ABOVE
138 { 0x2145, Prefix, 2, 1, 0}, // DOUBLE-STRUCK ITALIC CAPITAL D
139 { 0x2146, Prefix, 2, 0, 0}, // DOUBLE-STRUCK ITALIC SMALL D
140 { 0x2190, Infix, 5, 5, Accent | Stretchy}, // LEFTWARDS ARROW
141 { 0x2191, Infix, 5, 5, Stretchy}, // UPWARDS ARROW
142 { 0x2192, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS ARROW
143 { 0x2193, Infix, 5, 5, Stretchy}, // DOWNWARDS ARROW
144 { 0x2194, Infix, 5, 5, Stretchy | Accent}, // LEFT RIGHT ARROW
145 { 0x2195, Infix, 5, 5, Stretchy}, // UP DOWN ARROW
146 { 0x2196, Infix, 5, 5, Stretchy}, // NORTH WEST ARROW
147 { 0x2197, Infix, 5, 5, Stretchy}, // NORTH EAST ARROW
148 { 0x2198, Infix, 5, 5, Stretchy}, // SOUTH EAST ARROW
149 { 0x2199, Infix, 5, 5, Stretchy}, // SOUTH WEST ARROW
150 { 0x219A, Infix, 5, 5, Accent}, // LEFTWARDS ARROW WITH STROKE
151 { 0x219B, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW WITH STROKE
152 { 0x219C, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS WAVE ARROW
153 { 0x219D, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS WAVE ARROW
154 { 0x219E, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS TWO HEADED ARROW
155 { 0x219F, Infix, 5, 5, Stretchy | Accent}, // UPWARDS TWO HEADED ARROW
156 { 0x21A0, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS TWO HEADED ARROW
157 { 0x21A1, Infix, 5, 5, Stretchy}, // DOWNWARDS TWO HEADED ARROW
158 { 0x21A2, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS ARROW WITH TAIL
159 { 0x21A3, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS ARROW WITH TAIL
160 { 0x21A4, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS ARROW FROM BAR
161 { 0x21A5, Infix, 5, 5, Stretchy}, // UPWARDS ARROW FROM BAR
162 { 0x21A6, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS ARROW FROM BAR
163 { 0x21A7, Infix, 5, 5, Stretchy}, // DOWNWARDS ARROW FROM BAR
164 { 0x21A8, Infix, 5, 5, Stretchy}, // UP DOWN ARROW WITH BASE
165 { 0x21A9, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS ARROW WITH HOOK
166 { 0x21AA, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS ARROW WITH HOOK
167 { 0x21AB, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS ARROW WITH LOOP
168 { 0x21AC, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS ARROW WITH LOOP
169 { 0x21AD, Infix, 5, 5, Stretchy | Accent}, // LEFT RIGHT WAVE ARROW
170 { 0x21AE, Infix, 5, 5, Accent}, // LEFT RIGHT ARROW WITH STROKE
171 { 0x21AF, Infix, 5, 5, Stretchy}, // DOWNWARDS ZIGZAG ARROW
172 { 0x21B0, Infix, 5, 5, Stretchy}, // UPWARDS ARROW WITH TIP LEFTWARDS
173 { 0x21B1, Infix, 5, 5, Stretchy}, // UPWARDS ARROW WITH TIP RIGHTWARDS
174 { 0x21B2, Infix, 5, 5, Stretchy}, // DOWNWARDS ARROW WITH TIP LEFTWARDS
175 { 0x21B3, Infix, 5, 5, Stretchy}, // DOWNWARDS ARROW WITH TIP RIGHTWARDS
176 { 0x21B4, Infix, 5, 5, Stretchy}, // RIGHTWARDS ARROW WITH CORNER DOWNWARDS
177 { 0x21B5, Infix, 5, 5, Stretchy}, // DOWNWARDS ARROW WITH CORNER LEFTWARDS
178 { 0x21B6, Infix, 5, 5, Accent}, // ANTICLOCKWISE TOP SEMICIRCLE ARROW
179 { 0x21B7, Infix, 5, 5, Accent}, // CLOCKWISE TOP SEMICIRCLE ARROW
180 { 0x21B8, Infix, 5, 5, 0}, // NORTH WEST ARROW TO LONG BAR
181 { 0x21B9, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR
182 { 0x21BA, Infix, 5, 5, 0}, // ANTICLOCKWISE OPEN CIRCLE ARROW
183 { 0x21BB, Infix, 5, 5, 0}, // CLOCKWISE OPEN CIRCLE ARROW
184 { 0x21BC, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS HARPOON WITH BARB UPWARDS
185 { 0x21BD, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS HARPOON WITH BARB DOWNWARDS
186 { 0x21BE, Infix, 5, 5, Stretchy}, // UPWARDS HARPOON WITH BARB RIGHTWARDS
187 { 0x21BF, Infix, 5, 5, Stretchy}, // UPWARDS HARPOON WITH BARB LEFTWARDS
188 { 0x21C0, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS HARPOON WITH BARB UPWARDS
189 { 0x21C1, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS HARPOON WITH BARB DOWNWARDS
190 { 0x21C2, Infix, 5, 5, Stretchy}, // DOWNWARDS HARPOON WITH BARB RIGHTWARDS
191 { 0x21C3, Infix, 5, 5, Stretchy}, // DOWNWARDS HARPOON WITH BARB LEFTWARDS
192 { 0x21C4, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS ARROW OVER LEFTWARDS ARROW
193 { 0x21C5, Infix, 5, 5, Stretchy}, // UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW
194 { 0x21C6, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS ARROW OVER RIGHTWARDS ARROW
195 { 0x21C7, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS PAIRED ARROWS
196 { 0x21C8, Infix, 5, 5, Stretchy}, // UPWARDS PAIRED ARROWS
197 { 0x21C9, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS PAIRED ARROWS
198 { 0x21CA, Infix, 5, 5, Stretchy}, // DOWNWARDS PAIRED ARROWS
199 { 0x21CB, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
200 { 0x21CC, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
201 { 0x21CD, Infix, 5, 5, Accent}, // LEFTWARDS DOUBLE ARROW WITH STROKE
202 { 0x21CE, Infix, 5, 5, Accent}, // LEFT RIGHT DOUBLE ARROW WITH STROKE
203 { 0x21CF, Infix, 5, 5, Accent}, // RIGHTWARDS DOUBLE ARROW WITH STROKE
204 { 0x21D0, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS DOUBLE ARROW
205 { 0x21D1, Infix, 5, 5, Stretchy}, // UPWARDS DOUBLE ARROW
206 { 0x21D2, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS DOUBLE ARROW
207 { 0x21D3, Infix, 5, 5, Stretchy}, // DOWNWARDS DOUBLE ARROW
208 { 0x21D4, Infix, 5, 5, Stretchy | Accent}, // LEFT RIGHT DOUBLE ARROW
209 { 0x21D5, Infix, 5, 5, Stretchy}, // UP DOWN DOUBLE ARROW
210 { 0x21D6, Infix, 5, 5, Stretchy}, // NORTH WEST DOUBLE ARROW
211 { 0x21D7, Infix, 5, 5, Stretchy}, // NORTH EAST DOUBLE ARROW
212 { 0x21D8, Infix, 5, 5, Stretchy}, // SOUTH EAST DOUBLE ARROW
213 { 0x21D9, Infix, 5, 5, Stretchy}, // SOUTH WEST DOUBLE ARROW
214 { 0x21DA, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS TRIPLE ARROW
215 { 0x21DB, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS TRIPLE ARROW
216 { 0x21DC, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS SQUIGGLE ARROW
217 { 0x21DD, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS SQUIGGLE ARROW
218 { 0x21DE, Infix, 5, 5, 0}, // UPWARDS ARROW WITH DOUBLE STROKE
219 { 0x21DF, Infix, 5, 5, 0}, // DOWNWARDS ARROW WITH DOUBLE STROKE
220 { 0x21E0, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS DASHED ARROW
221 { 0x21E1, Infix, 5, 5, Stretchy}, // UPWARDS DASHED ARROW
222 { 0x21E2, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS DASHED ARROW
223 { 0x21E3, Infix, 5, 5, Stretchy}, // DOWNWARDS DASHED ARROW
224 { 0x21E4, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS ARROW TO BAR
225 { 0x21E5, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS ARROW TO BAR
226 { 0x21E6, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS WHITE ARROW
227 { 0x21E7, Infix, 5, 5, Stretchy}, // UPWARDS WHITE ARROW
228 { 0x21E8, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS WHITE ARROW
229 { 0x21E9, Infix, 5, 5, Stretchy}, // DOWNWARDS WHITE ARROW
230 { 0x21EA, Infix, 5, 5, Stretchy}, // UPWARDS WHITE ARROW FROM BAR
231 { 0x21EB, Infix, 5, 5, Stretchy}, // UPWARDS WHITE ARROW ON PEDESTAL
232 { 0x21EC, Infix, 5, 5, Stretchy}, // UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR
233 { 0x21ED, Infix, 5, 5, Stretchy}, // UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR
234 { 0x21EE, Infix, 5, 5, Stretchy}, // UPWARDS WHITE DOUBLE ARROW
235 { 0x21EF, Infix, 5, 5, Stretchy}, // UPWARDS WHITE DOUBLE ARROW ON PEDESTAL
236 { 0x21F0, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS WHITE ARROW FROM WALL
237 { 0x21F1, Infix, 5, 5, 0}, // NORTH WEST ARROW TO CORNER
238 { 0x21F2, Infix, 5, 5, 0}, // SOUTH EAST ARROW TO CORNER
239 { 0x21F3, Infix, 5, 5, Stretchy}, // UP DOWN WHITE ARROW
240 { 0x21F4, Infix, 5, 5, Accent}, // RIGHT ARROW WITH SMALL CIRCLE
241 { 0x21F5, Infix, 5, 5, Stretchy}, // DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW
242 { 0x21F6, Infix, 5, 5, Stretchy | Accent}, // THREE RIGHTWARDS ARROWS
243 { 0x21F7, Infix, 5, 5, Accent}, // LEFTWARDS ARROW WITH VERTICAL STROKE
244 { 0x21F8, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW WITH VERTICAL STROKE
245 { 0x21F9, Infix, 5, 5, Accent}, // LEFT RIGHT ARROW WITH VERTICAL STROKE
246 { 0x21FA, Infix, 5, 5, Accent}, // LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE
247 { 0x21FB, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE
248 { 0x21FC, Infix, 5, 5, Accent}, // LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE
249 { 0x21FD, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS OPEN-HEADED ARROW
250 { 0x21FE, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS OPEN-HEADED ARROW
251 { 0x21FF, Infix, 5, 5, Stretchy | Accent}, // LEFT RIGHT OPEN-HEADED ARROW
252 { 0x2200, Prefix, 2, 1, 0}, // FOR ALL
253 { 0x2201, Infix, 1, 2, 0}, // COMPLEMENT
254 { 0x2202, Prefix, 2, 1, 0}, // PARTIAL DIFFERENTIAL
255 { 0x2203, Prefix, 2, 1, 0}, // THERE EXISTS
256 { 0x2204, Prefix, 2, 1, 0}, // THERE DOES NOT EXIST
257 { 0x2206, Infix, 3, 3, 0}, // INCREMENT
258 { 0x2207, Prefix, 2, 1, 0}, // NABLA
259 { 0x2208, Infix, 5, 5, 0}, // ELEMENT OF
260 { 0x2209, Infix, 5, 5, 0}, // NOT AN ELEMENT OF
261 { 0x220A, Infix, 5, 5, 0}, // SMALL ELEMENT OF
262 { 0x220B, Infix, 5, 5, 0}, // CONTAINS AS MEMBER
263 { 0x220C, Infix, 5, 5, 0}, // DOES NOT CONTAIN AS MEMBER
264 { 0x220D, Infix, 5, 5, 0}, // SMALL CONTAINS AS MEMBER
265 { 0x220E, Infix, 3, 3, 0}, // END OF PROOF
266 { 0x220F, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY PRODUCT
267 { 0x2210, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY COPRODUCT
268 { 0x2211, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY SUMMATION
269 { 0x2212, Infix, 4, 4, 0}, // MINUS SIGN
270 { 0x2212, Prefix, 0, 1, 0}, // MINUS SIGN
271 { 0x2213, Infix, 4, 4, 0}, // MINUS-OR-PLUS SIGN
272 { 0x2213, Prefix, 0, 1, 0}, // MINUS-OR-PLUS SIGN
273 { 0x2214, Infix, 4, 4, 0}, // DOT PLUS
274 { 0x2215, Infix, 4, 4, Stretchy}, // DIVISION SLASH
275 { 0x2216, Infix, 4, 4, 0}, // SET MINUS
276 { 0x2217, Infix, 4, 4, 0}, // ASTERISK OPERATOR
277 { 0x2218, Infix, 4, 4, 0}, // RING OPERATOR
278 { 0x2219, Infix, 4, 4, 0}, // BULLET OPERATOR
279 { 0x221A, Prefix, 1, 1, Stretchy}, // SQUARE ROOT
280 { 0x221B, Prefix, 1, 1, 0}, // CUBE ROOT
281 { 0x221C, Prefix, 1, 1, 0}, // FOURTH ROOT
282 { 0x221D, Infix, 5, 5, 0}, // PROPORTIONAL TO
283 { 0x221F, Infix, 5, 5, 0}, // RIGHT ANGLE
284 { 0x2220, Prefix, 0, 0, 0}, // ANGLE
285 { 0x2221, Prefix, 0, 0, 0}, // MEASURED ANGLE
286 { 0x2222, Prefix, 0, 0, 0}, // SPHERICAL ANGLE
287 { 0x2223, Infix, 5, 5, 0}, // DIVIDES
288 { 0x2224, Infix, 5, 5, 0}, // DOES NOT DIVIDE
289 { 0x2225, Infix, 5, 5, 0}, // PARALLEL TO
290 { 0x2225, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // PARALLEL TO
291 { 0x2225, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // PARALLEL TO
292 { 0x2226, Infix, 5, 5, 0}, // NOT PARALLEL TO
293 { 0x2227, Infix, 4, 4, 0}, // LOGICAL AND
294 { 0x2228, Infix, 4, 4, 0}, // LOGICAL OR
295 { 0x2229, Infix, 4, 4, 0}, // INTERSECTION
296 { 0x222A, Infix, 4, 4, 0}, // UNION
297 { 0x222B, Prefix, 0, 1, Symmetric | LargeOp}, // INTEGRAL
298 { 0x222C, Prefix, 0, 1, Symmetric | LargeOp}, // DOUBLE INTEGRAL
299 { 0x222D, Prefix, 0, 1, Symmetric | LargeOp}, // TRIPLE INTEGRAL
300 { 0x222E, Prefix, 0, 1, Symmetric | LargeOp}, // CONTOUR INTEGRAL
301 { 0x222F, Prefix, 0, 1, Symmetric | LargeOp}, // SURFACE INTEGRAL
302 { 0x2230, Prefix, 0, 1, Symmetric | LargeOp}, // VOLUME INTEGRAL
303 { 0x2231, Prefix, 0, 1, Symmetric | LargeOp}, // CLOCKWISE INTEGRAL
304 { 0x2232, Prefix, 0, 1, Symmetric | LargeOp}, // CLOCKWISE CONTOUR INTEGRAL
305 { 0x2233, Prefix, 0, 1, Symmetric | LargeOp}, // ANTICLOCKWISE CONTOUR INTEGRAL
306 { 0x2234, Infix, 5, 5, 0}, // THEREFORE
307 { 0x2235, Infix, 5, 5, 0}, // BECAUSE
308 { 0x2236, Infix, 5, 5, 0}, // RATIO
309 { 0x2237, Infix, 5, 5, 0}, // PROPORTION
310 { 0x2238, Infix, 4, 4, 0}, // DOT MINUS
311 { 0x2239, Infix, 5, 5, 0}, // EXCESS
312 { 0x223A, Infix, 4, 4, 0}, // GEOMETRIC PROPORTION
313 { 0x223B, Infix, 5, 5, 0}, // HOMOTHETIC
314 { 0x223C, Infix, 5, 5, 0}, // TILDE OPERATOR
315 { 0x223D, Infix, 5, 5, 0}, // REVERSED TILDE
316 { 0x223E, Infix, 5, 5, 0}, // INVERTED LAZY S
317 { 0x223F, Infix, 3, 3, 0}, // SINE WAVE
318 { 0x2240, Infix, 4, 4, 0}, // WREATH PRODUCT
319 { 0x2241, Infix, 5, 5, 0}, // NOT TILDE
320 { 0x2242, Infix, 5, 5, 0}, // MINUS TILDE
321 { 0x2243, Infix, 5, 5, 0}, // ASYMPTOTICALLY EQUAL TO
322 { 0x2244, Infix, 5, 5, 0}, // NOT ASYMPTOTICALLY EQUAL TO
323 { 0x2245, Infix, 5, 5, 0}, // APPROXIMATELY EQUAL TO
324 { 0x2246, Infix, 5, 5, 0}, // APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
325 { 0x2247, Infix, 5, 5, 0}, // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
326 { 0x2248, Infix, 5, 5, 0}, // ALMOST EQUAL TO
327 { 0x2249, Infix, 5, 5, 0}, // NOT ALMOST EQUAL TO
328 { 0x224A, Infix, 5, 5, 0}, // ALMOST EQUAL OR EQUAL TO
329 { 0x224B, Infix, 5, 5, 0}, // TRIPLE TILDE
330 { 0x224C, Infix, 5, 5, 0}, // ALL EQUAL TO
331 { 0x224D, Infix, 5, 5, 0}, // EQUIVALENT TO
332 { 0x224E, Infix, 5, 5, 0}, // GEOMETRICALLY EQUIVALENT TO
333 { 0x224F, Infix, 5, 5, 0}, // DIFFERENCE BETWEEN
334 { 0x2250, Infix, 5, 5, 0}, // APPROACHES THE LIMIT
335 { 0x2251, Infix, 5, 5, 0}, // GEOMETRICALLY EQUAL TO
336 { 0x2252, Infix, 5, 5, 0}, // APPROXIMATELY EQUAL TO OR THE IMAGE OF
337 { 0x2253, Infix, 5, 5, 0}, // IMAGE OF OR APPROXIMATELY EQUAL TO
338 { 0x2254, Infix, 5, 5, 0}, // COLON EQUALS
339 { 0x2255, Infix, 5, 5, 0}, // EQUALS COLON
340 { 0x2256, Infix, 5, 5, 0}, // RING IN EQUAL TO
341 { 0x2257, Infix, 5, 5, 0}, // RING EQUAL TO
342 { 0x2258, Infix, 5, 5, 0}, // CORRESPONDS TO
343 { 0x2259, Infix, 5, 5, 0}, // ESTIMATES
344 { 0x225A, Infix, 5, 5, 0}, // EQUIANGULAR TO
345 { 0x225C, Infix, 5, 5, 0}, // DELTA EQUAL TO
346 { 0x225D, Infix, 5, 5, 0}, // EQUAL TO BY DEFINITION
347 { 0x225E, Infix, 5, 5, 0}, // MEASURED BY
348 { 0x225F, Infix, 5, 5, 0}, // QUESTIONED EQUAL TO
349 { 0x2260, Infix, 5, 5, 0}, // NOT EQUAL TO
350 { 0x2261, Infix, 5, 5, 0}, // IDENTICAL TO
351 { 0x2262, Infix, 5, 5, 0}, // NOT IDENTICAL TO
352 { 0x2263, Infix, 5, 5, 0}, // STRICTLY EQUIVALENT TO
353 { 0x2264, Infix, 5, 5, 0}, // LESS-THAN OR EQUAL TO
354 { 0x2265, Infix, 5, 5, 0}, // GREATER-THAN OR EQUAL TO
355 { 0x2266, Infix, 5, 5, 0}, // LESS-THAN OVER EQUAL TO
356 { 0x2267, Infix, 5, 5, 0}, // GREATER-THAN OVER EQUAL TO
357 { 0x2268, Infix, 5, 5, 0}, // LESS-THAN BUT NOT EQUAL TO
358 { 0x2269, Infix, 5, 5, 0}, // GREATER-THAN BUT NOT EQUAL TO
359 { 0x226A, Infix, 5, 5, 0}, // MUCH LESS-THAN
360 { 0x226B, Infix, 5, 5, 0}, // MUCH GREATER-THAN
361 { 0x226C, Infix, 5, 5, 0}, // BETWEEN
362 { 0x226D, Infix, 5, 5, 0}, // NOT EQUIVALENT TO
363 { 0x226E, Infix, 5, 5, 0}, // NOT LESS-THAN
364 { 0x226F, Infix, 5, 5, 0}, // NOT GREATER-THAN
365 { 0x2270, Infix, 5, 5, 0}, // NEITHER LESS-THAN NOR EQUAL TO
366 { 0x2271, Infix, 5, 5, 0}, // NEITHER GREATER-THAN NOR EQUAL TO
367 { 0x2272, Infix, 5, 5, 0}, // LESS-THAN OR EQUIVALENT TO
368 { 0x2273, Infix, 5, 5, 0}, // GREATER-THAN OR EQUIVALENT TO
369 { 0x2274, Infix, 5, 5, 0}, // NEITHER LESS-THAN NOR EQUIVALENT TO
370 { 0x2275, Infix, 5, 5, 0}, // NEITHER GREATER-THAN NOR EQUIVALENT TO
371 { 0x2276, Infix, 5, 5, 0}, // LESS-THAN OR GREATER-THAN
372 { 0x2277, Infix, 5, 5, 0}, // GREATER-THAN OR LESS-THAN
373 { 0x2278, Infix, 5, 5, 0}, // NEITHER LESS-THAN NOR GREATER-THAN
374 { 0x2279, Infix, 5, 5, 0}, // NEITHER GREATER-THAN NOR LESS-THAN
375 { 0x227A, Infix, 5, 5, 0}, // PRECEDES
376 { 0x227B, Infix, 5, 5, 0}, // SUCCEEDS
377 { 0x227C, Infix, 5, 5, 0}, // PRECEDES OR EQUAL TO
378 { 0x227D, Infix, 5, 5, 0}, // SUCCEEDS OR EQUAL TO
379 { 0x227E, Infix, 5, 5, 0}, // PRECEDES OR EQUIVALENT TO
380 { 0x227F, Infix, 5, 5, 0}, // SUCCEEDS OR EQUIVALENT TO
381 { 0x2280, Infix, 5, 5, 0}, // DOES NOT PRECEDE
382 { 0x2281, Infix, 5, 5, 0}, // DOES NOT SUCCEED
383 { 0x2282, Infix, 5, 5, 0}, // SUBSET OF
384 { 0x2283, Infix, 5, 5, 0}, // SUPERSET OF
385 { 0x2284, Infix, 5, 5, 0}, // NOT A SUBSET OF
386 { 0x2285, Infix, 5, 5, 0}, // NOT A SUPERSET OF
387 { 0x2286, Infix, 5, 5, 0}, // SUBSET OF OR EQUAL TO
388 { 0x2287, Infix, 5, 5, 0}, // SUPERSET OF OR EQUAL TO
389 { 0x2288, Infix, 5, 5, 0}, // NEITHER A SUBSET OF NOR EQUAL TO
390 { 0x2289, Infix, 5, 5, 0}, // NEITHER A SUPERSET OF NOR EQUAL TO
391 { 0x228A, Infix, 5, 5, 0}, // SUBSET OF WITH NOT EQUAL TO
392 { 0x228B, Infix, 5, 5, 0}, // SUPERSET OF WITH NOT EQUAL TO
393 { 0x228C, Infix, 4, 4, 0}, // MULTISET
394 { 0x228D, Infix, 4, 4, 0}, // MULTISET MULTIPLICATION
395 { 0x228E, Infix, 4, 4, 0}, // MULTISET UNION
396 { 0x228F, Infix, 5, 5, 0}, // SQUARE IMAGE OF
397 { 0x2290, Infix, 5, 5, 0}, // SQUARE ORIGINAL OF
398 { 0x2291, Infix, 5, 5, 0}, // SQUARE IMAGE OF OR EQUAL TO
399 { 0x2292, Infix, 5, 5, 0}, // SQUARE ORIGINAL OF OR EQUAL TO
400 { 0x2293, Infix, 4, 4, 0}, // SQUARE CAP
401 { 0x2294, Infix, 4, 4, 0}, // SQUARE CUP
402 { 0x2295, Infix, 4, 4, 0}, // CIRCLED PLUS
403 { 0x2296, Infix, 4, 4, 0}, // CIRCLED MINUS
404 { 0x2297, Infix, 4, 4, 0}, // CIRCLED TIMES
405 { 0x2298, Infix, 4, 4, 0}, // CIRCLED DIVISION SLASH
406 { 0x2299, Infix, 4, 4, 0}, // CIRCLED DOT OPERATOR
407 { 0x229A, Infix, 4, 4, 0}, // CIRCLED RING OPERATOR
408 { 0x229B, Infix, 4, 4, 0}, // CIRCLED ASTERISK OPERATOR
409 { 0x229C, Infix, 4, 4, 0}, // CIRCLED EQUALS
410 { 0x229D, Infix, 4, 4, 0}, // CIRCLED DASH
411 { 0x229E, Infix, 4, 4, 0}, // SQUARED PLUS
412 { 0x229F, Infix, 4, 4, 0}, // SQUARED MINUS
413 { 0x22A0, Infix, 4, 4, 0}, // SQUARED TIMES
414 { 0x22A1, Infix, 4, 4, 0}, // SQUARED DOT OPERATOR
415 { 0x22A2, Infix, 5, 5, 0}, // RIGHT TACK
416 { 0x22A3, Infix, 5, 5, 0}, // LEFT TACK
417 { 0x22A4, Infix, 5, 5, 0}, // DOWN TACK
418 { 0x22A5, Infix, 5, 5, 0}, // UP TACK
419 { 0x22A6, Infix, 5, 5, 0}, // ASSERTION
420 { 0x22A7, Infix, 5, 5, 0}, // MODELS
421 { 0x22A8, Infix, 5, 5, 0}, // TRUE
422 { 0x22A9, Infix, 5, 5, 0}, // FORCES
423 { 0x22AA, Infix, 5, 5, 0}, // TRIPLE VERTICAL BAR RIGHT TURNSTILE
424 { 0x22AB, Infix, 5, 5, 0}, // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
425 { 0x22AC, Infix, 5, 5, 0}, // DOES NOT PROVE
426 { 0x22AD, Infix, 5, 5, 0}, // NOT TRUE
427 { 0x22AE, Infix, 5, 5, 0}, // DOES NOT FORCE
428 { 0x22AF, Infix, 5, 5, 0}, // NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
429 { 0x22B0, Infix, 5, 5, 0}, // PRECEDES UNDER RELATION
430 { 0x22B1, Infix, 5, 5, 0}, // SUCCEEDS UNDER RELATION
431 { 0x22B2, Infix, 5, 5, 0}, // NORMAL SUBGROUP OF
432 { 0x22B3, Infix, 5, 5, 0}, // CONTAINS AS NORMAL SUBGROUP
433 { 0x22B4, Infix, 5, 5, 0}, // NORMAL SUBGROUP OF OR EQUAL TO
434 { 0x22B5, Infix, 5, 5, 0}, // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
435 { 0x22B6, Infix, 5, 5, 0}, // ORIGINAL OF
436 { 0x22B7, Infix, 5, 5, 0}, // IMAGE OF
437 { 0x22B8, Infix, 5, 5, 0}, // MULTIMAP
438 { 0x22B9, Infix, 5, 5, 0}, // HERMITIAN CONJUGATE MATRIX
439 { 0x22BA, Infix, 4, 4, 0}, // INTERCALATE
440 { 0x22BB, Infix, 4, 4, 0}, // XOR
441 { 0x22BC, Infix, 4, 4, 0}, // NAND
442 { 0x22BD, Infix, 4, 4, 0}, // NOR
443 { 0x22BE, Infix, 3, 3, 0}, // RIGHT ANGLE WITH ARC
444 { 0x22BF, Infix, 3, 3, 0}, // RIGHT TRIANGLE
445 { 0x22C0, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY LOGICAL AND
446 { 0x22C1, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY LOGICAL OR
447 { 0x22C2, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY INTERSECTION
448 { 0x22C3, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY UNION
449 { 0x22C4, Infix, 4, 4, 0}, // DIAMOND OPERATOR
450 { 0x22C5, Infix, 4, 4, 0}, // DOT OPERATOR
451 { 0x22C6, Infix, 4, 4, 0}, // STAR OPERATOR
452 { 0x22C7, Infix, 4, 4, 0}, // DIVISION TIMES
453 { 0x22C8, Infix, 5, 5, 0}, // BOWTIE
454 { 0x22C9, Infix, 4, 4, 0}, // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
455 { 0x22CA, Infix, 4, 4, 0}, // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
456 { 0x22CB, Infix, 4, 4, 0}, // LEFT SEMIDIRECT PRODUCT
457 { 0x22CC, Infix, 4, 4, 0}, // RIGHT SEMIDIRECT PRODUCT
458 { 0x22CD, Infix, 5, 5, 0}, // REVERSED TILDE EQUALS
459 { 0x22CE, Infix, 4, 4, 0}, // CURLY LOGICAL OR
460 { 0x22CF, Infix, 4, 4, 0}, // CURLY LOGICAL AND
461 { 0x22D0, Infix, 5, 5, 0}, // DOUBLE SUBSET
462 { 0x22D1, Infix, 5, 5, 0}, // DOUBLE SUPERSET
463 { 0x22D2, Infix, 4, 4, 0}, // DOUBLE INTERSECTION
464 { 0x22D3, Infix, 4, 4, 0}, // DOUBLE UNION
465 { 0x22D4, Infix, 5, 5, 0}, // PITCHFORK
466 { 0x22D5, Infix, 5, 5, 0}, // EQUAL AND PARALLEL TO
467 { 0x22D6, Infix, 5, 5, 0}, // LESS-THAN WITH DOT
468 { 0x22D7, Infix, 5, 5, 0}, // GREATER-THAN WITH DOT
469 { 0x22D8, Infix, 5, 5, 0}, // VERY MUCH LESS-THAN
470 { 0x22D9, Infix, 5, 5, 0}, // VERY MUCH GREATER-THAN
471 { 0x22DA, Infix, 5, 5, 0}, // LESS-THAN EQUAL TO OR GREATER-THAN
472 { 0x22DB, Infix, 5, 5, 0}, // GREATER-THAN EQUAL TO OR LESS-THAN
473 { 0x22DC, Infix, 5, 5, 0}, // EQUAL TO OR LESS-THAN
474 { 0x22DD, Infix, 5, 5, 0}, // EQUAL TO OR GREATER-THAN
475 { 0x22DE, Infix, 5, 5, 0}, // EQUAL TO OR PRECEDES
476 { 0x22DF, Infix, 5, 5, 0}, // EQUAL TO OR SUCCEEDS
477 { 0x22E0, Infix, 5, 5, 0}, // DOES NOT PRECEDE OR EQUAL
478 { 0x22E1, Infix, 5, 5, 0}, // DOES NOT SUCCEED OR EQUAL
479 { 0x22E2, Infix, 5, 5, 0}, // NOT SQUARE IMAGE OF OR EQUAL TO
480 { 0x22E3, Infix, 5, 5, 0}, // NOT SQUARE ORIGINAL OF OR EQUAL TO
481 { 0x22E4, Infix, 5, 5, 0}, // SQUARE IMAGE OF OR NOT EQUAL TO
482 { 0x22E5, Infix, 5, 5, 0}, // SQUARE ORIGINAL OF OR NOT EQUAL TO
483 { 0x22E6, Infix, 5, 5, 0}, // LESS-THAN BUT NOT EQUIVALENT TO
484 { 0x22E7, Infix, 5, 5, 0}, // GREATER-THAN BUT NOT EQUIVALENT TO
485 { 0x22E8, Infix, 5, 5, 0}, // PRECEDES BUT NOT EQUIVALENT TO
486 { 0x22E9, Infix, 5, 5, 0}, // SUCCEEDS BUT NOT EQUIVALENT TO
487 { 0x22EA, Infix, 5, 5, 0}, // NOT NORMAL SUBGROUP OF
488 { 0x22EB, Infix, 5, 5, 0}, // DOES NOT CONTAIN AS NORMAL SUBGROUP
489 { 0x22EC, Infix, 5, 5, 0}, // NOT NORMAL SUBGROUP OF OR EQUAL TO
490 { 0x22ED, Infix, 5, 5, 0}, // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
491 { 0x22EE, Infix, 5, 5, 0}, // VERTICAL ELLIPSIS
492 { 0x22EF, Infix, 0, 0, 0}, // MIDLINE HORIZONTAL ELLIPSIS
493 { 0x22F0, Infix, 5, 5, 0}, // UP RIGHT DIAGONAL ELLIPSIS
494 { 0x22F1, Infix, 5, 5, 0}, // DOWN RIGHT DIAGONAL ELLIPSIS
495 { 0x22F2, Infix, 5, 5, 0}, // ELEMENT OF WITH LONG HORIZONTAL STROKE
496 { 0x22F3, Infix, 5, 5, 0}, // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
497 { 0x22F4, Infix, 5, 5, 0}, // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
498 { 0x22F5, Infix, 5, 5, 0}, // ELEMENT OF WITH DOT ABOVE
499 { 0x22F6, Infix, 5, 5, 0}, // ELEMENT OF WITH OVERBAR
500 { 0x22F7, Infix, 5, 5, 0}, // SMALL ELEMENT OF WITH OVERBAR
501 { 0x22F8, Infix, 5, 5, 0}, // ELEMENT OF WITH UNDERBAR
502 { 0x22F9, Infix, 5, 5, 0}, // ELEMENT OF WITH TWO HORIZONTAL STROKES
503 { 0x22FA, Infix, 5, 5, 0}, // CONTAINS WITH LONG HORIZONTAL STROKE
504 { 0x22FB, Infix, 5, 5, 0}, // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
505 { 0x22FC, Infix, 5, 5, 0}, // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
506 { 0x22FD, Infix, 5, 5, 0}, // CONTAINS WITH OVERBAR
507 { 0x22FE, Infix, 5, 5, 0}, // SMALL CONTAINS WITH OVERBAR
508 { 0x22FF, Infix, 5, 5, 0}, // Z NOTATION BAG MEMBERSHIP
509 { 0x2308, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT CEILING
510 { 0x2309, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT CEILING
511 { 0x230A, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT FLOOR
512 { 0x230B, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT FLOOR
513 { 0x23B4, Postfix, 0, 0, Accent | Stretchy}, // TOP SQUARE BRACKET
514 { 0x23B5, Postfix, 0, 0, Accent | Stretchy}, // BOTTOM SQUARE BRACKET
515 { 0x23DC, Postfix, 0, 0, Accent | Stretchy}, // TOP PARENTHESIS
516 { 0x23DD, Postfix, 0, 0, Accent | Stretchy}, // BOTTOM PARENTHESIS
517 { 0x23DE, Postfix, 0, 0, Accent | Stretchy}, // TOP CURLY BRACKET
518 { 0x23DF, Postfix, 0, 0, Accent | Stretchy}, // BOTTOM CURLY BRACKET
519 { 0x23E0, Postfix, 0, 0, Accent | Stretchy}, // TOP TORTOISE SHELL BRACKET
520 { 0x23E1, Postfix, 0, 0, Accent | Stretchy}, // BOTTOM TORTOISE SHELL BRACKET
521 { 0x25A0, Infix, 3, 3, 0}, // BLACK SQUARE
522 { 0x25A1, Infix, 3, 3, 0}, // WHITE SQUARE
523 { 0x25AA, Infix, 3, 3, 0}, // BLACK SMALL SQUARE
524 { 0x25AB, Infix, 3, 3, 0}, // WHITE SMALL SQUARE
525 { 0x25AD, Infix, 3, 3, 0}, // WHITE RECTANGLE
526 { 0x25AE, Infix, 3, 3, 0}, // BLACK VERTICAL RECTANGLE
527 { 0x25AF, Infix, 3, 3, 0}, // WHITE VERTICAL RECTANGLE
528 { 0x25B0, Infix, 3, 3, 0}, // BLACK PARALLELOGRAM
529 { 0x25B1, Infix, 3, 3, 0}, // WHITE PARALLELOGRAM
530 { 0x25B2, Infix, 4, 4, 0}, // BLACK UP-POINTING TRIANGLE
531 { 0x25B3, Infix, 4, 4, 0}, // WHITE UP-POINTING TRIANGLE
532 { 0x25B4, Infix, 4, 4, 0}, // BLACK UP-POINTING SMALL TRIANGLE
533 { 0x25B5, Infix, 4, 4, 0}, // WHITE UP-POINTING SMALL TRIANGLE
534 { 0x25B6, Infix, 4, 4, 0}, // BLACK RIGHT-POINTING TRIANGLE
535 { 0x25B7, Infix, 4, 4, 0}, // WHITE RIGHT-POINTING TRIANGLE
536 { 0x25B8, Infix, 4, 4, 0}, // BLACK RIGHT-POINTING SMALL TRIANGLE
537 { 0x25B9, Infix, 4, 4, 0}, // WHITE RIGHT-POINTING SMALL TRIANGLE
538 { 0x25BC, Infix, 4, 4, 0}, // BLACK DOWN-POINTING TRIANGLE
539 { 0x25BD, Infix, 4, 4, 0}, // WHITE DOWN-POINTING TRIANGLE
540 { 0x25BE, Infix, 4, 4, 0}, // BLACK DOWN-POINTING SMALL TRIANGLE
541 { 0x25BF, Infix, 4, 4, 0}, // WHITE DOWN-POINTING SMALL TRIANGLE
542 { 0x25C0, Infix, 4, 4, 0}, // BLACK LEFT-POINTING TRIANGLE
543 { 0x25C1, Infix, 4, 4, 0}, // WHITE LEFT-POINTING TRIANGLE
544 { 0x25C2, Infix, 4, 4, 0}, // BLACK LEFT-POINTING SMALL TRIANGLE
545 { 0x25C3, Infix, 4, 4, 0}, // WHITE LEFT-POINTING SMALL TRIANGLE
546 { 0x25C4, Infix, 4, 4, 0}, // BLACK LEFT-POINTING POINTER
547 { 0x25C5, Infix, 4, 4, 0}, // WHITE LEFT-POINTING POINTER
548 { 0x25C6, Infix, 4, 4, 0}, // BLACK DIAMOND
549 { 0x25C7, Infix, 4, 4, 0}, // WHITE DIAMOND
550 { 0x25C8, Infix, 4, 4, 0}, // WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
551 { 0x25C9, Infix, 4, 4, 0}, // FISHEYE
552 { 0x25CC, Infix, 4, 4, 0}, // DOTTED CIRCLE
553 { 0x25CD, Infix, 4, 4, 0}, // CIRCLE WITH VERTICAL FILL
554 { 0x25CE, Infix, 4, 4, 0}, // BULLSEYE
555 { 0x25CF, Infix, 4, 4, 0}, // BLACK CIRCLE
556 { 0x25D6, Infix, 4, 4, 0}, // LEFT HALF BLACK CIRCLE
557 { 0x25D7, Infix, 4, 4, 0}, // RIGHT HALF BLACK CIRCLE
558 { 0x25E6, Infix, 4, 4, 0}, // WHITE BULLET
559 { 0x266D, Postfix, 0, 2, 0}, // MUSIC FLAT SIGN
560 { 0x266E, Postfix, 0, 2, 0}, // MUSIC NATURAL SIGN
561 { 0x266F, Postfix, 0, 2, 0}, // MUSIC SHARP SIGN
562 { 0x2758, Infix, 5, 5, 0}, // LIGHT VERTICAL BAR
563 { 0x2772, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
564 { 0x2773, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
565 { 0x27E6, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL LEFT WHITE SQUARE BRACKET
566 { 0x27E7, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
567 { 0x27E8, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL LEFT ANGLE BRACKET
568 { 0x27E9, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL RIGHT ANGLE BRACKET
569 { 0x27EA, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
570 { 0x27EB, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
571 { 0x27EC, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
572 { 0x27ED, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
573 { 0x27EE, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL LEFT FLATTENED PARENTHESIS
574 { 0x27EF, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // MATHEMATICAL RIGHT FLATTENED PARENTHESIS
575 { 0x27F0, Infix, 5, 5, Stretchy}, // UPWARDS QUADRUPLE ARROW
576 { 0x27F1, Infix, 5, 5, Stretchy}, // DOWNWARDS QUADRUPLE ARROW
577 { 0x27F5, Infix, 5, 5, Stretchy | Accent}, // LONG LEFTWARDS ARROW
578 { 0x27F6, Infix, 5, 5, Stretchy | Accent}, // LONG RIGHTWARDS ARROW
579 { 0x27F7, Infix, 5, 5, Stretchy | Accent}, // LONG LEFT RIGHT ARROW
580 { 0x27F8, Infix, 5, 5, Stretchy | Accent}, // LONG LEFTWARDS DOUBLE ARROW
581 { 0x27F9, Infix, 5, 5, Stretchy | Accent}, // LONG RIGHTWARDS DOUBLE ARROW
582 { 0x27FA, Infix, 5, 5, Stretchy | Accent}, // LONG LEFT RIGHT DOUBLE ARROW
583 { 0x27FB, Infix, 5, 5, Stretchy | Accent}, // LONG LEFTWARDS ARROW FROM BAR
584 { 0x27FC, Infix, 5, 5, Stretchy | Accent}, // LONG RIGHTWARDS ARROW FROM BAR
585 { 0x27FD, Infix, 5, 5, Stretchy | Accent}, // LONG LEFTWARDS DOUBLE ARROW FROM BAR
586 { 0x27FE, Infix, 5, 5, Stretchy | Accent}, // LONG RIGHTWARDS DOUBLE ARROW FROM BAR
587 { 0x27FF, Infix, 5, 5, Stretchy | Accent}, // LONG RIGHTWARDS SQUIGGLE ARROW
588 { 0x2900, Infix, 5, 5, Accent}, // RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE
589 { 0x2901, Infix, 5, 5, Accent}, // RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE
590 { 0x2902, Infix, 5, 5, Accent}, // LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE
591 { 0x2903, Infix, 5, 5, Accent}, // RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE
592 { 0x2904, Infix, 5, 5, Accent}, // LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE
593 { 0x2905, Infix, 5, 5, Accent}, // RIGHTWARDS TWO-HEADED ARROW FROM BAR
594 { 0x2906, Infix, 5, 5, Accent}, // LEFTWARDS DOUBLE ARROW FROM BAR
595 { 0x2907, Infix, 5, 5, Accent}, // RIGHTWARDS DOUBLE ARROW FROM BAR
596 { 0x2908, Infix, 5, 5, 0}, // DOWNWARDS ARROW WITH HORIZONTAL STROKE
597 { 0x2909, Infix, 5, 5, 0}, // UPWARDS ARROW WITH HORIZONTAL STROKE
598 { 0x290A, Infix, 5, 5, Stretchy}, // UPWARDS TRIPLE ARROW
599 { 0x290B, Infix, 5, 5, Stretchy}, // DOWNWARDS TRIPLE ARROW
600 { 0x290C, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS DOUBLE DASH ARROW
601 { 0x290D, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS DOUBLE DASH ARROW
602 { 0x290E, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS TRIPLE DASH ARROW
603 { 0x290F, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS TRIPLE DASH ARROW
604 { 0x2910, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW
605 { 0x2911, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW WITH DOTTED STEM
606 { 0x2912, Infix, 5, 5, Stretchy}, // UPWARDS ARROW TO BAR
607 { 0x2913, Infix, 5, 5, Stretchy}, // DOWNWARDS ARROW TO BAR
608 { 0x2914, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE
609 { 0x2915, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
610 { 0x2916, Infix, 5, 5, Accent}, // RIGHTWARDS TWO-HEADED ARROW WITH TAIL
611 { 0x2917, Infix, 5, 5, Accent}, // RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
612 { 0x2918, Infix, 5, 5, Accent}, // RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
613 { 0x2919, Infix, 5, 5, Accent}, // LEFTWARDS ARROW-TAIL
614 { 0x291A, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW-TAIL
615 { 0x291B, Infix, 5, 5, Accent}, // LEFTWARDS DOUBLE ARROW-TAIL
616 { 0x291C, Infix, 5, 5, Accent}, // RIGHTWARDS DOUBLE ARROW-TAIL
617 { 0x291D, Infix, 5, 5, Accent}, // LEFTWARDS ARROW TO BLACK DIAMOND
618 { 0x291E, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW TO BLACK DIAMOND
619 { 0x291F, Infix, 5, 5, Accent}, // LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND
620 { 0x2920, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND
621 { 0x2921, Infix, 5, 5, Stretchy}, // NORTH WEST AND SOUTH EAST ARROW
622 { 0x2922, Infix, 5, 5, Stretchy}, // NORTH EAST AND SOUTH WEST ARROW
623 { 0x2923, Infix, 5, 5, 0}, // NORTH WEST ARROW WITH HOOK
624 { 0x2924, Infix, 5, 5, 0}, // NORTH EAST ARROW WITH HOOK
625 { 0x2925, Infix, 5, 5, 0}, // SOUTH EAST ARROW WITH HOOK
626 { 0x2926, Infix, 5, 5, 0}, // SOUTH WEST ARROW WITH HOOK
627 { 0x2927, Infix, 5, 5, 0}, // NORTH WEST ARROW AND NORTH EAST ARROW
628 { 0x2928, Infix, 5, 5, 0}, // NORTH EAST ARROW AND SOUTH EAST ARROW
629 { 0x2929, Infix, 5, 5, 0}, // SOUTH EAST ARROW AND SOUTH WEST ARROW
630 { 0x292A, Infix, 5, 5, 0}, // SOUTH WEST ARROW AND NORTH WEST ARROW
631 { 0x292B, Infix, 5, 5, 0}, // RISING DIAGONAL CROSSING FALLING DIAGONAL
632 { 0x292C, Infix, 5, 5, 0}, // FALLING DIAGONAL CROSSING RISING DIAGONAL
633 { 0x292D, Infix, 5, 5, 0}, // SOUTH EAST ARROW CROSSING NORTH EAST ARROW
634 { 0x292E, Infix, 5, 5, 0}, // NORTH EAST ARROW CROSSING SOUTH EAST ARROW
635 { 0x292F, Infix, 5, 5, 0}, // FALLING DIAGONAL CROSSING NORTH EAST ARROW
636 { 0x2930, Infix, 5, 5, 0}, // RISING DIAGONAL CROSSING SOUTH EAST ARROW
637 { 0x2931, Infix, 5, 5, 0}, // NORTH EAST ARROW CROSSING NORTH WEST ARROW
638 { 0x2932, Infix, 5, 5, 0}, // NORTH WEST ARROW CROSSING NORTH EAST ARROW
639 { 0x2933, Infix, 5, 5, Accent}, // WAVE ARROW POINTING DIRECTLY RIGHT
640 { 0x2934, Infix, 5, 5, 0}, // ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
641 { 0x2935, Infix, 5, 5, 0}, // ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
642 { 0x2936, Infix, 5, 5, 0}, // ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
643 { 0x2937, Infix, 5, 5, 0}, // ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS
644 { 0x2938, Infix, 5, 5, 0}, // RIGHT-SIDE ARC CLOCKWISE ARROW
645 { 0x2939, Infix, 5, 5, 0}, // LEFT-SIDE ARC ANTICLOCKWISE ARROW
646 { 0x293A, Infix, 5, 5, Accent}, // TOP ARC ANTICLOCKWISE ARROW
647 { 0x293B, Infix, 5, 5, Accent}, // BOTTOM ARC ANTICLOCKWISE ARROW
648 { 0x293C, Infix, 5, 5, Accent}, // TOP ARC CLOCKWISE ARROW WITH MINUS
649 { 0x293D, Infix, 5, 5, Accent}, // TOP ARC ANTICLOCKWISE ARROW WITH PLUS
650 { 0x293E, Infix, 5, 5, 0}, // LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW
651 { 0x293F, Infix, 5, 5, 0}, // LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW
652 { 0x2940, Infix, 5, 5, 0}, // ANTICLOCKWISE CLOSED CIRCLE ARROW
653 { 0x2941, Infix, 5, 5, 0}, // CLOCKWISE CLOSED CIRCLE ARROW
654 { 0x2942, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW
655 { 0x2943, Infix, 5, 5, Accent}, // LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW
656 { 0x2944, Infix, 5, 5, Accent}, // SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW
657 { 0x2945, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW WITH PLUS BELOW
658 { 0x2946, Infix, 5, 5, Accent}, // LEFTWARDS ARROW WITH PLUS BELOW
659 { 0x2947, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW THROUGH X
660 { 0x2948, Infix, 5, 5, Accent}, // LEFT RIGHT ARROW THROUGH SMALL CIRCLE
661 { 0x2949, Infix, 5, 5, 0}, // UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE
662 { 0x294A, Infix, 5, 5, Accent}, // LEFT BARB UP RIGHT BARB DOWN HARPOON
663 { 0x294B, Infix, 5, 5, Accent}, // LEFT BARB DOWN RIGHT BARB UP HARPOON
664 { 0x294C, Infix, 5, 5, 0}, // UP BARB RIGHT DOWN BARB LEFT HARPOON
665 { 0x294D, Infix, 5, 5, 0}, // UP BARB LEFT DOWN BARB RIGHT HARPOON
666 { 0x294E, Infix, 5, 5, Stretchy | Accent}, // LEFT BARB UP RIGHT BARB UP HARPOON
667 { 0x294F, Infix, 5, 5, Stretchy}, // UP BARB RIGHT DOWN BARB RIGHT HARPOON
668 { 0x2950, Infix, 5, 5, Stretchy | Accent}, // LEFT BARB DOWN RIGHT BARB DOWN HARPOON
669 { 0x2951, Infix, 5, 5, Stretchy}, // UP BARB LEFT DOWN BARB LEFT HARPOON
670 { 0x2952, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS HARPOON WITH BARB UP TO BAR
671 { 0x2953, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS HARPOON WITH BARB UP TO BAR
672 { 0x2954, Infix, 5, 5, Stretchy}, // UPWARDS HARPOON WITH BARB RIGHT TO BAR
673 { 0x2955, Infix, 5, 5, Stretchy}, // DOWNWARDS HARPOON WITH BARB RIGHT TO BAR
674 { 0x2956, Infix, 5, 5, Stretchy}, // LEFTWARDS HARPOON WITH BARB DOWN TO BAR
675 { 0x2957, Infix, 5, 5, Stretchy}, // RIGHTWARDS HARPOON WITH BARB DOWN TO BAR
676 { 0x2958, Infix, 5, 5, Stretchy}, // UPWARDS HARPOON WITH BARB LEFT TO BAR
677 { 0x2959, Infix, 5, 5, Stretchy}, // DOWNWARDS HARPOON WITH BARB LEFT TO BAR
678 { 0x295A, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS HARPOON WITH BARB UP FROM BAR
679 { 0x295B, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS HARPOON WITH BARB UP FROM BAR
680 { 0x295C, Infix, 5, 5, Stretchy}, // UPWARDS HARPOON WITH BARB RIGHT FROM BAR
681 { 0x295D, Infix, 5, 5, Stretchy}, // DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR
682 { 0x295E, Infix, 5, 5, Stretchy | Accent}, // LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
683 { 0x295F, Infix, 5, 5, Stretchy | Accent}, // RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR
684 { 0x2960, Infix, 5, 5, Stretchy}, // UPWARDS HARPOON WITH BARB LEFT FROM BAR
685 { 0x2961, Infix, 5, 5, Stretchy}, // DOWNWARDS HARPOON WITH BARB LEFT FROM BAR
686 { 0x2962, Infix, 5, 5, Accent}, // LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN
687 { 0x2963, Infix, 5, 5, 0}, // UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
688 { 0x2964, Infix, 5, 5, Accent}, // RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
689 { 0x2965, Infix, 5, 5, 0}, // DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
690 { 0x2966, Infix, 5, 5, Accent}, // LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP
691 { 0x2967, Infix, 5, 5, Accent}, // LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN
692 { 0x2968, Infix, 5, 5, Accent}, // RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP
693 { 0x2969, Infix, 5, 5, Accent}, // RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN
694 { 0x296A, Infix, 5, 5, Accent}, // LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
695 { 0x296B, Infix, 5, 5, Accent}, // LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
696 { 0x296C, Infix, 5, 5, Accent}, // RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH
697 { 0x296D, Infix, 5, 5, Accent}, // RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH
698 { 0x296E, Infix, 5, 5, Stretchy}, // UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT
699 { 0x296F, Infix, 5, 5, Stretchy}, // DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT
700 { 0x2970, Infix, 5, 5, Accent}, // RIGHT DOUBLE ARROW WITH ROUNDED HEAD
701 { 0x2971, Infix, 5, 5, Accent}, // EQUALS SIGN ABOVE RIGHTWARDS ARROW
702 { 0x2972, Infix, 5, 5, Accent}, // TILDE OPERATOR ABOVE RIGHTWARDS ARROW
703 { 0x2973, Infix, 5, 5, Accent}, // LEFTWARDS ARROW ABOVE TILDE OPERATOR
704 { 0x2974, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW ABOVE TILDE OPERATOR
705 { 0x2975, Infix, 5, 5, Accent}, // RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO
706 { 0x2976, Infix, 5, 5, Accent}, // LESS-THAN ABOVE LEFTWARDS ARROW
707 { 0x2977, Infix, 5, 5, Accent}, // LEFTWARDS ARROW THROUGH LESS-THAN
708 { 0x2978, Infix, 5, 5, Accent}, // GREATER-THAN ABOVE RIGHTWARDS ARROW
709 { 0x2979, Infix, 5, 5, Accent}, // SUBSET ABOVE RIGHTWARDS ARROW
710 { 0x297A, Infix, 5, 5, Accent}, // LEFTWARDS ARROW THROUGH SUBSET
711 { 0x297B, Infix, 5, 5, Accent}, // SUPERSET ABOVE LEFTWARDS ARROW
712 { 0x297C, Infix, 5, 5, Accent}, // LEFT FISH TAIL
713 { 0x297D, Infix, 5, 5, Accent}, // RIGHT FISH TAIL
714 { 0x297E, Infix, 5, 5, 0}, // UP FISH TAIL
715 { 0x297F, Infix, 5, 5, 0}, // DOWN FISH TAIL
716 { 0x2980, Prefix, 0, 0, Fence | Stretchy}, // TRIPLE VERTICAL BAR DELIMITER
717 { 0x2980, Postfix, 0, 0, Fence | Stretchy}, // TRIPLE VERTICAL BAR DELIMITER
718 { 0x2981, Infix, 3, 3, 0}, // Z NOTATION SPOT
719 { 0x2982, Infix, 3, 3, 0}, // Z NOTATION TYPE COLON
720 { 0x2983, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT WHITE CURLY BRACKET
721 { 0x2984, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT WHITE CURLY BRACKET
722 { 0x2985, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT WHITE PARENTHESIS
723 { 0x2986, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT WHITE PARENTHESIS
724 { 0x2987, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // Z NOTATION LEFT IMAGE BRACKET
725 { 0x2988, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // Z NOTATION RIGHT IMAGE BRACKET
726 { 0x2989, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // Z NOTATION LEFT BINDING BRACKET
727 { 0x298A, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // Z NOTATION RIGHT BINDING BRACKET
728 { 0x298B, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT SQUARE BRACKET WITH UNDERBAR
729 { 0x298C, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT SQUARE BRACKET WITH UNDERBAR
730 { 0x298D, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
731 { 0x298E, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
732 { 0x298F, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
733 { 0x2990, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
734 { 0x2991, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT ANGLE BRACKET WITH DOT
735 { 0x2992, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT ANGLE BRACKET WITH DOT
736 { 0x2993, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT ARC LESS-THAN BRACKET
737 { 0x2994, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT ARC GREATER-THAN BRACKET
738 { 0x2995, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // DOUBLE LEFT ARC GREATER-THAN BRACKET
739 { 0x2996, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // DOUBLE RIGHT ARC LESS-THAN BRACKET
740 { 0x2997, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT BLACK TORTOISE SHELL BRACKET
741 { 0x2998, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT BLACK TORTOISE SHELL BRACKET
742 { 0x2999, Infix, 3, 3, 0}, // DOTTED FENCE
743 { 0x299A, Infix, 3, 3, 0}, // VERTICAL ZIGZAG LINE
744 { 0x299B, Infix, 3, 3, 0}, // MEASURED ANGLE OPENING LEFT
745 { 0x299C, Infix, 3, 3, 0}, // RIGHT ANGLE VARIANT WITH SQUARE
746 { 0x299D, Infix, 3, 3, 0}, // MEASURED RIGHT ANGLE WITH DOT
747 { 0x299E, Infix, 3, 3, 0}, // ANGLE WITH S INSIDE
748 { 0x299F, Infix, 3, 3, 0}, // ACUTE ANGLE
749 { 0x29A0, Infix, 3, 3, 0}, // SPHERICAL ANGLE OPENING LEFT
750 { 0x29A1, Infix, 3, 3, 0}, // SPHERICAL ANGLE OPENING UP
751 { 0x29A2, Infix, 3, 3, 0}, // TURNED ANGLE
752 { 0x29A3, Infix, 3, 3, 0}, // REVERSED ANGLE
753 { 0x29A4, Infix, 3, 3, 0}, // ANGLE WITH UNDERBAR
754 { 0x29A5, Infix, 3, 3, 0}, // REVERSED ANGLE WITH UNDERBAR
755 { 0x29A6, Infix, 3, 3, 0}, // OBLIQUE ANGLE OPENING UP
756 { 0x29A7, Infix, 3, 3, 0}, // OBLIQUE ANGLE OPENING DOWN
757 { 0x29A8, Infix, 3, 3, 0}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
758 { 0x29A9, Infix, 3, 3, 0}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
759 { 0x29AA, Infix, 3, 3, 0}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
760 { 0x29AB, Infix, 3, 3, 0}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
761 { 0x29AC, Infix, 3, 3, 0}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
762 { 0x29AD, Infix, 3, 3, 0}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
763 { 0x29AE, Infix, 3, 3, 0}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
764 { 0x29AF, Infix, 3, 3, 0}, // MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
765 { 0x29B0, Infix, 3, 3, 0}, // REVERSED EMPTY SET
766 { 0x29B1, Infix, 3, 3, 0}, // EMPTY SET WITH OVERBAR
767 { 0x29B2, Infix, 3, 3, 0}, // EMPTY SET WITH SMALL CIRCLE ABOVE
768 { 0x29B3, Infix, 3, 3, 0}, // EMPTY SET WITH RIGHT ARROW ABOVE
769 { 0x29B4, Infix, 3, 3, 0}, // EMPTY SET WITH LEFT ARROW ABOVE
770 { 0x29B5, Infix, 3, 3, 0}, // CIRCLE WITH HORIZONTAL BAR
771 { 0x29B6, Infix, 4, 4, 0}, // CIRCLED VERTICAL BAR
772 { 0x29B7, Infix, 4, 4, 0}, // CIRCLED PARALLEL
773 { 0x29B8, Infix, 4, 4, 0}, // CIRCLED REVERSE SOLIDUS
774 { 0x29B9, Infix, 4, 4, 0}, // CIRCLED PERPENDICULAR
775 { 0x29BA, Infix, 4, 4, 0}, // CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR
776 { 0x29BB, Infix, 4, 4, 0}, // CIRCLE WITH SUPERIMPOSED X
777 { 0x29BC, Infix, 4, 4, 0}, // CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN
778 { 0x29BD, Infix, 4, 4, 0}, // UP ARROW THROUGH CIRCLE
779 { 0x29BE, Infix, 4, 4, 0}, // CIRCLED WHITE BULLET
780 { 0x29BF, Infix, 4, 4, 0}, // CIRCLED BULLET
781 { 0x29C0, Infix, 5, 5, 0}, // CIRCLED LESS-THAN
782 { 0x29C1, Infix, 5, 5, 0}, // CIRCLED GREATER-THAN
783 { 0x29C2, Infix, 3, 3, 0}, // CIRCLE WITH SMALL CIRCLE TO THE RIGHT
784 { 0x29C3, Infix, 3, 3, 0}, // CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
785 { 0x29C4, Infix, 4, 4, 0}, // SQUARED RISING DIAGONAL SLASH
786 { 0x29C5, Infix, 4, 4, 0}, // SQUARED FALLING DIAGONAL SLASH
787 { 0x29C6, Infix, 4, 4, 0}, // SQUARED ASTERISK
788 { 0x29C7, Infix, 4, 4, 0}, // SQUARED SMALL CIRCLE
789 { 0x29C8, Infix, 4, 4, 0}, // SQUARED SQUARE
790 { 0x29C9, Infix, 3, 3, 0}, // TWO JOINED SQUARES
791 { 0x29CA, Infix, 3, 3, 0}, // TRIANGLE WITH DOT ABOVE
792 { 0x29CB, Infix, 3, 3, 0}, // TRIANGLE WITH UNDERBAR
793 { 0x29CC, Infix, 3, 3, 0}, // S IN TRIANGLE
794 { 0x29CD, Infix, 3, 3, 0}, // TRIANGLE WITH SERIFS AT BOTTOM
795 { 0x29CE, Infix, 5, 5, 0}, // RIGHT TRIANGLE ABOVE LEFT TRIANGLE
796 { 0x29CF, Infix, 5, 5, 0}, // LEFT TRIANGLE BESIDE VERTICAL BAR
797 { 0x29D0, Infix, 5, 5, 0}, // VERTICAL BAR BESIDE RIGHT TRIANGLE
798 { 0x29D1, Infix, 5, 5, 0}, // BOWTIE WITH LEFT HALF BLACK
799 { 0x29D2, Infix, 5, 5, 0}, // BOWTIE WITH RIGHT HALF BLACK
800 { 0x29D3, Infix, 5, 5, 0}, // BLACK BOWTIE
801 { 0x29D4, Infix, 5, 5, 0}, // TIMES WITH LEFT HALF BLACK
802 { 0x29D5, Infix, 5, 5, 0}, // TIMES WITH RIGHT HALF BLACK
803 { 0x29D6, Infix, 4, 4, 0}, // WHITE HOURGLASS
804 { 0x29D7, Infix, 4, 4, 0}, // BLACK HOURGLASS
805 { 0x29D8, Infix, 3, 3, 0}, // LEFT WIGGLY FENCE
806 { 0x29D9, Infix, 3, 3, 0}, // RIGHT WIGGLY FENCE
807 { 0x29DB, Infix, 3, 3, 0}, // RIGHT DOUBLE WIGGLY FENCE
808 { 0x29DC, Infix, 3, 3, 0}, // INCOMPLETE INFINITY
809 { 0x29DD, Infix, 3, 3, 0}, // TIE OVER INFINITY
810 { 0x29DE, Infix, 5, 5, 0}, // INFINITY NEGATED WITH VERTICAL BAR
811 { 0x29DF, Infix, 3, 3, 0}, // DOUBLE-ENDED MULTIMAP
812 { 0x29E0, Infix, 3, 3, 0}, // SQUARE WITH CONTOURED OUTLINE
813 { 0x29E1, Infix, 5, 5, 0}, // INCREASES AS
814 { 0x29E2, Infix, 4, 4, 0}, // SHUFFLE PRODUCT
815 { 0x29E3, Infix, 5, 5, 0}, // EQUALS SIGN AND SLANTED PARALLEL
816 { 0x29E4, Infix, 5, 5, 0}, // EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
817 { 0x29E5, Infix, 5, 5, 0}, // IDENTICAL TO AND SLANTED PARALLEL
818 { 0x29E6, Infix, 5, 5, 0}, // GLEICH STARK
819 { 0x29E7, Infix, 3, 3, 0}, // THERMODYNAMIC
820 { 0x29E8, Infix, 3, 3, 0}, // DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
821 { 0x29E9, Infix, 3, 3, 0}, // DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
822 { 0x29EA, Infix, 3, 3, 0}, // BLACK DIAMOND WITH DOWN ARROW
823 { 0x29EB, Infix, 3, 3, 0}, // BLACK LOZENGE
824 { 0x29EC, Infix, 3, 3, 0}, // WHITE CIRCLE WITH DOWN ARROW
825 { 0x29ED, Infix, 3, 3, 0}, // BLACK CIRCLE WITH DOWN ARROW
826 { 0x29EE, Infix, 3, 3, 0}, // ERROR-BARRED WHITE SQUARE
827 { 0x29EF, Infix, 3, 3, 0}, // ERROR-BARRED BLACK SQUARE
828 { 0x29F0, Infix, 3, 3, 0}, // ERROR-BARRED WHITE DIAMOND
829 { 0x29F1, Infix, 3, 3, 0}, // ERROR-BARRED BLACK DIAMOND
830 { 0x29F2, Infix, 3, 3, 0}, // ERROR-BARRED WHITE CIRCLE
831 { 0x29F3, Infix, 3, 3, 0}, // ERROR-BARRED BLACK CIRCLE
832 { 0x29F4, Infix, 5, 5, 0}, // RULE-DELAYED
833 { 0x29F5, Infix, 4, 4, 0}, // REVERSE SOLIDUS OPERATOR
834 { 0x29F6, Infix, 4, 4, 0}, // SOLIDUS WITH OVERBAR
835 { 0x29F7, Infix, 4, 4, 0}, // REVERSE SOLIDUS WITH HORIZONTAL STROKE
836 { 0x29F8, Infix, 3, 3, 0}, // BIG SOLIDUS
837 { 0x29F9, Infix, 3, 3, 0}, // BIG REVERSE SOLIDUS
838 { 0x29FA, Infix, 3, 3, 0}, // DOUBLE PLUS
839 { 0x29FB, Infix, 3, 3, 0}, // TRIPLE PLUS
840 { 0x29FC, Prefix, 0, 0, Symmetric | Fence | Stretchy}, // LEFT-POINTING CURVED ANGLE BRACKET
841 { 0x29FD, Postfix, 0, 0, Symmetric | Fence | Stretchy}, // RIGHT-POINTING CURVED ANGLE BRACKET
842 { 0x29FE, Infix, 4, 4, 0}, // TINY
843 { 0x29FF, Infix, 4, 4, 0}, // MINY
844 { 0x2A00, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY CIRCLED DOT OPERATOR
845 { 0x2A01, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY CIRCLED PLUS OPERATOR
846 { 0x2A02, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY CIRCLED TIMES OPERATOR
847 { 0x2A03, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY UNION OPERATOR WITH DOT
848 { 0x2A04, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY UNION OPERATOR WITH PLUS
849 { 0x2A05, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY SQUARE INTERSECTION OPERATOR
850 { 0x2A06, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY SQUARE UNION OPERATOR
851 { 0x2A07, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // TWO LOGICAL AND OPERATOR
852 { 0x2A08, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // TWO LOGICAL OR OPERATOR
853 { 0x2A09, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY TIMES OPERATOR
854 { 0x2A0A, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // MODULO TWO SUM
855 { 0x2A0B, Prefix, 1, 2, Symmetric | LargeOp}, // SUMMATION WITH INTEGRAL
856 { 0x2A0C, Prefix, 0, 1, Symmetric | LargeOp}, // QUADRUPLE INTEGRAL OPERATOR
857 { 0x2A0D, Prefix, 1, 2, Symmetric | LargeOp}, // FINITE PART INTEGRAL
858 { 0x2A0E, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL WITH DOUBLE STROKE
859 { 0x2A0F, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL AVERAGE WITH SLASH
860 { 0x2A10, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // CIRCULATION FUNCTION
861 { 0x2A11, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // ANTICLOCKWISE INTEGRATION
862 { 0x2A12, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
863 { 0x2A13, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
864 { 0x2A14, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // LINE INTEGRATION NOT INCLUDING THE POLE
865 { 0x2A15, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL AROUND A POINT OPERATOR
866 { 0x2A16, Prefix, 1, 2, Symmetric | LargeOp}, // QUATERNION INTEGRAL OPERATOR
867 { 0x2A17, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
868 { 0x2A18, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL WITH TIMES SIGN
869 { 0x2A19, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL WITH INTERSECTION
870 { 0x2A1A, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL WITH UNION
871 { 0x2A1B, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL WITH OVERBAR
872 { 0x2A1C, Prefix, 1, 2, Symmetric | LargeOp}, // INTEGRAL WITH UNDERBAR
873 { 0x2A1D, Infix, 3, 3, 0}, // JOIN
874 { 0x2A1E, Infix, 3, 3, 0}, // LARGE LEFT TRIANGLE OPERATOR
875 { 0x2A1F, Infix, 3, 3, 0}, // Z NOTATION SCHEMA COMPOSITION
876 { 0x2A20, Infix, 3, 3, 0}, // Z NOTATION SCHEMA PIPING
877 { 0x2A21, Infix, 3, 3, 0}, // Z NOTATION SCHEMA PROJECTION
878 { 0x2A22, Infix, 4, 4, 0}, // PLUS SIGN WITH SMALL CIRCLE ABOVE
879 { 0x2A23, Infix, 4, 4, 0}, // PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE
880 { 0x2A24, Infix, 4, 4, 0}, // PLUS SIGN WITH TILDE ABOVE
881 { 0x2A25, Infix, 4, 4, 0}, // PLUS SIGN WITH DOT BELOW
882 { 0x2A26, Infix, 4, 4, 0}, // PLUS SIGN WITH TILDE BELOW
883 { 0x2A27, Infix, 4, 4, 0}, // PLUS SIGN WITH SUBSCRIPT TWO
884 { 0x2A28, Infix, 4, 4, 0}, // PLUS SIGN WITH BLACK TRIANGLE
885 { 0x2A29, Infix, 4, 4, 0}, // MINUS SIGN WITH COMMA ABOVE
886 { 0x2A2A, Infix, 4, 4, 0}, // MINUS SIGN WITH DOT BELOW
887 { 0x2A2B, Infix, 4, 4, 0}, // MINUS SIGN WITH FALLING DOTS
888 { 0x2A2C, Infix, 4, 4, 0}, // MINUS SIGN WITH RISING DOTS
889 { 0x2A2D, Infix, 4, 4, 0}, // PLUS SIGN IN LEFT HALF CIRCLE
890 { 0x2A2E, Infix, 4, 4, 0}, // PLUS SIGN IN RIGHT HALF CIRCLE
891 { 0x2A2F, Infix, 4, 4, 0}, // VECTOR OR CROSS PRODUCT
892 { 0x2A30, Infix, 4, 4, 0}, // MULTIPLICATION SIGN WITH DOT ABOVE
893 { 0x2A31, Infix, 4, 4, 0}, // MULTIPLICATION SIGN WITH UNDERBAR
894 { 0x2A32, Infix, 4, 4, 0}, // SEMIDIRECT PRODUCT WITH BOTTOM CLOSED
895 { 0x2A33, Infix, 4, 4, 0}, // SMASH PRODUCT
896 { 0x2A34, Infix, 4, 4, 0}, // MULTIPLICATION SIGN IN LEFT HALF CIRCLE
897 { 0x2A35, Infix, 4, 4, 0}, // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
898 { 0x2A36, Infix, 4, 4, 0}, // CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT
899 { 0x2A37, Infix, 4, 4, 0}, // MULTIPLICATION SIGN IN DOUBLE CIRCLE
900 { 0x2A38, Infix, 4, 4, 0}, // CIRCLED DIVISION SIGN
901 { 0x2A39, Infix, 4, 4, 0}, // PLUS SIGN IN TRIANGLE
902 { 0x2A3A, Infix, 4, 4, 0}, // MINUS SIGN IN TRIANGLE
903 { 0x2A3B, Infix, 4, 4, 0}, // MULTIPLICATION SIGN IN TRIANGLE
904 { 0x2A3C, Infix, 4, 4, 0}, // INTERIOR PRODUCT
905 { 0x2A3D, Infix, 4, 4, 0}, // RIGHTHAND INTERIOR PRODUCT
906 { 0x2A3E, Infix, 4, 4, 0}, // Z NOTATION RELATIONAL COMPOSITION
907 { 0x2A3F, Infix, 4, 4, 0}, // AMALGAMATION OR COPRODUCT
908 { 0x2A40, Infix, 4, 4, 0}, // INTERSECTION WITH DOT
909 { 0x2A41, Infix, 4, 4, 0}, // UNION WITH MINUS SIGN
910 { 0x2A42, Infix, 4, 4, 0}, // UNION WITH OVERBAR
911 { 0x2A43, Infix, 4, 4, 0}, // INTERSECTION WITH OVERBAR
912 { 0x2A44, Infix, 4, 4, 0}, // INTERSECTION WITH LOGICAL AND
913 { 0x2A45, Infix, 4, 4, 0}, // UNION WITH LOGICAL OR
914 { 0x2A46, Infix, 4, 4, 0}, // UNION ABOVE INTERSECTION
915 { 0x2A47, Infix, 4, 4, 0}, // INTERSECTION ABOVE UNION
916 { 0x2A48, Infix, 4, 4, 0}, // UNION ABOVE BAR ABOVE INTERSECTION
917 { 0x2A49, Infix, 4, 4, 0}, // INTERSECTION ABOVE BAR ABOVE UNION
918 { 0x2A4A, Infix, 4, 4, 0}, // UNION BESIDE AND JOINED WITH UNION
919 { 0x2A4B, Infix, 4, 4, 0}, // INTERSECTION BESIDE AND JOINED WITH INTERSECTION
920 { 0x2A4C, Infix, 4, 4, 0}, // CLOSED UNION WITH SERIFS
921 { 0x2A4D, Infix, 4, 4, 0}, // CLOSED INTERSECTION WITH SERIFS
922 { 0x2A4E, Infix, 4, 4, 0}, // DOUBLE SQUARE INTERSECTION
923 { 0x2A4F, Infix, 4, 4, 0}, // DOUBLE SQUARE UNION
924 { 0x2A50, Infix, 4, 4, 0}, // CLOSED UNION WITH SERIFS AND SMASH PRODUCT
925 { 0x2A51, Infix, 4, 4, 0}, // LOGICAL AND WITH DOT ABOVE
926 { 0x2A52, Infix, 4, 4, 0}, // LOGICAL OR WITH DOT ABOVE
927 { 0x2A53, Infix, 4, 4, 0}, // DOUBLE LOGICAL AND
928 { 0x2A54, Infix, 4, 4, 0}, // DOUBLE LOGICAL OR
929 { 0x2A55, Infix, 4, 4, 0}, // TWO INTERSECTING LOGICAL AND
930 { 0x2A56, Infix, 4, 4, 0}, // TWO INTERSECTING LOGICAL OR
931 { 0x2A57, Infix, 4, 4, 0}, // SLOPING LARGE OR
932 { 0x2A58, Infix, 4, 4, 0}, // SLOPING LARGE AND
933 { 0x2A59, Infix, 5, 5, 0}, // LOGICAL OR OVERLAPPING LOGICAL AND
934 { 0x2A5A, Infix, 4, 4, 0}, // LOGICAL AND WITH MIDDLE STEM
935 { 0x2A5B, Infix, 4, 4, 0}, // LOGICAL OR WITH MIDDLE STEM
936 { 0x2A5C, Infix, 4, 4, 0}, // LOGICAL AND WITH HORIZONTAL DASH
937 { 0x2A5D, Infix, 4, 4, 0}, // LOGICAL OR WITH HORIZONTAL DASH
938 { 0x2A5E, Infix, 4, 4, 0}, // LOGICAL AND WITH DOUBLE OVERBAR
939 { 0x2A5F, Infix, 4, 4, 0}, // LOGICAL AND WITH UNDERBAR
940 { 0x2A60, Infix, 4, 4, 0}, // LOGICAL AND WITH DOUBLE UNDERBAR
941 { 0x2A61, Infix, 4, 4, 0}, // SMALL VEE WITH UNDERBAR
942 { 0x2A62, Infix, 4, 4, 0}, // LOGICAL OR WITH DOUBLE OVERBAR
943 { 0x2A63, Infix, 4, 4, 0}, // LOGICAL OR WITH DOUBLE UNDERBAR
944 { 0x2A64, Infix, 4, 4, 0}, // Z NOTATION DOMAIN ANTIRESTRICTION
945 { 0x2A65, Infix, 4, 4, 0}, // Z NOTATION RANGE ANTIRESTRICTION
946 { 0x2A66, Infix, 5, 5, 0}, // EQUALS SIGN WITH DOT BELOW
947 { 0x2A67, Infix, 5, 5, 0}, // IDENTICAL WITH DOT ABOVE
948 { 0x2A68, Infix, 5, 5, 0}, // TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE
949 { 0x2A69, Infix, 5, 5, 0}, // TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE
950 { 0x2A6A, Infix, 5, 5, 0}, // TILDE OPERATOR WITH DOT ABOVE
951 { 0x2A6B, Infix, 5, 5, 0}, // TILDE OPERATOR WITH RISING DOTS
952 { 0x2A6C, Infix, 5, 5, 0}, // SIMILAR MINUS SIMILAR
953 { 0x2A6D, Infix, 5, 5, 0}, // CONGRUENT WITH DOT ABOVE
954 { 0x2A6E, Infix, 5, 5, 0}, // EQUALS WITH ASTERISK
955 { 0x2A6F, Infix, 5, 5, 0}, // ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
956 { 0x2A70, Infix, 5, 5, 0}, // APPROXIMATELY EQUAL OR EQUAL TO
957 { 0x2A71, Infix, 4, 4, 0}, // EQUALS SIGN ABOVE PLUS SIGN
958 { 0x2A72, Infix, 4, 4, 0}, // PLUS SIGN ABOVE EQUALS SIGN
959 { 0x2A73, Infix, 5, 5, 0}, // EQUALS SIGN ABOVE TILDE OPERATOR
960 { 0x2A74, Infix, 5, 5, 0}, // DOUBLE COLON EQUAL
961 { 0x2A75, Infix, 5, 5, 0}, // TWO CONSECUTIVE EQUALS SIGNS
962 { 0x2A76, Infix, 5, 5, 0}, // THREE CONSECUTIVE EQUALS SIGNS
963 { 0x2A77, Infix, 5, 5, 0}, // EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
964 { 0x2A78, Infix, 5, 5, 0}, // EQUIVALENT WITH FOUR DOTS ABOVE
965 { 0x2A79, Infix, 5, 5, 0}, // LESS-THAN WITH CIRCLE INSIDE
966 { 0x2A7A, Infix, 5, 5, 0}, // GREATER-THAN WITH CIRCLE INSIDE
967 { 0x2A7B, Infix, 5, 5, 0}, // LESS-THAN WITH QUESTION MARK ABOVE
968 { 0x2A7C, Infix, 5, 5, 0}, // GREATER-THAN WITH QUESTION MARK ABOVE
969 { 0x2A7D, Infix, 5, 5, 0}, // LESS-THAN OR SLANTED EQUAL TO
970 { 0x2A7E, Infix, 5, 5, 0}, // GREATER-THAN OR SLANTED EQUAL TO
971 { 0x2A7F, Infix, 5, 5, 0}, // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
972 { 0x2A80, Infix, 5, 5, 0}, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
973 { 0x2A81, Infix, 5, 5, 0}, // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
974 { 0x2A82, Infix, 5, 5, 0}, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
975 { 0x2A83, Infix, 5, 5, 0}, // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
976 { 0x2A84, Infix, 5, 5, 0}, // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
977 { 0x2A85, Infix, 5, 5, 0}, // LESS-THAN OR APPROXIMATE
978 { 0x2A86, Infix, 5, 5, 0}, // GREATER-THAN OR APPROXIMATE
979 { 0x2A87, Infix, 5, 5, 0}, // LESS-THAN AND SINGLE-LINE NOT EQUAL TO
980 { 0x2A88, Infix, 5, 5, 0}, // GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
981 { 0x2A89, Infix, 5, 5, 0}, // LESS-THAN AND NOT APPROXIMATE
982 { 0x2A8A, Infix, 5, 5, 0}, // GREATER-THAN AND NOT APPROXIMATE
983 { 0x2A8B, Infix, 5, 5, 0}, // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
984 { 0x2A8C, Infix, 5, 5, 0}, // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
985 { 0x2A8D, Infix, 5, 5, 0}, // LESS-THAN ABOVE SIMILAR OR EQUAL
986 { 0x2A8E, Infix, 5, 5, 0}, // GREATER-THAN ABOVE SIMILAR OR EQUAL
987 { 0x2A8F, Infix, 5, 5, 0}, // LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
988 { 0x2A90, Infix, 5, 5, 0}, // GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
989 { 0x2A91, Infix, 5, 5, 0}, // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
990 { 0x2A92, Infix, 5, 5, 0}, // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
991 { 0x2A93, Infix, 5, 5, 0}, // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
992 { 0x2A94, Infix, 5, 5, 0}, // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
993 { 0x2A95, Infix, 5, 5, 0}, // SLANTED EQUAL TO OR LESS-THAN
994 { 0x2A96, Infix, 5, 5, 0}, // SLANTED EQUAL TO OR GREATER-THAN
995 { 0x2A97, Infix, 5, 5, 0}, // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
996 { 0x2A98, Infix, 5, 5, 0}, // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
997 { 0x2A99, Infix, 5, 5, 0}, // DOUBLE-LINE EQUAL TO OR LESS-THAN
998 { 0x2A9A, Infix, 5, 5, 0}, // DOUBLE-LINE EQUAL TO OR GREATER-THAN
999 { 0x2A9B, Infix, 5, 5, 0}, // DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
1000 { 0x2A9C, Infix, 5, 5, 0}, // DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
1001 { 0x2A9D, Infix, 5, 5, 0}, // SIMILAR OR LESS-THAN
1002 { 0x2A9E, Infix, 5, 5, 0}, // SIMILAR OR GREATER-THAN
1003 { 0x2A9F, Infix, 5, 5, 0}, // SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
1004 { 0x2AA0, Infix, 5, 5, 0}, // SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
1005 { 0x2AA1, Infix, 5, 5, 0}, // DOUBLE NESTED LESS-THAN
1006 { 0x2AA2, Infix, 5, 5, 0}, // DOUBLE NESTED GREATER-THAN
1007 { 0x2AA3, Infix, 5, 5, 0}, // DOUBLE NESTED LESS-THAN WITH UNDERBAR
1008 { 0x2AA4, Infix, 5, 5, 0}, // GREATER-THAN OVERLAPPING LESS-THAN
1009 { 0x2AA5, Infix, 5, 5, 0}, // GREATER-THAN BESIDE LESS-THAN
1010 { 0x2AA6, Infix, 5, 5, 0}, // LESS-THAN CLOSED BY CURVE
1011 { 0x2AA7, Infix, 5, 5, 0}, // GREATER-THAN CLOSED BY CURVE
1012 { 0x2AA8, Infix, 5, 5, 0}, // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
1013 { 0x2AA9, Infix, 5, 5, 0}, // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
1014 { 0x2AAA, Infix, 5, 5, 0}, // SMALLER THAN
1015 { 0x2AAB, Infix, 5, 5, 0}, // LARGER THAN
1016 { 0x2AAC, Infix, 5, 5, 0}, // SMALLER THAN OR EQUAL TO
1017 { 0x2AAD, Infix, 5, 5, 0}, // LARGER THAN OR EQUAL TO
1018 { 0x2AAE, Infix, 5, 5, 0}, // EQUALS SIGN WITH BUMPY ABOVE
1019 { 0x2AAF, Infix, 5, 5, 0}, // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
1020 { 0x2AB0, Infix, 5, 5, 0}, // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
1021 { 0x2AB1, Infix, 5, 5, 0}, // PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
1022 { 0x2AB2, Infix, 5, 5, 0}, // SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
1023 { 0x2AB3, Infix, 5, 5, 0}, // PRECEDES ABOVE EQUALS SIGN
1024 { 0x2AB4, Infix, 5, 5, 0}, // SUCCEEDS ABOVE EQUALS SIGN
1025 { 0x2AB5, Infix, 5, 5, 0}, // PRECEDES ABOVE NOT EQUAL TO
1026 { 0x2AB6, Infix, 5, 5, 0}, // SUCCEEDS ABOVE NOT EQUAL TO
1027 { 0x2AB7, Infix, 5, 5, 0}, // PRECEDES ABOVE ALMOST EQUAL TO
1028 { 0x2AB8, Infix, 5, 5, 0}, // SUCCEEDS ABOVE ALMOST EQUAL TO
1029 { 0x2AB9, Infix, 5, 5, 0}, // PRECEDES ABOVE NOT ALMOST EQUAL TO
1030 { 0x2ABA, Infix, 5, 5, 0}, // SUCCEEDS ABOVE NOT ALMOST EQUAL TO
1031 { 0x2ABB, Infix, 5, 5, 0}, // DOUBLE PRECEDES
1032 { 0x2ABC, Infix, 5, 5, 0}, // DOUBLE SUCCEEDS
1033 { 0x2ABD, Infix, 5, 5, 0}, // SUBSET WITH DOT
1034 { 0x2ABE, Infix, 5, 5, 0}, // SUPERSET WITH DOT
1035 { 0x2ABF, Infix, 5, 5, 0}, // SUBSET WITH PLUS SIGN BELOW
1036 { 0x2AC0, Infix, 5, 5, 0}, // SUPERSET WITH PLUS SIGN BELOW
1037 { 0x2AC1, Infix, 5, 5, 0}, // SUBSET WITH MULTIPLICATION SIGN BELOW
1038 { 0x2AC2, Infix, 5, 5, 0}, // SUPERSET WITH MULTIPLICATION SIGN BELOW
1039 { 0x2AC3, Infix, 5, 5, 0}, // SUBSET OF OR EQUAL TO WITH DOT ABOVE
1040 { 0x2AC4, Infix, 5, 5, 0}, // SUPERSET OF OR EQUAL TO WITH DOT ABOVE
1041 { 0x2AC5, Infix, 5, 5, 0}, // SUBSET OF ABOVE EQUALS SIGN
1042 { 0x2AC6, Infix, 5, 5, 0}, // SUPERSET OF ABOVE EQUALS SIGN
1043 { 0x2AC7, Infix, 5, 5, 0}, // SUBSET OF ABOVE TILDE OPERATOR
1044 { 0x2AC8, Infix, 5, 5, 0}, // SUPERSET OF ABOVE TILDE OPERATOR
1045 { 0x2AC9, Infix, 5, 5, 0}, // SUBSET OF ABOVE ALMOST EQUAL TO
1046 { 0x2ACA, Infix, 5, 5, 0}, // SUPERSET OF ABOVE ALMOST EQUAL TO
1047 { 0x2ACB, Infix, 5, 5, 0}, // SUBSET OF ABOVE NOT EQUAL TO
1048 { 0x2ACC, Infix, 5, 5, 0}, // SUPERSET OF ABOVE NOT EQUAL TO
1049 { 0x2ACD, Infix, 5, 5, 0}, // SQUARE LEFT OPEN BOX OPERATOR
1050 { 0x2ACE, Infix, 5, 5, 0}, // SQUARE RIGHT OPEN BOX OPERATOR
1051 { 0x2ACF, Infix, 5, 5, 0}, // CLOSED SUBSET
1052 { 0x2AD0, Infix, 5, 5, 0}, // CLOSED SUPERSET
1053 { 0x2AD1, Infix, 5, 5, 0}, // CLOSED SUBSET OR EQUAL TO
1054 { 0x2AD2, Infix, 5, 5, 0}, // CLOSED SUPERSET OR EQUAL TO
1055 { 0x2AD3, Infix, 5, 5, 0}, // SUBSET ABOVE SUPERSET
1056 { 0x2AD4, Infix, 5, 5, 0}, // SUPERSET ABOVE SUBSET
1057 { 0x2AD5, Infix, 5, 5, 0}, // SUBSET ABOVE SUBSET
1058 { 0x2AD6, Infix, 5, 5, 0}, // SUPERSET ABOVE SUPERSET
1059 { 0x2AD7, Infix, 5, 5, 0}, // SUPERSET BESIDE SUBSET
1060 { 0x2AD8, Infix, 5, 5, 0}, // SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET
1061 { 0x2AD9, Infix, 5, 5, 0}, // ELEMENT OF OPENING DOWNWARDS
1062 { 0x2ADA, Infix, 5, 5, 0}, // PITCHFORK WITH TEE TOP
1063 { 0x2ADB, Infix, 5, 5, 0}, // TRANSVERSAL INTERSECTION
1064 { 0x2ADD, Infix, 5, 5, 0}, // NONFORKING
1065 { 0x2ADE, Infix, 5, 5, 0}, // SHORT LEFT TACK
1066 { 0x2ADF, Infix, 5, 5, 0}, // SHORT DOWN TACK
1067 { 0x2AE0, Infix, 5, 5, 0}, // SHORT UP TACK
1068 { 0x2AE1, Infix, 5, 5, 0}, // PERPENDICULAR WITH S
1069 { 0x2AE2, Infix, 5, 5, 0}, // VERTICAL BAR TRIPLE RIGHT TURNSTILE
1070 { 0x2AE3, Infix, 5, 5, 0}, // DOUBLE VERTICAL BAR LEFT TURNSTILE
1071 { 0x2AE4, Infix, 5, 5, 0}, // VERTICAL BAR DOUBLE LEFT TURNSTILE
1072 { 0x2AE5, Infix, 5, 5, 0}, // DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
1073 { 0x2AE6, Infix, 5, 5, 0}, // LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
1074 { 0x2AE7, Infix, 5, 5, 0}, // SHORT DOWN TACK WITH OVERBAR
1075 { 0x2AE8, Infix, 5, 5, 0}, // SHORT UP TACK WITH UNDERBAR
1076 { 0x2AE9, Infix, 5, 5, 0}, // SHORT UP TACK ABOVE SHORT DOWN TACK
1077 { 0x2AEA, Infix, 5, 5, 0}, // DOUBLE DOWN TACK
1078 { 0x2AEB, Infix, 5, 5, 0}, // DOUBLE UP TACK
1079 { 0x2AEC, Infix, 5, 5, 0}, // DOUBLE STROKE NOT SIGN
1080 { 0x2AED, Infix, 5, 5, 0}, // REVERSED DOUBLE STROKE NOT SIGN
1081 { 0x2AEE, Infix, 5, 5, 0}, // DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
1082 { 0x2AEF, Infix, 5, 5, 0}, // VERTICAL LINE WITH CIRCLE ABOVE
1083 { 0x2AF0, Infix, 5, 5, 0}, // VERTICAL LINE WITH CIRCLE BELOW
1084 { 0x2AF1, Infix, 5, 5, 0}, // DOWN TACK WITH CIRCLE BELOW
1085 { 0x2AF2, Infix, 5, 5, 0}, // PARALLEL WITH HORIZONTAL STROKE
1086 { 0x2AF3, Infix, 5, 5, 0}, // PARALLEL WITH TILDE OPERATOR
1087 { 0x2AF4, Infix, 4, 4, 0}, // TRIPLE VERTICAL BAR BINARY RELATION
1088 { 0x2AF5, Infix, 4, 4, 0}, // TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE
1089 { 0x2AF6, Infix, 4, 4, 0}, // TRIPLE COLON OPERATOR
1090 { 0x2AF7, Infix, 5, 5, 0}, // TRIPLE NESTED LESS-THAN
1091 { 0x2AF8, Infix, 5, 5, 0}, // TRIPLE NESTED GREATER-THAN
1092 { 0x2AF9, Infix, 5, 5, 0}, // DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
1093 { 0x2AFA, Infix, 5, 5, 0}, // DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
1094 { 0x2AFB, Infix, 4, 4, 0}, // TRIPLE SOLIDUS BINARY RELATION
1095 { 0x2AFC, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // LARGE TRIPLE VERTICAL BAR OPERATOR
1096 { 0x2AFD, Infix, 4, 4, 0}, // DOUBLE SOLIDUS OPERATOR
1097 { 0x2AFE, Infix, 3, 3, 0}, // WHITE VERTICAL BAR
1098 { 0x2AFF, Prefix, 1, 2, Symmetric | LargeOp | MovableLimits}, // N-ARY WHITE VERTICAL BAR
1099 { 0x2B45, Infix, 5, 5, Stretchy}, // LEFTWARDS QUADRUPLE ARROW
1100 { 0x2B46, Infix, 5, 5, Stretchy}, // RIGHTWARDS QUADRUPLE ARROW
1101 { 0x1EEF0, Prefix, 0, 0, Stretchy }, // ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL
1102 { 0x1EEF1, Prefix, 0, 0, Stretchy } // ARABIC MATHEMATICAL OPERATOR HAH WITH DAL
1103};
1104
1105// A list of operators that stretch in the horizontal direction. This has been generated from Mozilla's MathML operator dictionary.
1106static inline UChar32 ExtractKeyHorizontal(const UChar32* entry) { return *entry; }
1107static const UChar32 horizontalOperators[] = {
1108 0x003D, 0x005E, 0x005F, 0x007E, 0x00AF, 0x02C6, 0x02C7, 0x02C9, 0x02CD, 0x02DC, 0x02F7, 0x0302, 0x0332, 0x203E, 0x20D0, 0x20D1, 0x20D6, 0x20D7, 0x20E1, 0x2190, 0x2192, 0x2194, 0x2198, 0x2199, 0x219C, 0x219D, 0x219E, 0x21A0, 0x21A2, 0x21A3, 0x21A4, 0x21A6, 0x21A9, 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21B4, 0x21B9, 0x21BC, 0x21BD, 0x21C0, 0x21C1, 0x21C4, 0x21C6, 0x21C7, 0x21C9, 0x21CB, 0x21CC, 0x21D0, 0x21D2, 0x21D4, 0x21DA, 0x21DB, 0x21DC, 0x21DD, 0x21E0, 0x21E2, 0x21E4, 0x21E5, 0x21E6, 0x21E8, 0x21F0, 0x21F6, 0x21FD, 0x21FE, 0x21FF, 0x23B4, 0x23B5, 0x23DC, 0x23DD, 0x23DE, 0x23DF, 0x23E0, 0x23E1, 0x2500, 0x27F5, 0x27F6, 0x27F7, 0x27F8, 0x27F9, 0x27FA, 0x27FB, 0x27FC, 0x27FD, 0x27FE, 0x27FF, 0x290C, 0x290D, 0x290E, 0x290F, 0x2910, 0x294E, 0x2950, 0x2952, 0x2953, 0x2956, 0x2957, 0x295A, 0x295B, 0x295E, 0x295F, 0x2B45, 0x2B46, 0xFE35, 0xFE36, 0xFE37, 0xFE38, 0x1EEF0, 0x1EEF1
1109};
1110
1111Optional<Property> MathMLOperatorDictionary::search(UChar32 character, Form form, bool explicitForm)
1112{
1113 if (!character)
1114 return WTF::nullopt;
1115
1116 // We try and find the default values from the operator dictionary.
1117 if (auto* entry = tryBinarySearch<const Entry, Key>(dictionary, dictionarySize, Key(character, form), ExtractKey))
1118 return ExtractProperty(*entry);
1119
1120 if (explicitForm)
1121 return WTF::nullopt;
1122
1123 // If we did not find the desired operator form and if it was not set explicitely, we use the first one in the following order: Infix, Prefix, Postfix.
1124 // This is to handle bad MathML markup without explicit <mrow> delimiters like "<mo>(</mo><mi>a</mi><mo>)</mo><mo>(</mo><mi>b</mi><mo>)</mo>" where innerfences should not be considered infix.
1125 if (auto* entry = tryBinarySearch<const Entry, UChar32>(dictionary, dictionarySize, character, ExtractChar)) {
1126 // There are at most two other entries before the one found.
1127 if (entry != dictionary && (entry - 1)->character == character)
1128 entry--;
1129 if (entry != dictionary && (entry - 1)->character == character)
1130 entry--;
1131 return ExtractProperty(*entry);
1132 }
1133
1134 return WTF::nullopt;
1135}
1136
1137bool MathMLOperatorDictionary::isVertical(UChar32 textContent)
1138{
1139 return !tryBinarySearch<const UChar32, UChar32>(horizontalOperators, WTF_ARRAY_LENGTH(horizontalOperators), textContent, ExtractKeyHorizontal);
1140}
1141
1142}
1143
1144#endif // ENABLE(MATHML)
1145