unicode.ml (71191B)
1 (* Unison file synchronizer: src/unicode.ml *) 2 (* Copyright 1999-2020, Benjamin C. Pierce 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation, either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. 16 *) 17 18 open Unicode_tables 19 20 exception Invalid 21 22 let fail () = raise Invalid 23 24 let get s i = Char.code (Bytes.unsafe_get s i) 25 let set s i v = Bytes.unsafe_set s i (Char.unsafe_chr v) 26 27 let string_get s i = Char.code (String.unsafe_get s i) 28 29 (****) 30 31 let rec decode_char s i l = 32 if i = l then fail () else 33 let c = get s i in 34 if c < 0x80 then 35 cont s (i + 1) l c 36 else if c < 0xE0 then begin 37 (* 80 - 7FF *) 38 if c < 0xc2 || i + 1 >= l then fail () else 39 let c1 = get s (i + 1) in 40 if c1 land 0xc0 <> 0x80 then fail () else 41 let v = c lsl 6 + c1 - 0x3080 in 42 cont s (i + 2) l v 43 end else if c < 0xF0 then begin 44 (* 800 - FFFF *) 45 if i + 2 >= l then fail () else 46 let c1 = get s (i + 1) in 47 let c2 = get s (i + 2) in 48 if (c1 lor c2) land 0xc0 <> 0x80 then fail () else 49 let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in 50 if v < 0x800 then fail () else 51 cont s (i + 3) l v 52 end else begin 53 (* 10000 - 10FFFF *) 54 if i + 3 >= l then fail () else 55 let c1 = get s (i + 1) in 56 let c2 = get s (i + 2) in 57 let c3 = get s (i + 3) in 58 if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then fail () else 59 let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in 60 if v < 0x10000 || v > 0x10ffff then fail () else 61 cont s (i + 4) l v 62 end 63 64 and cont s i l v = (v, i) 65 66 let encode_char s i l c = 67 if c < 0x80 then begin 68 if i >= l then fail () else begin 69 set s i c; 70 i + 1 71 end 72 end else if c < 0x800 then begin 73 if i + 1 >= l then fail () else begin 74 set s i (c lsr 6 + 0xC0); 75 set s (i + 1) (c land 0x3f + 0x80); 76 i + 2 77 end 78 end else if c < 0x10000 then begin 79 if i + 1 >= l then fail () else begin 80 set s i (c lsr 12 + 0xE0); 81 set s (i + 1) ((c lsr 6) land 0x3f + 0x80); 82 set s (i + 2) (c land 0x3f + 0x80); 83 i + 3 84 end 85 end else begin 86 if i + 1 >= l then fail () else begin 87 set s i (c lsr 18 + 0xF0); 88 set s (i + 1) ((c lsr 12) land 0x3f + 0x80); 89 set s (i + 2) ((c lsr 6) land 0x3f + 0x80); 90 set s (i + 3) (c land 0x3f + 0x80); 91 i + 4 92 end 93 end 94 95 let rec prev_char s i = 96 let i = i - 1 in 97 if i < 0 then fail () else 98 if (get s i) land 0xc0 <> 0x80 then i else prev_char s i 99 100 (****) 101 102 let combining_property_bitmap = "\ 103 \x00\x00\x00\x01\x02\x03\x04\x05\ 104 \x00\x06\x07\x08\x09\x0A\x0B\x0C\ 105 \x0D\x00\x00\x00\x00\x00\x00\x0E\ 106 \x0F\x10\x00\x00\x00\x00\x00\x00\ 107 \x11\x00\x00\x00\x00\x00\x00\x00\ 108 \x00\x00\x00\x00\x00\x00\x00\x00\ 109 \x12\x00\x00\x00\x00\x00\x00\x00\ 110 \x00\x00\x00\x00\x00\x00\x00\x00\ 111 \x00\x00\x00\x00\x00\x00\x00\x00\ 112 \x00\x00\x00\x00\x00\x00\x00\x00\ 113 \x00\x00\x00\x00\x00\x00\x00\x00\ 114 \x00\x00\x00\x00\x00\x00\x00\x00\ 115 \x00\x00\x00\x00\x00\x00\x00\x00\ 116 \x00\x00\x00\x00\x00\x00\x00\x00\ 117 \x00\x00\x00\x00\x00\x00\x00\x00\ 118 \x00\x00\x00\x00\x00\x00\x00\x00\ 119 \x00\x00\x00\x00\x00\x00\x00\x00\ 120 \x00\x00\x00\x00\x00\x00\x00\x00\ 121 \x00\x00\x00\x00\x00\x00\x00\x00\ 122 \x00\x00\x00\x00\x00\x00\x00\x00\ 123 \x00\x00\x00\x00\x00\x00\x00\x00\ 124 \x00\x00\x00\x00\x00\x00\x00\x00\ 125 \x00\x00\x00\x00\x00\x00\x00\x00\ 126 \x00\x00\x00\x00\x00\x00\x00\x00\ 127 \x00\x00\x00\x00\x00\x00\x00\x00\ 128 \x00\x00\x00\x00\x00\x00\x00\x00\ 129 \x00\x00\x00\x00\x00\x00\x00\x00\ 130 \x00\x00\x00\x00\x00\x00\x00\x00\ 131 \x00\x00\x00\x00\x00\x00\x00\x00\ 132 \x00\x00\x00\x00\x00\x00\x00\x00\ 133 \x00\x00\x00\x00\x00\x00\x00\x00\ 134 \x00\x00\x00\x13\x00\x00\x14\x00\ 135 \xE6\xE6\xE6\xE6\xE6\xE6\xE6\xE6\ 136 \xE6\xE6\xE6\xE6\xE6\xE6\xE6\xE6\ 137 \xE6\xE6\xE6\xE6\xE6\xE8\xDC\xDC\ 138 \xDC\xDC\xE8\xD8\xDC\xDC\xDC\xDC\ 139 \xDC\xCA\xCA\xDC\xDC\xDC\xDC\xCA\ 140 \xCA\xDC\xDC\xDC\xDC\xDC\xDC\xDC\ 141 \xDC\xDC\xDC\xDC\x01\x01\x01\x01\ 142 \x01\xDC\xDC\xDC\xDC\xE6\xE6\xE6\ 143 \xE6\xE6\xE6\xE6\xE6\xF0\xE6\xDC\ 144 \xDC\xDC\xE6\xE6\xE6\xDC\xDC\x00\ 145 \xE6\xE6\xE6\xDC\xDC\xDC\xDC\xE6\ 146 \x00\x00\x00\x00\x00\xEA\xEA\xE9\ 147 \xEA\xEA\xE9\xE6\xE6\xE6\xE6\xE6\ 148 \xE6\xE6\xE6\xE6\xE6\xE6\xE6\xE6\ 149 \x00\x00\x00\x00\x00\x00\x00\x00\ 150 \x00\x00\x00\x00\x00\x00\x00\x00\ 151 \x00\x00\x00\x00\x00\x00\x00\x00\ 152 \x00\x00\x00\x00\x00\x00\x00\x00\ 153 \x00\x00\x00\x00\x00\x00\x00\x00\ 154 \x00\x00\x00\x00\x00\x00\x00\x00\ 155 \x00\x00\x00\x00\x00\x00\x00\x00\ 156 \x00\x00\x00\x00\x00\x00\x00\x00\ 157 \x00\x00\x00\x00\x00\x00\x00\x00\ 158 \x00\x00\x00\x00\x00\x00\x00\x00\ 159 \x00\x00\x00\x00\x00\x00\x00\x00\ 160 \x00\x00\x00\x00\x00\x00\x00\x00\ 161 \x00\x00\x00\x00\x00\x00\x00\x00\ 162 \x00\x00\x00\x00\x00\x00\x00\x00\ 163 \x00\x00\x00\x00\x00\x00\x00\x00\ 164 \x00\x00\x00\x00\x00\x00\x00\x00\ 165 \x00\x00\x00\x00\x00\x00\x00\x00\ 166 \x00\x00\x00\x00\x00\x00\x00\x00\ 167 \x00\x00\x00\x00\x00\x00\x00\x00\ 168 \x00\x00\x00\x00\x00\x00\x00\x00\ 169 \x00\x00\x00\x00\x00\x00\x00\x00\ 170 \x00\x00\x00\x00\x00\x00\x00\x00\ 171 \x00\x00\x00\x00\x00\x00\x00\x00\ 172 \x00\x00\x00\x00\x00\x00\x00\x00\ 173 \x00\x00\x00\x00\x00\x00\x00\x00\ 174 \x00\x00\x00\x00\x00\x00\x00\x00\ 175 \x00\x00\x00\x00\x00\x00\x00\x00\ 176 \x00\x00\x00\x00\x00\x00\x00\x00\ 177 \x00\x00\x00\x00\x00\x00\x00\x00\ 178 \x00\x00\x00\x00\x00\x00\x00\x00\ 179 \x00\x00\x00\x00\x00\x00\x00\x00\ 180 \x00\x00\x00\x00\x00\x00\x00\x00\ 181 \x00\x00\x00\x00\x00\x00\x00\x00\ 182 \x00\x00\x00\x00\x00\x00\x00\x00\ 183 \x00\x00\x00\xE6\xE6\xE6\xE6\x00\ 184 \x00\x00\x00\x00\x00\x00\x00\x00\ 185 \x00\x00\x00\x00\x00\x00\x00\x00\ 186 \x00\x00\x00\x00\x00\x00\x00\x00\ 187 \x00\x00\x00\x00\x00\x00\x00\x00\ 188 \x00\x00\x00\x00\x00\x00\x00\x00\ 189 \x00\x00\x00\x00\x00\x00\x00\x00\ 190 \x00\x00\x00\x00\x00\x00\x00\x00\ 191 \x00\x00\x00\x00\x00\x00\x00\x00\ 192 \x00\x00\x00\x00\x00\x00\x00\x00\ 193 \x00\x00\x00\x00\x00\x00\x00\x00\ 194 \x00\x00\x00\x00\x00\x00\x00\x00\ 195 \x00\x00\x00\x00\x00\x00\x00\x00\ 196 \x00\x00\x00\x00\x00\x00\x00\x00\ 197 \x00\x00\x00\x00\x00\x00\x00\x00\ 198 \x00\x00\x00\x00\x00\x00\x00\x00\ 199 \x00\x00\x00\x00\x00\x00\x00\x00\ 200 \x00\x00\x00\x00\x00\x00\x00\x00\ 201 \x00\x00\x00\x00\x00\x00\x00\x00\ 202 \x00\x00\x00\x00\x00\x00\x00\x00\ 203 \x00\x00\x00\x00\x00\x00\x00\x00\ 204 \x00\x00\x00\x00\x00\x00\x00\x00\ 205 \x00\x00\x00\x00\x00\x00\x00\x00\ 206 \x00\x00\x00\x00\x00\x00\x00\x00\ 207 \x00\x00\x00\x00\x00\x00\x00\x00\ 208 \x00\x00\x00\x00\x00\x00\x00\x00\ 209 \x00\x00\x00\x00\x00\x00\x00\x00\ 210 \x00\x00\x00\x00\x00\x00\x00\x00\ 211 \x00\x00\x00\x00\x00\x00\x00\x00\ 212 \x00\x00\x00\x00\x00\x00\x00\x00\ 213 \x00\x00\x00\x00\x00\x00\x00\x00\ 214 \x00\x00\x00\x00\x00\x00\x00\x00\ 215 \x00\x00\x00\x00\x00\x00\x00\x00\ 216 \x00\x00\x00\x00\x00\x00\x00\x00\ 217 \x00\xDC\xE6\xE6\xE6\xE6\xDC\xE6\ 218 \xE6\xE6\xDE\xDC\xE6\xE6\xE6\xE6\ 219 \xE6\xE6\x00\xDC\xDC\xDC\xDC\xDC\ 220 \xE6\xE6\xDC\xE6\xE6\xDE\xE4\xE6\ 221 \x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\ 222 \x12\x13\x00\x14\x15\x16\x00\x17\ 223 \x00\x18\x19\x00\xE6\x00\x00\x00\ 224 \x00\x00\x00\x00\x00\x00\x00\x00\ 225 \x00\x00\x00\x00\x00\x00\x00\x00\ 226 \x00\x00\x00\x00\x00\x00\x00\x00\ 227 \x00\x00\x00\x00\x00\x00\x00\x00\ 228 \x00\x00\x00\x00\x00\x00\x00\x00\ 229 \x00\x00\x00\x00\x00\x00\x00\x00\ 230 \x00\x00\x00\x00\x00\x00\x00\x00\ 231 \x00\x00\x00\x00\x00\x00\x00\x00\ 232 \x00\x00\x00\x00\x00\x00\x00\x00\ 233 \xE6\xE6\xE6\xE6\xE6\xE6\x00\x00\ 234 \x00\x00\x00\x00\x00\x00\x00\x00\ 235 \x00\x00\x00\x00\x00\x00\x00\x00\ 236 \x00\x00\x00\x00\x00\x00\x00\x00\ 237 \x00\x00\x00\x00\x00\x00\x00\x00\ 238 \x00\x00\x00\x00\x00\x00\x00\x00\ 239 \x00\x00\x00\x00\x00\x00\x00\x00\ 240 \x00\x00\x00\x1B\x1C\x1D\x1E\x1F\ 241 \x20\x21\x22\xE6\xE6\xDC\xDC\xE6\ 242 \xE6\x00\x00\x00\x00\x00\x00\x00\ 243 \x00\x00\x00\x00\x00\x00\x00\x00\ 244 \x00\x00\x00\x00\x00\x00\x00\x00\ 245 \x23\x00\x00\x00\x00\x00\x00\x00\ 246 \x00\x00\x00\x00\x00\x00\x00\x00\ 247 \x00\x00\x00\x00\x00\x00\x00\x00\ 248 \x00\x00\x00\x00\x00\x00\x00\x00\ 249 \x00\x00\x00\x00\x00\x00\x00\x00\ 250 \x00\x00\x00\x00\x00\x00\x00\x00\ 251 \x00\x00\x00\x00\x00\x00\x00\x00\ 252 \x00\x00\x00\x00\x00\x00\x00\x00\ 253 \x00\x00\x00\x00\x00\x00\x00\x00\ 254 \x00\x00\x00\x00\x00\x00\x00\x00\ 255 \x00\x00\x00\x00\x00\x00\x00\x00\ 256 \x00\x00\x00\x00\x00\x00\x00\x00\ 257 \x00\x00\x00\x00\x00\x00\xE6\xE6\ 258 \xE6\xE6\xE6\xE6\xE6\x00\x00\xE6\ 259 \xE6\xE6\xE6\xDC\xE6\x00\x00\xE6\ 260 \xE6\x00\xDC\xE6\xE6\xDC\x00\x00\ 261 \x00\x00\x00\x00\x00\x00\x00\x00\ 262 \x00\x00\x00\x00\x00\x00\x00\x00\ 263 \x00\x00\x00\x00\x00\x00\x00\x00\ 264 \x00\x00\x00\x00\x00\x00\x00\x00\ 265 \x00\x24\x00\x00\x00\x00\x00\x00\ 266 \x00\x00\x00\x00\x00\x00\x00\x00\ 267 \x00\x00\x00\x00\x00\x00\x00\x00\ 268 \x00\x00\x00\x00\x00\x00\x00\x00\ 269 \xE6\xDC\xE6\xE6\xDC\xE6\xE6\xDC\ 270 \xDC\xDC\xE6\xDC\xDC\xE6\xDC\xE6\ 271 \xE6\xE6\xDC\xE6\xDC\xE6\xDC\xE6\ 272 \xDC\xE6\xE6\x00\x00\x00\x00\x00\ 273 \x00\x00\x00\x00\x00\x00\x00\x00\ 274 \x00\x00\x00\x00\x00\x00\x00\x00\ 275 \x00\x00\x00\x00\x00\x00\x00\x00\ 276 \x00\x00\x00\x00\x00\x00\x00\x00\ 277 \x00\x00\x00\x00\x00\x00\x00\x00\ 278 \x00\x00\x00\x00\x00\x00\x00\x00\ 279 \x00\x00\x00\x00\x00\x00\x00\x00\ 280 \x00\x00\x00\x00\x00\x00\x00\x00\ 281 \x00\x00\x00\x00\x00\x00\x00\x00\ 282 \x00\x00\x00\x00\x00\x00\x00\x00\ 283 \x00\x00\x00\x00\x00\x00\x00\x00\ 284 \x00\x00\x00\x00\x00\x00\x00\x00\ 285 \x00\x00\x00\x00\x00\x00\x00\x00\ 286 \x00\x00\x00\x00\x00\x00\x00\x00\ 287 \x00\x00\x00\x00\x00\x00\x00\x00\ 288 \x00\x00\x00\x00\x00\x00\x00\x00\ 289 \x00\x00\x00\x00\x00\x00\x00\x00\ 290 \x00\x00\x00\x00\x00\x00\x00\x00\ 291 \x00\x00\x00\x00\x00\x00\x00\x00\ 292 \x00\x00\x00\x00\x00\x00\x00\x00\ 293 \x00\x00\x00\x00\x00\x00\x00\x00\ 294 \x00\x00\x00\x00\x00\x00\x00\x00\ 295 \x00\x00\x00\x00\x00\x00\x00\x00\ 296 \x00\x00\x00\x00\x00\x00\x00\x00\ 297 \x00\x00\x00\x00\x00\x00\x00\x00\ 298 \x00\x00\x00\x00\x00\x00\x00\x00\ 299 \x00\x00\x00\x00\x00\x00\x00\x00\ 300 \x00\x00\x00\x00\x00\x00\x00\x00\ 301 \x00\x00\x00\x00\x00\x00\x00\x00\ 302 \x00\x00\x00\x00\x07\x00\x00\x00\ 303 \x00\x00\x00\x00\x00\x00\x00\x00\ 304 \x00\x00\x00\x00\x00\x09\x00\x00\ 305 \x00\xE6\xDC\xE6\xE6\x00\x00\x00\ 306 \x00\x00\x00\x00\x00\x00\x00\x00\ 307 \x00\x00\x00\x00\x00\x00\x00\x00\ 308 \x00\x00\x00\x00\x00\x00\x00\x00\ 309 \x00\x00\x00\x00\x00\x00\x00\x00\ 310 \x00\x00\x00\x00\x00\x00\x00\x00\ 311 \x00\x00\x00\x00\x00\x00\x00\x00\ 312 \x00\x00\x00\x00\x00\x00\x00\x00\ 313 \x00\x00\x00\x00\x00\x00\x00\x00\ 314 \x00\x00\x00\x00\x00\x00\x00\x00\ 315 \x00\x00\x00\x00\x00\x00\x00\x00\ 316 \x00\x00\x00\x00\x00\x00\x00\x00\ 317 \x00\x00\x00\x00\x00\x00\x00\x00\ 318 \x00\x00\x00\x00\x07\x00\x00\x00\ 319 \x00\x00\x00\x00\x00\x00\x00\x00\ 320 \x00\x00\x00\x00\x00\x09\x00\x00\ 321 \x00\x00\x00\x00\x00\x00\x00\x00\ 322 \x00\x00\x00\x00\x00\x00\x00\x00\ 323 \x00\x00\x00\x00\x00\x00\x00\x00\ 324 \x00\x00\x00\x00\x00\x00\x00\x00\ 325 \x00\x00\x00\x00\x00\x00\x00\x00\ 326 \x00\x00\x00\x00\x00\x00\x00\x00\ 327 \x00\x00\x00\x00\x00\x00\x00\x00\ 328 \x00\x00\x00\x00\x00\x00\x00\x00\ 329 \x00\x00\x00\x00\x00\x00\x00\x00\ 330 \x00\x00\x00\x00\x00\x00\x00\x00\ 331 \x00\x00\x00\x00\x00\x00\x00\x00\ 332 \x00\x00\x00\x00\x00\x00\x00\x00\ 333 \x00\x00\x00\x00\x00\x00\x00\x00\ 334 \x00\x00\x00\x00\x07\x00\x00\x00\ 335 \x00\x00\x00\x00\x00\x00\x00\x00\ 336 \x00\x00\x00\x00\x00\x09\x00\x00\ 337 \x00\x00\x00\x00\x00\x00\x00\x00\ 338 \x00\x00\x00\x00\x00\x00\x00\x00\ 339 \x00\x00\x00\x00\x00\x00\x00\x00\ 340 \x00\x00\x00\x00\x00\x00\x00\x00\ 341 \x00\x00\x00\x00\x00\x00\x00\x00\ 342 \x00\x00\x00\x00\x00\x00\x00\x00\ 343 \x00\x00\x00\x00\x00\x00\x00\x00\ 344 \x00\x00\x00\x00\x00\x00\x00\x00\ 345 \x00\x00\x00\x00\x00\x00\x00\x00\ 346 \x00\x00\x00\x00\x00\x00\x00\x00\ 347 \x00\x00\x00\x00\x00\x00\x00\x00\ 348 \x00\x00\x00\x00\x00\x00\x00\x00\ 349 \x00\x00\x00\x00\x00\x00\x00\x00\ 350 \x00\x00\x00\x00\x07\x00\x00\x00\ 351 \x00\x00\x00\x00\x00\x00\x00\x00\ 352 \x00\x00\x00\x00\x00\x09\x00\x00\ 353 \x00\x00\x00\x00\x00\x00\x00\x00\ 354 \x00\x00\x00\x00\x00\x00\x00\x00\ 355 \x00\x00\x00\x00\x00\x00\x00\x00\ 356 \x00\x00\x00\x00\x00\x00\x00\x00\ 357 \x00\x00\x00\x00\x00\x00\x00\x00\ 358 \x00\x00\x00\x00\x00\x00\x00\x00\ 359 \x00\x00\x00\x00\x00\x00\x00\x00\ 360 \x00\x00\x00\x00\x00\x00\x00\x00\ 361 \x00\x00\x00\x00\x00\x00\x00\x00\ 362 \x00\x00\x00\x00\x00\x00\x00\x00\ 363 \x00\x00\x00\x00\x00\x00\x00\x00\ 364 \x00\x00\x00\x00\x00\x00\x00\x00\ 365 \x00\x00\x00\x00\x00\x00\x00\x00\ 366 \x00\x00\x00\x00\x07\x00\x00\x00\ 367 \x00\x00\x00\x00\x00\x00\x00\x00\ 368 \x00\x00\x00\x00\x00\x09\x00\x00\ 369 \x00\x00\x00\x00\x00\x00\x00\x00\ 370 \x00\x00\x00\x00\x00\x00\x00\x00\ 371 \x00\x00\x00\x00\x00\x00\x00\x00\ 372 \x00\x00\x00\x00\x00\x00\x00\x00\ 373 \x00\x00\x00\x00\x00\x00\x00\x00\ 374 \x00\x00\x00\x00\x00\x00\x00\x00\ 375 \x00\x00\x00\x00\x00\x00\x00\x00\ 376 \x00\x00\x00\x00\x00\x00\x00\x00\ 377 \x00\x00\x00\x00\x00\x00\x00\x00\ 378 \x00\x00\x00\x00\x00\x00\x00\x00\ 379 \x00\x00\x00\x00\x00\x00\x00\x00\ 380 \x00\x00\x00\x00\x00\x00\x00\x00\ 381 \x00\x00\x00\x00\x00\x00\x00\x00\ 382 \x00\x00\x00\x00\x00\x00\x00\x00\ 383 \x00\x00\x00\x00\x00\x00\x00\x00\ 384 \x00\x00\x00\x00\x00\x09\x00\x00\ 385 \x00\x00\x00\x00\x00\x00\x00\x00\ 386 \x00\x00\x00\x00\x00\x00\x00\x00\ 387 \x00\x00\x00\x00\x00\x00\x00\x00\ 388 \x00\x00\x00\x00\x00\x00\x00\x00\ 389 \x00\x00\x00\x00\x00\x00\x00\x00\ 390 \x00\x00\x00\x00\x00\x00\x00\x00\ 391 \x00\x00\x00\x00\x00\x00\x00\x00\ 392 \x00\x00\x00\x00\x00\x00\x00\x00\ 393 \x00\x00\x00\x00\x00\x00\x00\x00\ 394 \x00\x00\x00\x00\x00\x00\x00\x00\ 395 \x00\x00\x00\x00\x00\x00\x00\x00\ 396 \x00\x00\x00\x00\x00\x00\x00\x00\ 397 \x00\x00\x00\x00\x00\x00\x00\x00\ 398 \x00\x00\x00\x00\x00\x00\x00\x00\ 399 \x00\x00\x00\x00\x00\x00\x00\x00\ 400 \x00\x00\x00\x00\x00\x09\x00\x00\ 401 \x00\x00\x00\x00\x00\x54\x5B\x00\ 402 \x00\x00\x00\x00\x00\x00\x00\x00\ 403 \x00\x00\x00\x00\x00\x00\x00\x00\ 404 \x00\x00\x00\x00\x00\x00\x00\x00\ 405 \x00\x00\x00\x00\x00\x00\x00\x00\ 406 \x00\x00\x00\x00\x00\x00\x00\x00\ 407 \x00\x00\x00\x00\x00\x00\x00\x00\ 408 \x00\x00\x00\x00\x00\x00\x00\x00\ 409 \x00\x00\x00\x00\x00\x00\x00\x00\ 410 \x00\x00\x00\x00\x00\x00\x00\x00\ 411 \x00\x00\x00\x00\x00\x00\x00\x00\ 412 \x00\x00\x00\x00\x00\x00\x00\x00\ 413 \x00\x00\x00\x00\x00\x00\x00\x00\ 414 \x00\x00\x00\x00\x07\x00\x00\x00\ 415 \x00\x00\x00\x00\x00\x00\x00\x00\ 416 \x00\x00\x00\x00\x00\x09\x00\x00\ 417 \x00\x00\x00\x00\x00\x00\x00\x00\ 418 \x00\x00\x00\x00\x00\x00\x00\x00\ 419 \x00\x00\x00\x00\x00\x00\x00\x00\ 420 \x00\x00\x00\x00\x00\x00\x00\x00\ 421 \x00\x00\x00\x00\x00\x00\x00\x00\ 422 \x00\x00\x00\x00\x00\x00\x00\x00\ 423 \x00\x00\x00\x00\x00\x00\x00\x00\ 424 \x00\x00\x00\x00\x00\x00\x00\x00\ 425 \x00\x00\x00\x00\x00\x00\x00\x00\ 426 \x00\x00\x00\x00\x00\x00\x00\x00\ 427 \x00\x00\x00\x00\x00\x00\x00\x00\ 428 \x00\x00\x00\x00\x00\x00\x00\x00\ 429 \x00\x00\x00\x00\x00\x00\x00\x00\ 430 \x00\x00\x00\x00\x00\x00\x00\x00\ 431 \x00\x00\x00\x00\x00\x00\x00\x00\ 432 \x00\x00\x00\x00\x00\x09\x00\x00\ 433 \x00\x00\x00\x00\x00\x00\x00\x00\ 434 \x00\x00\x00\x00\x00\x00\x00\x00\ 435 \x00\x00\x00\x00\x00\x00\x00\x00\ 436 \x00\x00\x00\x00\x00\x00\x00\x00\ 437 \x00\x00\x00\x00\x00\x00\x00\x00\ 438 \x00\x00\x00\x00\x00\x00\x00\x00\ 439 \x00\x00\x00\x00\x00\x00\x00\x00\ 440 \x00\x00\x00\x00\x00\x00\x00\x00\ 441 \x00\x00\x00\x00\x00\x00\x00\x00\ 442 \x00\x00\x00\x00\x00\x00\x00\x00\ 443 \x00\x00\x00\x00\x00\x00\x00\x00\ 444 \x00\x00\x00\x00\x00\x00\x00\x00\ 445 \x00\x00\x00\x00\x00\x00\x00\x00\ 446 \x00\x00\x00\x00\x00\x00\x00\x00\ 447 \x00\x00\x00\x00\x00\x00\x00\x00\ 448 \x00\x00\x09\x00\x00\x00\x00\x00\ 449 \x00\x00\x00\x00\x00\x00\x00\x00\ 450 \x00\x00\x00\x00\x00\x00\x00\x00\ 451 \x00\x00\x00\x00\x00\x00\x00\x00\ 452 \x00\x00\x00\x00\x00\x00\x00\x00\ 453 \x00\x00\x00\x00\x00\x00\x00\x00\ 454 \x00\x00\x00\x00\x00\x00\x00\x00\ 455 \x00\x00\x00\x00\x00\x00\x00\x00\ 456 \x00\x00\x00\x00\x00\x00\x00\x00\ 457 \x00\x00\x00\x00\x00\x00\x00\x00\ 458 \x00\x00\x00\x00\x00\x00\x00\x00\ 459 \x00\x00\x00\x00\x00\x00\x00\x00\ 460 \x00\x00\x00\x00\x00\x00\x00\x00\ 461 \x00\x00\x00\x00\x00\x00\x00\x00\ 462 \x67\x67\x09\x00\x00\x00\x00\x00\ 463 \x00\x00\x00\x00\x00\x00\x00\x00\ 464 \x6B\x6B\x6B\x6B\x00\x00\x00\x00\ 465 \x00\x00\x00\x00\x00\x00\x00\x00\ 466 \x00\x00\x00\x00\x00\x00\x00\x00\ 467 \x00\x00\x00\x00\x00\x00\x00\x00\ 468 \x00\x00\x00\x00\x00\x00\x00\x00\ 469 \x00\x00\x00\x00\x00\x00\x00\x00\ 470 \x00\x00\x00\x00\x00\x00\x00\x00\ 471 \x00\x00\x00\x00\x00\x00\x00\x00\ 472 \x00\x00\x00\x00\x00\x00\x00\x00\ 473 \x00\x00\x00\x00\x00\x00\x00\x00\ 474 \x00\x00\x00\x00\x00\x00\x00\x00\ 475 \x00\x00\x00\x00\x00\x00\x00\x00\ 476 \x00\x00\x00\x00\x00\x00\x00\x00\ 477 \x00\x00\x00\x00\x00\x00\x00\x00\ 478 \x76\x76\x00\x00\x00\x00\x00\x00\ 479 \x00\x00\x00\x00\x00\x00\x00\x00\ 480 \x7A\x7A\x7A\x7A\x00\x00\x00\x00\ 481 \x00\x00\x00\x00\x00\x00\x00\x00\ 482 \x00\x00\x00\x00\x00\x00\x00\x00\ 483 \x00\x00\x00\x00\x00\x00\x00\x00\ 484 \x00\x00\x00\x00\x00\x00\x00\x00\ 485 \x00\x00\x00\x00\x00\x00\x00\x00\ 486 \x00\x00\x00\x00\x00\x00\x00\x00\ 487 \x00\x00\x00\x00\x00\x00\x00\x00\ 488 \x00\x00\x00\x00\x00\x00\x00\x00\ 489 \x00\x00\x00\x00\x00\x00\x00\x00\ 490 \xDC\xDC\x00\x00\x00\x00\x00\x00\ 491 \x00\x00\x00\x00\x00\x00\x00\x00\ 492 \x00\x00\x00\x00\x00\x00\x00\x00\ 493 \x00\x00\x00\x00\x00\xDC\x00\xDC\ 494 \x00\xD8\x00\x00\x00\x00\x00\x00\ 495 \x00\x00\x00\x00\x00\x00\x00\x00\ 496 \x00\x00\x00\x00\x00\x00\x00\x00\ 497 \x00\x00\x00\x00\x00\x00\x00\x00\ 498 \x00\x00\x00\x00\x00\x00\x00\x00\ 499 \x00\x00\x00\x00\x00\x00\x00\x00\ 500 \x00\x00\x00\x00\x00\x00\x00\x00\ 501 \x00\x81\x82\x00\x84\x00\x00\x00\ 502 \x00\x00\x82\x82\x82\x82\x00\x00\ 503 \x82\x00\xE6\xE6\x09\x00\xE6\xE6\ 504 \x00\x00\x00\x00\x00\x00\x00\x00\ 505 \x00\x00\x00\x00\x00\x00\x00\x00\ 506 \x00\x00\x00\x00\x00\x00\x00\x00\ 507 \x00\x00\x00\x00\x00\x00\x00\x00\ 508 \x00\x00\x00\x00\x00\x00\x00\x00\ 509 \x00\x00\x00\x00\x00\x00\x00\x00\ 510 \x00\x00\x00\x00\x00\x00\x00\x00\ 511 \x00\x00\x00\x00\x00\x00\xDC\x00\ 512 \x00\x00\x00\x00\x00\x00\x00\x00\ 513 \x00\x00\x00\x00\x00\x00\x00\x00\ 514 \x00\x00\x00\x00\x00\x00\x00\x00\ 515 \x00\x00\x00\x00\x00\x00\x00\x00\ 516 \x00\x00\x00\x00\x00\x00\x00\x00\ 517 \x00\x00\x00\x00\x00\x00\x00\x00\ 518 \x00\x00\x00\x00\x00\x00\x00\x00\ 519 \x00\x00\x00\x00\x00\x00\x00\x00\ 520 \x00\x00\x00\x00\x00\x00\x00\x00\ 521 \x00\x00\x00\x00\x00\x00\x00\x00\ 522 \x00\x00\x00\x00\x00\x00\x00\x00\ 523 \x00\x00\x00\x00\x00\x00\x00\x00\ 524 \x00\x00\x00\x00\x00\x00\x00\x00\ 525 \x00\x00\x00\x00\x00\x00\x00\x07\ 526 \x00\x09\x00\x00\x00\x00\x00\x00\ 527 \x00\x00\x00\x00\x00\x00\x00\x00\ 528 \x00\x00\x00\x00\x00\x00\x00\x00\ 529 \x00\x00\x00\x00\x00\x00\x00\x00\ 530 \x00\x00\x00\x00\x00\x00\x00\x00\ 531 \x00\x00\x00\x00\x00\x00\x00\x00\ 532 \x00\x00\x00\x00\x00\x00\x00\x00\ 533 \x00\x00\x00\x00\x00\x00\x00\x00\ 534 \x00\x00\x00\x00\x00\x00\x00\x00\ 535 \x00\x00\x00\x00\x00\x00\x00\x00\ 536 \x00\x00\x00\x00\x00\x00\x00\x00\ 537 \x00\x00\x00\x00\x00\x00\x00\x00\ 538 \x00\x00\x00\x00\x00\x00\x00\x00\ 539 \x00\x00\x00\x00\x00\x00\x00\x00\ 540 \x00\x00\x00\x00\x00\x00\x00\x00\ 541 \x00\x00\x00\x00\x00\x00\x00\x00\ 542 \x00\x00\x00\x00\x00\x00\x00\x00\ 543 \x00\x00\x00\x00\x00\x00\x00\x00\ 544 \x00\x00\x00\x00\x00\x00\x00\x00\ 545 \x00\x00\x00\x00\x00\x00\x00\x00\ 546 \x00\x00\x00\x00\x00\x00\x00\x00\ 547 \x00\x00\x00\x00\x00\x00\x00\x00\ 548 \x00\x00\x00\x00\x00\x00\x00\x00\ 549 \x00\x00\x00\x00\x00\x00\x00\x00\ 550 \x00\x00\x00\x00\x00\x00\x00\x00\ 551 \x00\x00\x00\x00\x00\x00\x00\x00\ 552 \x00\x00\x00\x00\x00\x00\x00\x00\ 553 \x00\x00\x00\x00\x09\x00\x00\x00\ 554 \x00\x00\x00\x00\x00\x00\x00\x00\ 555 \x00\x00\x00\x00\x00\x00\x00\x00\ 556 \x00\x00\x00\x00\x00\x00\x00\x00\ 557 \x00\x00\x00\x00\x09\x00\x00\x00\ 558 \x00\x00\x00\x00\x00\x00\x00\x00\ 559 \x00\x00\x00\x00\x00\x00\x00\x00\ 560 \x00\x00\x00\x00\x00\x00\x00\x00\ 561 \x00\x00\x00\x00\x00\x00\x00\x00\ 562 \x00\x00\x00\x00\x00\x00\x00\x00\ 563 \x00\x00\x00\x00\x00\x00\x00\x00\ 564 \x00\x00\x00\x00\x00\x00\x00\x00\ 565 \x00\x00\x00\x00\x00\x00\x00\x00\ 566 \x00\x00\x00\x00\x00\x00\x00\x00\ 567 \x00\x00\x00\x00\x00\x00\x00\x00\ 568 \x00\x00\x00\x00\x00\x00\x00\x00\ 569 \x00\x00\x00\x00\x00\x00\x00\x00\ 570 \x00\x00\x00\x00\x00\x00\x00\x00\ 571 \x00\x00\x00\x00\x00\x00\x00\x00\ 572 \x00\x00\x00\x00\x00\x00\x00\x00\ 573 \x00\x00\x00\x00\x00\x00\x00\x00\ 574 \x00\x00\x00\x00\x00\x00\x00\x00\ 575 \x00\x00\x00\x00\x00\x00\x00\x00\ 576 \x00\x00\x00\x00\x00\x00\x00\x00\ 577 \x00\x00\x09\x00\x00\x00\x00\x00\ 578 \x00\x00\x00\x00\x00\xE6\x00\x00\ 579 \x00\x00\x00\x00\x00\x00\x00\x00\ 580 \x00\x00\x00\x00\x00\x00\x00\x00\ 581 \x00\x00\x00\x00\x00\x00\x00\x00\ 582 \x00\x00\x00\x00\x00\x00\x00\x00\ 583 \x00\x00\x00\x00\x00\x00\x00\x00\ 584 \x00\x00\x00\x00\x00\x00\x00\x00\ 585 \x00\x00\x00\x00\x00\x00\x00\x00\ 586 \x00\x00\x00\x00\x00\x00\x00\x00\ 587 \x00\x00\x00\x00\x00\x00\x00\x00\ 588 \x00\x00\x00\x00\x00\x00\x00\x00\ 589 \x00\x00\x00\x00\x00\x00\x00\x00\ 590 \x00\x00\x00\x00\x00\x00\x00\x00\ 591 \x00\x00\x00\x00\x00\x00\x00\x00\ 592 \x00\x00\x00\x00\x00\x00\x00\x00\ 593 \x00\x00\x00\x00\x00\x00\x00\x00\ 594 \x00\x00\x00\x00\x00\x00\x00\x00\ 595 \x00\x00\x00\x00\x00\x00\x00\x00\ 596 \x00\x00\x00\x00\x00\x00\x00\x00\ 597 \x00\x00\x00\x00\x00\x00\x00\x00\ 598 \x00\x00\x00\x00\x00\x00\x00\x00\ 599 \x00\x00\x00\x00\x00\x00\x00\x00\ 600 \x00\x00\x00\x00\x00\x00\x00\x00\ 601 \x00\x00\x00\x00\x00\x00\x00\x00\ 602 \x00\x00\x00\x00\x00\x00\x00\x00\ 603 \x00\x00\x00\x00\x00\x00\x00\x00\ 604 \x00\xE4\x00\x00\x00\x00\x00\x00\ 605 \x00\x00\x00\x00\x00\x00\x00\x00\ 606 \x00\x00\x00\x00\x00\x00\x00\x00\ 607 \x00\x00\x00\x00\x00\x00\x00\x00\ 608 \x00\x00\x00\x00\x00\x00\x00\x00\ 609 \x00\x00\x00\x00\x00\x00\x00\x00\ 610 \x00\x00\x00\x00\x00\x00\x00\x00\ 611 \x00\x00\x00\x00\x00\x00\x00\x00\ 612 \x00\x00\x00\x00\x00\x00\x00\x00\ 613 \x00\x00\x00\x00\x00\x00\x00\x00\ 614 \x00\x00\x00\x00\x00\x00\x00\x00\ 615 \x00\x00\x00\x00\x00\x00\x00\x00\ 616 \x00\x00\x00\x00\x00\x00\x00\x00\ 617 \x00\x00\x00\x00\x00\x00\x00\x00\ 618 \x00\x00\x00\x00\x00\x00\x00\x00\ 619 \x00\x00\x00\x00\x00\x00\x00\x00\ 620 \x00\x00\x00\x00\x00\x00\x00\x00\ 621 \x00\x00\x00\x00\x00\x00\x00\x00\ 622 \x00\xDE\xE6\xDC\x00\x00\x00\x00\ 623 \x00\x00\x00\x00\x00\x00\x00\x00\ 624 \x00\x00\x00\x00\x00\x00\x00\x00\ 625 \x00\x00\x00\x00\x00\x00\x00\x00\ 626 \x00\x00\x00\x00\x00\x00\x00\x00\ 627 \x00\x00\x00\x00\x00\x00\x00\x00\ 628 \x00\x00\x00\x00\x00\x00\x00\x00\ 629 \x00\x00\x00\x00\x00\x00\x00\x00\ 630 \x00\x00\x00\x00\x00\x00\x00\x00\ 631 \x00\x00\x00\x00\x00\x00\x00\x00\ 632 \x00\x00\x00\x00\x00\x00\x00\x00\ 633 \x00\x00\x00\x00\x00\x00\x00\x00\ 634 \x00\x00\x00\x00\x00\x00\x00\x00\ 635 \x00\x00\x00\x00\x00\x00\x00\x00\ 636 \x00\x00\x00\x00\x00\x00\x00\x00\ 637 \x00\x00\x00\x00\x00\x00\x00\x00\ 638 \x00\x00\x00\x00\x00\x00\x00\x00\ 639 \x00\x00\x00\x00\x00\x00\x00\x00\ 640 \x00\x00\x00\x00\x00\x00\x00\x00\ 641 \x00\x00\x00\x00\x00\x00\x00\x00\ 642 \x00\x00\x00\x00\x00\x00\x00\x00\ 643 \x00\x00\x00\x00\x00\x00\x00\x00\ 644 \x00\x00\x00\x00\x00\x00\x00\x00\ 645 \x00\x00\x00\x00\x00\x00\x00\x00\ 646 \x00\x00\x00\x00\x00\x00\x00\x00\ 647 \x00\x00\x00\x00\x00\x00\x00\x00\ 648 \x00\x00\x00\x00\x00\x00\x00\x00\ 649 \x00\x00\x00\x00\x00\x00\x00\x00\ 650 \x00\x00\x00\x00\x00\x00\x00\x00\ 651 \x00\x00\x00\x00\x00\x00\x00\x00\ 652 \x00\x00\x00\x00\x00\x00\x00\x00\ 653 \x00\x00\x00\x00\x00\x00\x00\x00\ 654 \x00\x00\x00\x00\x00\x00\x00\x00\ 655 \x00\x00\x00\x00\x00\x00\x00\x00\ 656 \x00\x00\x00\x00\x00\x00\x00\x00\ 657 \x00\x00\x00\x00\x00\x00\x00\x00\ 658 \x00\x00\x00\x00\x00\x00\x00\x00\ 659 \x00\x00\x00\x00\x00\x00\x00\x00\ 660 \x00\x00\x00\x00\x00\x00\x00\x00\ 661 \x00\x00\x00\x00\x00\x00\x00\x00\ 662 \x00\x00\x00\x00\x00\x00\x00\x00\ 663 \x00\x00\x00\x00\x00\x00\x00\x00\ 664 \x00\x00\x00\x00\x00\x00\x00\x00\ 665 \x00\x00\x00\x00\x00\x00\x00\x00\ 666 \x00\x00\x00\x00\x00\x00\x00\x00\ 667 \x00\x00\x00\x00\x00\x00\x00\x00\ 668 \x00\x00\x00\x00\x00\x00\x00\x00\ 669 \x00\x00\x00\x00\x00\x00\x00\x00\ 670 \x00\x00\x00\x00\x00\x00\x00\x00\ 671 \x00\x00\x00\x00\x00\x00\x00\x00\ 672 \x00\x00\x00\x00\x00\x00\x00\x00\ 673 \xE6\xE6\x01\x01\xE6\xE6\xE6\xE6\ 674 \x01\x01\x01\xE6\xE6\x00\x00\x00\ 675 \x00\xE6\x00\x00\x00\x01\x01\xE6\ 676 \xDC\xE6\x01\x00\x00\x00\x00\x00\ 677 \x00\x00\x00\x00\x00\x00\x00\x00\ 678 \x00\x00\x00\x00\x00\x00\x00\x00\ 679 \x00\x00\x00\x00\x00\x00\x00\x00\ 680 \x00\x00\x00\x00\x00\x00\x00\x00\ 681 \x00\x00\x00\x00\x00\x00\x00\x00\ 682 \x00\x00\x00\x00\x00\x00\x00\x00\ 683 \x00\x00\x00\x00\x00\x00\x00\x00\ 684 \x00\x00\xDA\xE4\xE8\xDE\xE0\xE0\ 685 \x00\x00\x00\x00\x00\x00\x00\x00\ 686 \x00\x00\x00\x00\x00\x00\x00\x00\ 687 \x00\x00\x00\x00\x00\x00\x00\x00\ 688 \x00\x00\x00\x00\x00\x00\x00\x00\ 689 \x00\x00\x00\x00\x00\x00\x00\x00\ 690 \x00\x00\x00\x00\x00\x00\x00\x00\ 691 \x00\x00\x00\x00\x00\x00\x00\x00\ 692 \x00\x00\x00\x00\x00\x00\x00\x00\ 693 \x00\x00\x00\x00\x00\x00\x00\x00\ 694 \x00\x00\x00\x00\x00\x00\x00\x00\ 695 \x00\x00\x00\x00\x00\x00\x00\x00\ 696 \x00\x00\x00\x00\x00\x00\x00\x00\ 697 \x00\x00\x00\x00\x00\x00\x00\x00\ 698 \x00\x08\x08\x00\x00\x00\x00\x00\ 699 \x00\x00\x00\x00\x00\x00\x00\x00\ 700 \x00\x00\x00\x00\x00\x00\x00\x00\ 701 \x00\x00\x00\x00\x00\x00\x00\x00\ 702 \x00\x00\x00\x00\x00\x00\x00\x00\ 703 \x00\x00\x00\x00\x00\x00\x00\x00\ 704 \x00\x00\x00\x00\x00\x00\x00\x00\ 705 \x00\x00\x00\x00\x00\x00\x00\x00\ 706 \x00\x00\x00\x00\x00\x00\x00\x00\ 707 \x00\x00\x00\x00\x00\x00\x00\x00\ 708 \x00\x00\x00\x00\x00\x00\x00\x00\ 709 \x00\x00\x00\x00\x00\x00\x00\x00\ 710 \x00\x00\x00\x00\x00\x00\x00\x00\ 711 \x00\x00\x00\x00\x00\x00\x00\x00\ 712 \x00\x00\x00\x00\x00\x00\x00\x00\ 713 \x00\x00\x00\x00\x00\x00\x00\x00\ 714 \x00\x00\x00\x00\x00\x00\x1A\x00\ 715 \x00\x00\x00\x00\x00\x00\x00\x00\ 716 \x00\x00\x00\x00\x00\x00\x00\x00\ 717 \x00\x00\x00\x00\x00\x00\x00\x00\ 718 \x00\x00\x00\x00\x00\x00\x00\x00\ 719 \x00\x00\x00\x00\x00\x00\x00\x00\ 720 \x00\x00\x00\x00\x00\x00\x00\x00\ 721 \x00\x00\x00\x00\x00\x00\x00\x00\ 722 \x00\x00\x00\x00\x00\x00\x00\x00\ 723 \x00\x00\x00\x00\x00\x00\x00\x00\ 724 \x00\x00\x00\x00\x00\x00\x00\x00\ 725 \x00\x00\x00\x00\x00\x00\x00\x00\ 726 \x00\x00\x00\x00\x00\x00\x00\x00\ 727 \x00\x00\x00\x00\x00\x00\x00\x00\ 728 \x00\x00\x00\x00\x00\x00\x00\x00\ 729 \x00\x00\x00\x00\x00\x00\x00\x00\ 730 \x00\x00\x00\x00\x00\x00\x00\x00\ 731 \x00\x00\x00\x00\x00\x00\x00\x00\ 732 \x00\x00\x00\x00\x00\x00\x00\x00\ 733 \x00\x00\x00\x00\x00\x00\x00\x00\ 734 \x00\x00\x00\x00\x00\x00\x00\x00\ 735 \x00\x00\x00\x00\x00\x00\x00\x00\ 736 \x00\x00\x00\x00\x00\x00\x00\x00\ 737 \x00\x00\x00\x00\x00\x00\x00\x00\ 738 \x00\x00\x00\x00\x00\x00\x00\x00\ 739 \x00\x00\x00\x00\x00\x00\x00\x00\ 740 \x00\x00\x00\x00\x00\x00\x00\x00\ 741 \x00\x00\x00\x00\x00\x00\x00\x00\ 742 \x00\x00\x00\x00\x00\x00\x00\x00\ 743 \x00\x00\x00\x00\x00\x00\x00\x00\ 744 \x00\x00\x00\x00\x00\x00\x00\x00\ 745 \x00\x00\x00\x00\x00\x00\x00\x00\ 746 \x00\x00\x00\x00\x00\x00\x00\x00\ 747 \xE6\xE6\xE6\xE6\x00\x00\x00\x00\ 748 \x00\x00\x00\x00\x00\x00\x00\x00\ 749 \x00\x00\x00\x00\x00\x00\x00\x00\ 750 \x00\x00\x00\x00\x00\x00\x00\x00\ 751 \x00\x00\x00\x00\x00\x00\x00\x00\ 752 \x00\x00\x00\x00\x00\x00\x00\x00\ 753 \x00\x00\x00\x00\x00\x00\x00\x00\ 754 \x00\x00\x00\x00\x00\x00\x00\x00\ 755 \x00\x00\x00\x00\x00\x00\x00\x00\ 756 \x00\x00\x00\x00\x00\x00\x00\x00\ 757 \x00\x00\x00\x00\x00\x00\x00\x00\ 758 \x00\x00\x00\x00\x00\x00\x00\x00\ 759 \x00\x00\x00\x00\x00\x00\x00\x00\ 760 \x00\x00\x00\x00\x00\x00\x00\x00\ 761 \x00\x00\x00\x00\x00\x00\x00\x00\ 762 \x00\x00\x00\x00\x00\x00\x00\x00\ 763 \x00\x00\x00\x00\x00\x00\x00\x00\ 764 \x00\x00\x00\x00\x00\x00\x00\x00\ 765 \x00\x00\x00\x00\x00\x00\x00\x00\ 766 \x00\x00\x00\x00\x00\x00\x00\x00\ 767 \x00\x00\x00\x00\x00\x00\x00\x00\ 768 \x00\x00\x00\x00\x00\x00\x00\x00\ 769 \x00\x00\x00\x00\x00\x00\x00\x00\ 770 \x00\x00\x00\x00\x00\x00\x00\x00\ 771 \x00\x00\x00\x00\x00\x00\x00\x00\ 772 \x00\x00\x00\x00\x00\x00\x00\x00\ 773 \x00\x00\x00\x00\x00\x00\x00\x00\ 774 \x00\x00\x00\x00\x00\x00\x00\x00" 775 776 let combining_class c = 777 if c > 0xffff then 0 else 778 let v = string_get combining_property_bitmap (c lsr 8) in 779 if v = 0 then 0 else 780 string_get combining_property_bitmap (v lsl 8 + c land 0xff) 781 782 let rec find_loc s i l p = 783 if i = 0 then i else 784 let i' = prev_char s i in 785 let (v, _) = decode_char s i' l in 786 let p' = combining_class v in 787 if p' <= p then i else 788 find_loc s i' l p 789 790 let rec scan s i l p = 791 if i < l then begin 792 let c = get s i in 793 if c < 0x80 then 794 scan s (i + 1) l 0 795 else if c < 0xE0 then begin 796 (* 80 - 7FF *) 797 if i + 1 >= l then fail () else 798 let c1 = get s (i + 1) in 799 let v = c lsl 6 + c1 - 0x3080 in 800 cont s i l (i + 2) p v 801 end else if c < 0xF0 then begin 802 (* 800 - FFFF *) 803 if i + 2 >= l then fail () else 804 let c1 = get s (i + 1) in 805 let c2 = get s (i + 2) in 806 let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in 807 cont s i l (i + 3) p v 808 end else begin 809 (* 10000 - 10FFFF *) 810 if i + 3 >= l then fail () else 811 scan s (i + 4) l 0 812 end 813 end 814 815 and cont s i l j p v = 816 let p' = combining_class v in 817 if p' = 0 || p <= p' then 818 scan s j l p' 819 else begin 820 (* move char to the right location *) 821 let k = find_loc s i l p' in 822 let d = j - i in 823 let s' = Bytes.sub s i d in 824 Bytes.blit s k s (k + d) (i - k); 825 Bytes.blit s' 0 s k d; 826 scan s j l p 827 end 828 829 let order s = 830 scan s 0 (Bytes.length s) 0 831 832 (****) 833 834 let hangul_sbase = 0xAC00 835 let hangul_lbase = 0x1100 836 let hangul_vbase = 0x1161 837 let hangul_tbase = 0x11A7 838 839 let hangul_scount = 11172 840 let hangul_lcount = 19 841 let hangul_vcount = 21 842 let hangul_tcount = 28 843 let hangul_ncount = hangul_vcount * hangul_tcount 844 845 let set_char_3 s i c = 846 set s i (c lsr 12 + 0xE0); 847 set s (i + 1) ((c lsr 6) land 0x3f + 0x80); 848 set s (i + 2) (c land 0x3f + 0x80) 849 850 let rec norm s i l s' j = 851 if i < l then begin 852 let c = string_get s i in 853 if c < 0x80 then begin 854 set s' j (string_get norm_ascii c); 855 norm s (i + 1) l s' (j + 1) 856 end else if c < 0xE0 then begin 857 (* 80 - 7FF *) 858 if c < 0xc2 || i + 1 >= l then raise Invalid; 859 let c1 = string_get s (i + 1) in 860 if c1 land 0xc0 <> 0x80 then raise Invalid; 861 let idx = string_get norm_prim (c - 0xc0) in 862 let idx = idx lsl 6 + c1 - 0x80 in 863 let k = string_get norm_second_high idx in 864 if k = 0 then begin 865 set s' j c; 866 set s' (j + 1) c1; 867 norm s (i + 2) l s' (j + 2) 868 end else begin 869 let k = (k - 2) lsl 8 + string_get norm_second_low idx in 870 let n = string_get norm_repl k in 871 String.blit norm_repl (k + 1) s' j n; 872 norm s (i + 2) l s' (j + n) 873 end 874 end else if c < 0xF0 then begin 875 (* 800 - FFFF *) 876 if i + 2 >= l then raise Invalid; 877 let c1 = string_get s (i + 1) in 878 if c1 land 0xc0 <> 0x80 then raise Invalid; 879 let idx = c lsl 6 + c1 - 0x3880 in 880 if idx < 0x20 then raise Invalid; 881 let c2 = string_get s (i + 2) in 882 if c2 land 0xc0 <> 0x80 then raise Invalid; 883 let idx = string_get norm_prim idx in 884 let idx = idx lsl 6 + c2 - 0x80 in 885 let k = string_get norm_second_high idx in 886 if k = 0 then begin 887 set s' j c; 888 set s' (j + 1) c1; 889 set s' (j + 2) c2; 890 norm s (i + 3) l s' (j + 3) 891 end else if k = 1 then begin 892 let v = c lsl 12 + c1 lsl 6 + c2 - (0x000E2080 + hangul_sbase) in 893 if v >= hangul_scount then begin 894 set s' j c; 895 set s' (j + 1) c1; 896 set s' (j + 2) c2; 897 norm s (i + 3) l s' (j + 3) 898 end else begin 899 set_char_3 s' j (v / hangul_ncount + hangul_lbase); 900 set_char_3 s' (j + 3) 901 ((v mod hangul_ncount) / hangul_tcount + hangul_vbase); 902 if v mod hangul_tcount = 0 then 903 norm s (i + 3) l s' (j + 6) 904 else begin 905 set_char_3 s' (j + 6) ((v mod hangul_tcount) + hangul_tbase); 906 norm s (i + 3) l s' (j + 9) 907 end 908 end 909 end else begin 910 let k = (k - 2) lsl 8 + string_get norm_second_low idx in 911 let n = string_get norm_repl k in 912 String.blit norm_repl (k + 1) s' j n; 913 norm s (i + 3) l s' (j + n) 914 end 915 end else begin 916 (* 10000 - 10FFFF *) 917 if i + 3 >= l then raise Invalid; 918 let c1 = string_get s (i + 1) in 919 let c2 = string_get s (i + 2) in 920 let c3 = string_get s (i + 3) in 921 if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then raise Invalid; 922 let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in 923 if v < 0x10000 || v > 0x10ffff then raise Invalid; 924 set s' j c; 925 set s' (j + 1) c1; 926 set s' (j + 2) c2; 927 set s' (j + 3) c3; 928 norm s (i + 4) l s' (j + 4) 929 end 930 end else 931 Bytes.sub s' 0 j 932 933 let normalize s = 934 let l = String.length s in 935 let s' = Bytes.create (3 * l) in 936 try 937 let s' = norm s 0 l s' 0 in order s'; Bytes.to_string s' 938 with Invalid -> 939 (* We need a comparison function which is coherent (transitive) 940 also with non-unicode strings. The optimization below assumes 941 a case-insensitive comparison on ASCII characters, thus we 942 translate the string to lowercase *) 943 String.lowercase_ascii s 944 945 (****) 946 947 let rec decomp s i l s' j = 948 if i < l then begin 949 let c = string_get s i in 950 if c < 0x80 then begin 951 set s' j (string_get decomp_ascii c); 952 decomp s (i + 1) l s' (j + 1) 953 end else if c < 0xE0 then begin 954 (* 80 - 7FF *) 955 if c < 0xc2 || i + 1 >= l then raise Invalid; 956 let c1 = string_get s (i + 1) in 957 if c1 land 0xc0 <> 0x80 then raise Invalid; 958 let idx = string_get decomp_prim (c - 0xc0) in 959 let idx = idx lsl 6 + c1 - 0x80 in 960 let k = string_get decomp_second_high idx in 961 if k = 0 then begin 962 set s' j c; 963 set s' (j + 1) c1; 964 decomp s (i + 2) l s' (j + 2) 965 end else begin 966 let k = (k - 2) lsl 8 + string_get decomp_second_low idx in 967 let n = string_get decomp_repl k in 968 String.blit decomp_repl (k + 1) s' j n; 969 decomp s (i + 2) l s' (j + n) 970 end 971 end else if c < 0xF0 then begin 972 (* 800 - FFFF *) 973 if i + 2 >= l then raise Invalid; 974 let c1 = string_get s (i + 1) in 975 if c1 land 0xc0 <> 0x80 then raise Invalid; 976 let idx = c lsl 6 + c1 - 0x3880 in 977 if idx < 0x20 then raise Invalid; 978 let c2 = string_get s (i + 2) in 979 if c2 land 0xc0 <> 0x80 then raise Invalid; 980 let idx = string_get decomp_prim idx in 981 let idx = idx lsl 6 + c2 - 0x80 in 982 let k = string_get decomp_second_high idx in 983 if k = 0 then begin 984 set s' j c; 985 set s' (j + 1) c1; 986 set s' (j + 2) c2; 987 decomp s (i + 3) l s' (j + 3) 988 end else if k = 1 then begin 989 let v = c lsl 12 + c1 lsl 6 + c2 - (0x000E2080 + hangul_sbase) in 990 if v >= hangul_scount then begin 991 set s' j c; 992 set s' (j + 1) c1; 993 set s' (j + 2) c2; 994 decomp s (i + 3) l s' (j + 3) 995 end else begin 996 set_char_3 s' j (v / hangul_ncount + hangul_lbase); 997 set_char_3 s' (j + 3) 998 ((v mod hangul_ncount) / hangul_tcount + hangul_vbase); 999 if v mod hangul_tcount = 0 then 1000 decomp s (i + 3) l s' (j + 6) 1001 else begin 1002 set_char_3 s' (j + 6) ((v mod hangul_tcount) + hangul_tbase); 1003 decomp s (i + 3) l s' (j + 9) 1004 end 1005 end 1006 end else begin 1007 let k = (k - 2) lsl 8 + string_get decomp_second_low idx in 1008 let n = string_get decomp_repl k in 1009 String.blit decomp_repl (k + 1) s' j n; 1010 decomp s (i + 3) l s' (j + n) 1011 end 1012 end else begin 1013 (* 10000 - 10FFFF *) 1014 if i + 3 >= l then raise Invalid; 1015 let c1 = string_get s (i + 1) in 1016 let c2 = string_get s (i + 2) in 1017 let c3 = string_get s (i + 3) in 1018 if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then raise Invalid; 1019 let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in 1020 if v < 0x10000 || v > 0x10ffff then raise Invalid; 1021 set s' j c; 1022 set s' (j + 1) c1; 1023 set s' (j + 2) c2; 1024 set s' (j + 3) c3; 1025 decomp s (i + 4) l s' (j + 4) 1026 end 1027 end else 1028 Bytes.sub s' 0 j 1029 1030 let decompose s = 1031 let l = String.length s in 1032 let s' = Bytes.create (3 * l) in 1033 try 1034 let s' = decomp s 0 l s' 0 in order s'; Bytes.to_string s' 1035 with Invalid -> 1036 s 1037 1038 (****) 1039 1040 let rec compare_rec s s' i l = 1041 if i = l then begin 1042 if l < String.length s then 1 else 1043 if l < String.length s' then -1 else 1044 0 1045 end else begin 1046 let c = string_get s i in 1047 let c' = string_get s' i in 1048 if c < 0x80 && c' < 0x80 then begin 1049 let v = compare (string_get norm_ascii c) (string_get norm_ascii c') in 1050 if v <> 0 then v else compare_rec s s' (i + 1) l 1051 end else 1052 compare (normalize s) (normalize s') 1053 end 1054 1055 let case_insensitive_compare s s' = 1056 compare_rec s s' 0 (min (String.length s) (String.length s')) 1057 1058 (****) 1059 1060 let rec compare_cs_rec s s' i l = 1061 if i = l then begin 1062 if l < String.length s then 1 else 1063 if l < String.length s' then -1 else 1064 0 1065 end else begin 1066 let c = string_get s i in 1067 let c' = string_get s' i in 1068 if c < 0x80 && c' < 0x80 then begin 1069 let v = compare c c' in 1070 if v <> 0 then v else compare_cs_rec s s' (i + 1) l 1071 end else 1072 compare (decompose s) (decompose s') 1073 end 1074 1075 let case_sensitive_compare s s' = 1076 compare_cs_rec s s' 0 (min (String.length s) (String.length s')) 1077 1078 (****) 1079 1080 let uniCharPrecompSourceTable = [| 1081 0x00000300; 0x00540000; 0x00000301; 0x00750054; 1082 0x00000302; 0x002000C9; 0x00000303; 0x001C00E9; 1083 0x00000304; 0x002C0105; 0x00000306; 0x00200131; 1084 0x00000307; 0x002E0151; 0x00000308; 0x0036017F; 1085 0x00000309; 0x001801B5; 0x0000030A; 0x000601CD; 1086 0x0000030B; 0x000601D3; 0x0000030C; 0x002501D9; 1087 0x0000030F; 0x000E01FE; 0x00000311; 0x000C020C; 1088 0x00000313; 0x000E0218; 0x00000314; 0x00100226; 1089 0x0000031B; 0x00040236; 0x00000323; 0x002A023A; 1090 0x00000324; 0x00020264; 0x00000325; 0x00020266; 1091 0x00000326; 0x00040268; 0x00000327; 0x0016026C; 1092 0x00000328; 0x000A0282; 0x0000032D; 0x000C028C; 1093 0x0000032E; 0x00020298; 0x00000330; 0x0006029A; 1094 0x00000331; 0x001102A0; 0x00000338; 0x002C02B1; 1095 0x00000342; 0x001D02DD; 0x00000345; 0x003F02FA; 1096 0x00000653; 0x00010339; 0x00000654; 0x0006033A; 1097 0x00000655; 0x00010340; 0x0000093C; 0x00030341; 1098 0x000009BE; 0x00010344; 0x000009D7; 0x00010345; 1099 0x00000B3E; 0x00010346; 0x00000B56; 0x00010347; 1100 0x00000B57; 0x00010348; 0x00000BBE; 0x00020349; 1101 0x00000BD7; 0x0002034B; 0x00000C56; 0x0001034D; 1102 0x00000CC2; 0x0001034E; 0x00000CD5; 0x0003034F; 1103 0x00000CD6; 0x00010352; 0x00000D3E; 0x00020353; 1104 0x00000D57; 0x00010355; 0x00000DCA; 0x00020356; 1105 0x00000DCF; 0x00010358; 0x00000DDF; 0x00010359; 1106 0x0000102E; 0x0001035A; 0x00003099; 0x0030035B; 1107 0x0000309A; 0x000A038B 1108 |] 1109 1110 let uniCharBMPPrecompDestinationTable = [| 1111 0x0041; 0x00C0; 0x0045; 0x00C8; 0x0049; 0x00CC; 0x004E; 0x01F8; 1112 0x004F; 0x00D2; 0x0055; 0x00D9; 0x0057; 0x1E80; 0x0059; 0x1EF2; 1113 0x0061; 0x00E0; 0x0065; 0x00E8; 0x0069; 0x00EC; 0x006E; 0x01F9; 1114 0x006F; 0x00F2; 0x0075; 0x00F9; 0x0077; 0x1E81; 0x0079; 0x1EF3; 1115 0x00A8; 0x1FED; 0x00C2; 0x1EA6; 0x00CA; 0x1EC0; 0x00D4; 0x1ED2; 1116 0x00DC; 0x01DB; 0x00E2; 0x1EA7; 0x00EA; 0x1EC1; 0x00F4; 0x1ED3; 1117 0x00FC; 0x01DC; 0x0102; 0x1EB0; 0x0103; 0x1EB1; 0x0112; 0x1E14; 1118 0x0113; 0x1E15; 0x014C; 0x1E50; 0x014D; 0x1E51; 0x01A0; 0x1EDC; 1119 0x01A1; 0x1EDD; 0x01AF; 0x1EEA; 0x01B0; 0x1EEB; 0x0391; 0x1FBA; 1120 0x0395; 0x1FC8; 0x0397; 0x1FCA; 0x0399; 0x1FDA; 0x039F; 0x1FF8; 1121 0x03A5; 0x1FEA; 0x03A9; 0x1FFA; 0x03B1; 0x1F70; 0x03B5; 0x1F72; 1122 0x03B7; 0x1F74; 0x03B9; 0x1F76; 0x03BF; 0x1F78; 0x03C5; 0x1F7A; 1123 0x03C9; 0x1F7C; 0x03CA; 0x1FD2; 0x03CB; 0x1FE2; 0x0415; 0x0400; 1124 0x0418; 0x040D; 0x0435; 0x0450; 0x0438; 0x045D; 0x1F00; 0x1F02; 1125 0x1F01; 0x1F03; 0x1F08; 0x1F0A; 0x1F09; 0x1F0B; 0x1F10; 0x1F12; 1126 0x1F11; 0x1F13; 0x1F18; 0x1F1A; 0x1F19; 0x1F1B; 0x1F20; 0x1F22; 1127 0x1F21; 0x1F23; 0x1F28; 0x1F2A; 0x1F29; 0x1F2B; 0x1F30; 0x1F32; 1128 0x1F31; 0x1F33; 0x1F38; 0x1F3A; 0x1F39; 0x1F3B; 0x1F40; 0x1F42; 1129 0x1F41; 0x1F43; 0x1F48; 0x1F4A; 0x1F49; 0x1F4B; 0x1F50; 0x1F52; 1130 0x1F51; 0x1F53; 0x1F59; 0x1F5B; 0x1F60; 0x1F62; 0x1F61; 0x1F63; 1131 0x1F68; 0x1F6A; 0x1F69; 0x1F6B; 0x1FBF; 0x1FCD; 0x1FFE; 0x1FDD; 1132 0x0041; 0x00C1; 0x0043; 0x0106; 0x0045; 0x00C9; 0x0047; 0x01F4; 1133 0x0049; 0x00CD; 0x004B; 0x1E30; 0x004C; 0x0139; 0x004D; 0x1E3E; 1134 0x004E; 0x0143; 0x004F; 0x00D3; 0x0050; 0x1E54; 0x0052; 0x0154; 1135 0x0053; 0x015A; 0x0055; 0x00DA; 0x0057; 0x1E82; 0x0059; 0x00DD; 1136 0x005A; 0x0179; 0x0061; 0x00E1; 0x0063; 0x0107; 0x0065; 0x00E9; 1137 0x0067; 0x01F5; 0x0069; 0x00ED; 0x006B; 0x1E31; 0x006C; 0x013A; 1138 0x006D; 0x1E3F; 0x006E; 0x0144; 0x006F; 0x00F3; 0x0070; 0x1E55; 1139 0x0072; 0x0155; 0x0073; 0x015B; 0x0075; 0x00FA; 0x0077; 0x1E83; 1140 0x0079; 0x00FD; 0x007A; 0x017A; 0x00A8; 0x0385; 0x00C2; 0x1EA4; 1141 0x00C5; 0x01FA; 0x00C6; 0x01FC; 0x00C7; 0x1E08; 0x00CA; 0x1EBE; 1142 0x00CF; 0x1E2E; 0x00D4; 0x1ED0; 0x00D5; 0x1E4C; 0x00D8; 0x01FE; 1143 0x00DC; 0x01D7; 0x00E2; 0x1EA5; 0x00E5; 0x01FB; 0x00E6; 0x01FD; 1144 0x00E7; 0x1E09; 0x00EA; 0x1EBF; 0x00EF; 0x1E2F; 0x00F4; 0x1ED1; 1145 0x00F5; 0x1E4D; 0x00F8; 0x01FF; 0x00FC; 0x01D8; 0x0102; 0x1EAE; 1146 0x0103; 0x1EAF; 0x0112; 0x1E16; 0x0113; 0x1E17; 0x014C; 0x1E52; 1147 0x014D; 0x1E53; 0x0168; 0x1E78; 0x0169; 0x1E79; 0x01A0; 0x1EDA; 1148 0x01A1; 0x1EDB; 0x01AF; 0x1EE8; 0x01B0; 0x1EE9; 0x0391; 0x0386; 1149 0x0395; 0x0388; 0x0397; 0x0389; 0x0399; 0x038A; 0x039F; 0x038C; 1150 0x03A5; 0x038E; 0x03A9; 0x038F; 0x03B1; 0x03AC; 0x03B5; 0x03AD; 1151 0x03B7; 0x03AE; 0x03B9; 0x03AF; 0x03BF; 0x03CC; 0x03C5; 0x03CD; 1152 0x03C9; 0x03CE; 0x03CA; 0x0390; 0x03CB; 0x03B0; 0x03D2; 0x03D3; 1153 0x0413; 0x0403; 0x041A; 0x040C; 0x0433; 0x0453; 0x043A; 0x045C; 1154 0x1F00; 0x1F04; 0x1F01; 0x1F05; 0x1F08; 0x1F0C; 0x1F09; 0x1F0D; 1155 0x1F10; 0x1F14; 0x1F11; 0x1F15; 0x1F18; 0x1F1C; 0x1F19; 0x1F1D; 1156 0x1F20; 0x1F24; 0x1F21; 0x1F25; 0x1F28; 0x1F2C; 0x1F29; 0x1F2D; 1157 0x1F30; 0x1F34; 0x1F31; 0x1F35; 0x1F38; 0x1F3C; 0x1F39; 0x1F3D; 1158 0x1F40; 0x1F44; 0x1F41; 0x1F45; 0x1F48; 0x1F4C; 0x1F49; 0x1F4D; 1159 0x1F50; 0x1F54; 0x1F51; 0x1F55; 0x1F59; 0x1F5D; 0x1F60; 0x1F64; 1160 0x1F61; 0x1F65; 0x1F68; 0x1F6C; 0x1F69; 0x1F6D; 0x1FBF; 0x1FCE; 1161 0x1FFE; 0x1FDE; 0x0041; 0x00C2; 0x0043; 0x0108; 0x0045; 0x00CA; 1162 0x0047; 0x011C; 0x0048; 0x0124; 0x0049; 0x00CE; 0x004A; 0x0134; 1163 0x004F; 0x00D4; 0x0053; 0x015C; 0x0055; 0x00DB; 0x0057; 0x0174; 1164 0x0059; 0x0176; 0x005A; 0x1E90; 0x0061; 0x00E2; 0x0063; 0x0109; 1165 0x0065; 0x00EA; 0x0067; 0x011D; 0x0068; 0x0125; 0x0069; 0x00EE; 1166 0x006A; 0x0135; 0x006F; 0x00F4; 0x0073; 0x015D; 0x0075; 0x00FB; 1167 0x0077; 0x0175; 0x0079; 0x0177; 0x007A; 0x1E91; 0x1EA0; 0x1EAC; 1168 0x1EA1; 0x1EAD; 0x1EB8; 0x1EC6; 0x1EB9; 0x1EC7; 0x1ECC; 0x1ED8; 1169 0x1ECD; 0x1ED9; 0x0041; 0x00C3; 0x0045; 0x1EBC; 0x0049; 0x0128; 1170 0x004E; 0x00D1; 0x004F; 0x00D5; 0x0055; 0x0168; 0x0056; 0x1E7C; 1171 0x0059; 0x1EF8; 0x0061; 0x00E3; 0x0065; 0x1EBD; 0x0069; 0x0129; 1172 0x006E; 0x00F1; 0x006F; 0x00F5; 0x0075; 0x0169; 0x0076; 0x1E7D; 1173 0x0079; 0x1EF9; 0x00C2; 0x1EAA; 0x00CA; 0x1EC4; 0x00D4; 0x1ED6; 1174 0x00E2; 0x1EAB; 0x00EA; 0x1EC5; 0x00F4; 0x1ED7; 0x0102; 0x1EB4; 1175 0x0103; 0x1EB5; 0x01A0; 0x1EE0; 0x01A1; 0x1EE1; 0x01AF; 0x1EEE; 1176 0x01B0; 0x1EEF; 0x0041; 0x0100; 0x0045; 0x0112; 0x0047; 0x1E20; 1177 0x0049; 0x012A; 0x004F; 0x014C; 0x0055; 0x016A; 0x0059; 0x0232; 1178 0x0061; 0x0101; 0x0065; 0x0113; 0x0067; 0x1E21; 0x0069; 0x012B; 1179 0x006F; 0x014D; 0x0075; 0x016B; 0x0079; 0x0233; 0x00C4; 0x01DE; 1180 0x00C6; 0x01E2; 0x00D5; 0x022C; 0x00D6; 0x022A; 0x00DC; 0x01D5; 1181 0x00E4; 0x01DF; 0x00E6; 0x01E3; 0x00F5; 0x022D; 0x00F6; 0x022B; 1182 0x00FC; 0x01D6; 0x01EA; 0x01EC; 0x01EB; 0x01ED; 0x0226; 0x01E0; 1183 0x0227; 0x01E1; 0x022E; 0x0230; 0x022F; 0x0231; 0x0391; 0x1FB9; 1184 0x0399; 0x1FD9; 0x03A5; 0x1FE9; 0x03B1; 0x1FB1; 0x03B9; 0x1FD1; 1185 0x03C5; 0x1FE1; 0x0418; 0x04E2; 0x0423; 0x04EE; 0x0438; 0x04E3; 1186 0x0443; 0x04EF; 0x1E36; 0x1E38; 0x1E37; 0x1E39; 0x1E5A; 0x1E5C; 1187 0x1E5B; 0x1E5D; 0x0041; 0x0102; 0x0045; 0x0114; 0x0047; 0x011E; 1188 0x0049; 0x012C; 0x004F; 0x014E; 0x0055; 0x016C; 0x0061; 0x0103; 1189 0x0065; 0x0115; 0x0067; 0x011F; 0x0069; 0x012D; 0x006F; 0x014F; 1190 0x0075; 0x016D; 0x0228; 0x1E1C; 0x0229; 0x1E1D; 0x0391; 0x1FB8; 1191 0x0399; 0x1FD8; 0x03A5; 0x1FE8; 0x03B1; 0x1FB0; 0x03B9; 0x1FD0; 1192 0x03C5; 0x1FE0; 0x0410; 0x04D0; 0x0415; 0x04D6; 0x0416; 0x04C1; 1193 0x0418; 0x0419; 0x0423; 0x040E; 0x0430; 0x04D1; 0x0435; 0x04D7; 1194 0x0436; 0x04C2; 0x0438; 0x0439; 0x0443; 0x045E; 0x1EA0; 0x1EB6; 1195 0x1EA1; 0x1EB7; 0x0041; 0x0226; 0x0042; 0x1E02; 0x0043; 0x010A; 1196 0x0044; 0x1E0A; 0x0045; 0x0116; 0x0046; 0x1E1E; 0x0047; 0x0120; 1197 0x0048; 0x1E22; 0x0049; 0x0130; 0x004D; 0x1E40; 0x004E; 0x1E44; 1198 0x004F; 0x022E; 0x0050; 0x1E56; 0x0052; 0x1E58; 0x0053; 0x1E60; 1199 0x0054; 0x1E6A; 0x0057; 0x1E86; 0x0058; 0x1E8A; 0x0059; 0x1E8E; 1200 0x005A; 0x017B; 0x0061; 0x0227; 0x0062; 0x1E03; 0x0063; 0x010B; 1201 0x0064; 0x1E0B; 0x0065; 0x0117; 0x0066; 0x1E1F; 0x0067; 0x0121; 1202 0x0068; 0x1E23; 0x006D; 0x1E41; 0x006E; 0x1E45; 0x006F; 0x022F; 1203 0x0070; 0x1E57; 0x0072; 0x1E59; 0x0073; 0x1E61; 0x0074; 0x1E6B; 1204 0x0077; 0x1E87; 0x0078; 0x1E8B; 0x0079; 0x1E8F; 0x007A; 0x017C; 1205 0x015A; 0x1E64; 0x015B; 0x1E65; 0x0160; 0x1E66; 0x0161; 0x1E67; 1206 0x017F; 0x1E9B; 0x1E62; 0x1E68; 0x1E63; 0x1E69; 0x0041; 0x00C4; 1207 0x0045; 0x00CB; 0x0048; 0x1E26; 0x0049; 0x00CF; 0x004F; 0x00D6; 1208 0x0055; 0x00DC; 0x0057; 0x1E84; 0x0058; 0x1E8C; 0x0059; 0x0178; 1209 0x0061; 0x00E4; 0x0065; 0x00EB; 0x0068; 0x1E27; 0x0069; 0x00EF; 1210 0x006F; 0x00F6; 0x0074; 0x1E97; 0x0075; 0x00FC; 0x0077; 0x1E85; 1211 0x0078; 0x1E8D; 0x0079; 0x00FF; 0x00D5; 0x1E4E; 0x00F5; 0x1E4F; 1212 0x016A; 0x1E7A; 0x016B; 0x1E7B; 0x0399; 0x03AA; 0x03A5; 0x03AB; 1213 0x03B9; 0x03CA; 0x03C5; 0x03CB; 0x03D2; 0x03D4; 0x0406; 0x0407; 1214 0x0410; 0x04D2; 0x0415; 0x0401; 0x0416; 0x04DC; 0x0417; 0x04DE; 1215 0x0418; 0x04E4; 0x041E; 0x04E6; 0x0423; 0x04F0; 0x0427; 0x04F4; 1216 0x042B; 0x04F8; 0x042D; 0x04EC; 0x0430; 0x04D3; 0x0435; 0x0451; 1217 0x0436; 0x04DD; 0x0437; 0x04DF; 0x0438; 0x04E5; 0x043E; 0x04E7; 1218 0x0443; 0x04F1; 0x0447; 0x04F5; 0x044B; 0x04F9; 0x044D; 0x04ED; 1219 0x0456; 0x0457; 0x04D8; 0x04DA; 0x04D9; 0x04DB; 0x04E8; 0x04EA; 1220 0x04E9; 0x04EB; 0x0041; 0x1EA2; 0x0045; 0x1EBA; 0x0049; 0x1EC8; 1221 0x004F; 0x1ECE; 0x0055; 0x1EE6; 0x0059; 0x1EF6; 0x0061; 0x1EA3; 1222 0x0065; 0x1EBB; 0x0069; 0x1EC9; 0x006F; 0x1ECF; 0x0075; 0x1EE7; 1223 0x0079; 0x1EF7; 0x00C2; 0x1EA8; 0x00CA; 0x1EC2; 0x00D4; 0x1ED4; 1224 0x00E2; 0x1EA9; 0x00EA; 0x1EC3; 0x00F4; 0x1ED5; 0x0102; 0x1EB2; 1225 0x0103; 0x1EB3; 0x01A0; 0x1EDE; 0x01A1; 0x1EDF; 0x01AF; 0x1EEC; 1226 0x01B0; 0x1EED; 0x0041; 0x00C5; 0x0055; 0x016E; 0x0061; 0x00E5; 1227 0x0075; 0x016F; 0x0077; 0x1E98; 0x0079; 0x1E99; 0x004F; 0x0150; 1228 0x0055; 0x0170; 0x006F; 0x0151; 0x0075; 0x0171; 0x0423; 0x04F2; 1229 0x0443; 0x04F3; 0x0041; 0x01CD; 0x0043; 0x010C; 0x0044; 0x010E; 1230 0x0045; 0x011A; 0x0047; 0x01E6; 0x0048; 0x021E; 0x0049; 0x01CF; 1231 0x004B; 0x01E8; 0x004C; 0x013D; 0x004E; 0x0147; 0x004F; 0x01D1; 1232 0x0052; 0x0158; 0x0053; 0x0160; 0x0054; 0x0164; 0x0055; 0x01D3; 1233 0x005A; 0x017D; 0x0061; 0x01CE; 0x0063; 0x010D; 0x0064; 0x010F; 1234 0x0065; 0x011B; 0x0067; 0x01E7; 0x0068; 0x021F; 0x0069; 0x01D0; 1235 0x006A; 0x01F0; 0x006B; 0x01E9; 0x006C; 0x013E; 0x006E; 0x0148; 1236 0x006F; 0x01D2; 0x0072; 0x0159; 0x0073; 0x0161; 0x0074; 0x0165; 1237 0x0075; 0x01D4; 0x007A; 0x017E; 0x00DC; 0x01D9; 0x00FC; 0x01DA; 1238 0x01B7; 0x01EE; 0x0292; 0x01EF; 0x0041; 0x0200; 0x0045; 0x0204; 1239 0x0049; 0x0208; 0x004F; 0x020C; 0x0052; 0x0210; 0x0055; 0x0214; 1240 0x0061; 0x0201; 0x0065; 0x0205; 0x0069; 0x0209; 0x006F; 0x020D; 1241 0x0072; 0x0211; 0x0075; 0x0215; 0x0474; 0x0476; 0x0475; 0x0477; 1242 0x0041; 0x0202; 0x0045; 0x0206; 0x0049; 0x020A; 0x004F; 0x020E; 1243 0x0052; 0x0212; 0x0055; 0x0216; 0x0061; 0x0203; 0x0065; 0x0207; 1244 0x0069; 0x020B; 0x006F; 0x020F; 0x0072; 0x0213; 0x0075; 0x0217; 1245 0x0391; 0x1F08; 0x0395; 0x1F18; 0x0397; 0x1F28; 0x0399; 0x1F38; 1246 0x039F; 0x1F48; 0x03A9; 0x1F68; 0x03B1; 0x1F00; 0x03B5; 0x1F10; 1247 0x03B7; 0x1F20; 0x03B9; 0x1F30; 0x03BF; 0x1F40; 0x03C1; 0x1FE4; 1248 0x03C5; 0x1F50; 0x03C9; 0x1F60; 0x0391; 0x1F09; 0x0395; 0x1F19; 1249 0x0397; 0x1F29; 0x0399; 0x1F39; 0x039F; 0x1F49; 0x03A1; 0x1FEC; 1250 0x03A5; 0x1F59; 0x03A9; 0x1F69; 0x03B1; 0x1F01; 0x03B5; 0x1F11; 1251 0x03B7; 0x1F21; 0x03B9; 0x1F31; 0x03BF; 0x1F41; 0x03C1; 0x1FE5; 1252 0x03C5; 0x1F51; 0x03C9; 0x1F61; 0x004F; 0x01A0; 0x0055; 0x01AF; 1253 0x006F; 0x01A1; 0x0075; 0x01B0; 0x0041; 0x1EA0; 0x0042; 0x1E04; 1254 0x0044; 0x1E0C; 0x0045; 0x1EB8; 0x0048; 0x1E24; 0x0049; 0x1ECA; 1255 0x004B; 0x1E32; 0x004C; 0x1E36; 0x004D; 0x1E42; 0x004E; 0x1E46; 1256 0x004F; 0x1ECC; 0x0052; 0x1E5A; 0x0053; 0x1E62; 0x0054; 0x1E6C; 1257 0x0055; 0x1EE4; 0x0056; 0x1E7E; 0x0057; 0x1E88; 0x0059; 0x1EF4; 1258 0x005A; 0x1E92; 0x0061; 0x1EA1; 0x0062; 0x1E05; 0x0064; 0x1E0D; 1259 0x0065; 0x1EB9; 0x0068; 0x1E25; 0x0069; 0x1ECB; 0x006B; 0x1E33; 1260 0x006C; 0x1E37; 0x006D; 0x1E43; 0x006E; 0x1E47; 0x006F; 0x1ECD; 1261 0x0072; 0x1E5B; 0x0073; 0x1E63; 0x0074; 0x1E6D; 0x0075; 0x1EE5; 1262 0x0076; 0x1E7F; 0x0077; 0x1E89; 0x0079; 0x1EF5; 0x007A; 0x1E93; 1263 0x01A0; 0x1EE2; 0x01A1; 0x1EE3; 0x01AF; 0x1EF0; 0x01B0; 0x1EF1; 1264 0x0055; 0x1E72; 0x0075; 0x1E73; 0x0041; 0x1E00; 0x0061; 0x1E01; 1265 0x0053; 0x0218; 0x0054; 0x021A; 0x0073; 0x0219; 0x0074; 0x021B; 1266 0x0043; 0x00C7; 0x0044; 0x1E10; 0x0045; 0x0228; 0x0047; 0x0122; 1267 0x0048; 0x1E28; 0x004B; 0x0136; 0x004C; 0x013B; 0x004E; 0x0145; 1268 0x0052; 0x0156; 0x0053; 0x015E; 0x0054; 0x0162; 0x0063; 0x00E7; 1269 0x0064; 0x1E11; 0x0065; 0x0229; 0x0067; 0x0123; 0x0068; 0x1E29; 1270 0x006B; 0x0137; 0x006C; 0x013C; 0x006E; 0x0146; 0x0072; 0x0157; 1271 0x0073; 0x015F; 0x0074; 0x0163; 0x0041; 0x0104; 0x0045; 0x0118; 1272 0x0049; 0x012E; 0x004F; 0x01EA; 0x0055; 0x0172; 0x0061; 0x0105; 1273 0x0065; 0x0119; 0x0069; 0x012F; 0x006F; 0x01EB; 0x0075; 0x0173; 1274 0x0044; 0x1E12; 0x0045; 0x1E18; 0x004C; 0x1E3C; 0x004E; 0x1E4A; 1275 0x0054; 0x1E70; 0x0055; 0x1E76; 0x0064; 0x1E13; 0x0065; 0x1E19; 1276 0x006C; 0x1E3D; 0x006E; 0x1E4B; 0x0074; 0x1E71; 0x0075; 0x1E77; 1277 0x0048; 0x1E2A; 0x0068; 0x1E2B; 0x0045; 0x1E1A; 0x0049; 0x1E2C; 1278 0x0055; 0x1E74; 0x0065; 0x1E1B; 0x0069; 0x1E2D; 0x0075; 0x1E75; 1279 0x0042; 0x1E06; 0x0044; 0x1E0E; 0x004B; 0x1E34; 0x004C; 0x1E3A; 1280 0x004E; 0x1E48; 0x0052; 0x1E5E; 0x0054; 0x1E6E; 0x005A; 0x1E94; 1281 0x0062; 0x1E07; 0x0064; 0x1E0F; 0x0068; 0x1E96; 0x006B; 0x1E35; 1282 0x006C; 0x1E3B; 0x006E; 0x1E49; 0x0072; 0x1E5F; 0x0074; 0x1E6F; 1283 0x007A; 0x1E95; 0x003C; 0x226E; 0x003D; 0x2260; 0x003E; 0x226F; 1284 0x2190; 0x219A; 0x2192; 0x219B; 0x2194; 0x21AE; 0x21D0; 0x21CD; 1285 0x21D2; 0x21CF; 0x21D4; 0x21CE; 0x2203; 0x2204; 0x2208; 0x2209; 1286 0x220B; 0x220C; 0x2223; 0x2224; 0x2225; 0x2226; 0x223C; 0x2241; 1287 0x2243; 0x2244; 0x2245; 0x2247; 0x2248; 0x2249; 0x224D; 0x226D; 1288 0x2261; 0x2262; 0x2264; 0x2270; 0x2265; 0x2271; 0x2272; 0x2274; 1289 0x2273; 0x2275; 0x2276; 0x2278; 0x2277; 0x2279; 0x227A; 0x2280; 1290 0x227B; 0x2281; 0x227C; 0x22E0; 0x227D; 0x22E1; 0x2282; 0x2284; 1291 0x2283; 0x2285; 0x2286; 0x2288; 0x2287; 0x2289; 0x2291; 0x22E2; 1292 0x2292; 0x22E3; 0x22A2; 0x22AC; 0x22A8; 0x22AD; 0x22A9; 0x22AE; 1293 0x22AB; 0x22AF; 0x22B2; 0x22EA; 0x22B3; 0x22EB; 0x22B4; 0x22EC; 1294 0x22B5; 0x22ED; 0x00A8; 0x1FC1; 0x03B1; 0x1FB6; 0x03B7; 0x1FC6; 1295 0x03B9; 0x1FD6; 0x03C5; 0x1FE6; 0x03C9; 0x1FF6; 0x03CA; 0x1FD7; 1296 0x03CB; 0x1FE7; 0x1F00; 0x1F06; 0x1F01; 0x1F07; 0x1F08; 0x1F0E; 1297 0x1F09; 0x1F0F; 0x1F20; 0x1F26; 0x1F21; 0x1F27; 0x1F28; 0x1F2E; 1298 0x1F29; 0x1F2F; 0x1F30; 0x1F36; 0x1F31; 0x1F37; 0x1F38; 0x1F3E; 1299 0x1F39; 0x1F3F; 0x1F50; 0x1F56; 0x1F51; 0x1F57; 0x1F59; 0x1F5F; 1300 0x1F60; 0x1F66; 0x1F61; 0x1F67; 0x1F68; 0x1F6E; 0x1F69; 0x1F6F; 1301 0x1FBF; 0x1FCF; 0x1FFE; 0x1FDF; 0x0391; 0x1FBC; 0x0397; 0x1FCC; 1302 0x03A9; 0x1FFC; 0x03AC; 0x1FB4; 0x03AE; 0x1FC4; 0x03B1; 0x1FB3; 1303 0x03B7; 0x1FC3; 0x03C9; 0x1FF3; 0x03CE; 0x1FF4; 0x1F00; 0x1F80; 1304 0x1F01; 0x1F81; 0x1F02; 0x1F82; 0x1F03; 0x1F83; 0x1F04; 0x1F84; 1305 0x1F05; 0x1F85; 0x1F06; 0x1F86; 0x1F07; 0x1F87; 0x1F08; 0x1F88; 1306 0x1F09; 0x1F89; 0x1F0A; 0x1F8A; 0x1F0B; 0x1F8B; 0x1F0C; 0x1F8C; 1307 0x1F0D; 0x1F8D; 0x1F0E; 0x1F8E; 0x1F0F; 0x1F8F; 0x1F20; 0x1F90; 1308 0x1F21; 0x1F91; 0x1F22; 0x1F92; 0x1F23; 0x1F93; 0x1F24; 0x1F94; 1309 0x1F25; 0x1F95; 0x1F26; 0x1F96; 0x1F27; 0x1F97; 0x1F28; 0x1F98; 1310 0x1F29; 0x1F99; 0x1F2A; 0x1F9A; 0x1F2B; 0x1F9B; 0x1F2C; 0x1F9C; 1311 0x1F2D; 0x1F9D; 0x1F2E; 0x1F9E; 0x1F2F; 0x1F9F; 0x1F60; 0x1FA0; 1312 0x1F61; 0x1FA1; 0x1F62; 0x1FA2; 0x1F63; 0x1FA3; 0x1F64; 0x1FA4; 1313 0x1F65; 0x1FA5; 0x1F66; 0x1FA6; 0x1F67; 0x1FA7; 0x1F68; 0x1FA8; 1314 0x1F69; 0x1FA9; 0x1F6A; 0x1FAA; 0x1F6B; 0x1FAB; 0x1F6C; 0x1FAC; 1315 0x1F6D; 0x1FAD; 0x1F6E; 0x1FAE; 0x1F6F; 0x1FAF; 0x1F70; 0x1FB2; 1316 0x1F74; 0x1FC2; 0x1F7C; 0x1FF2; 0x1FB6; 0x1FB7; 0x1FC6; 0x1FC7; 1317 0x1FF6; 0x1FF7; 0x0627; 0x0622; 0x0627; 0x0623; 0x0648; 0x0624; 1318 0x064A; 0x0626; 0x06C1; 0x06C2; 0x06D2; 0x06D3; 0x06D5; 0x06C0; 1319 0x0627; 0x0625; 0x0928; 0x0929; 0x0930; 0x0931; 0x0933; 0x0934; 1320 0x09C7; 0x09CB; 0x09C7; 0x09CC; 0x0B47; 0x0B4B; 0x0B47; 0x0B48; 1321 0x0B47; 0x0B4C; 0x0BC6; 0x0BCA; 0x0BC7; 0x0BCB; 0x0B92; 0x0B94; 1322 0x0BC6; 0x0BCC; 0x0C46; 0x0C48; 0x0CC6; 0x0CCA; 0x0CBF; 0x0CC0; 1323 0x0CC6; 0x0CC7; 0x0CCA; 0x0CCB; 0x0CC6; 0x0CC8; 0x0D46; 0x0D4A; 1324 0x0D47; 0x0D4B; 0x0D46; 0x0D4C; 0x0DD9; 0x0DDA; 0x0DDC; 0x0DDD; 1325 0x0DD9; 0x0DDC; 0x0DD9; 0x0DDE; 0x1025; 0x1026; 0x3046; 0x3094; 1326 0x304B; 0x304C; 0x304D; 0x304E; 0x304F; 0x3050; 0x3051; 0x3052; 1327 0x3053; 0x3054; 0x3055; 0x3056; 0x3057; 0x3058; 0x3059; 0x305A; 1328 0x305B; 0x305C; 0x305D; 0x305E; 0x305F; 0x3060; 0x3061; 0x3062; 1329 0x3064; 0x3065; 0x3066; 0x3067; 0x3068; 0x3069; 0x306F; 0x3070; 1330 0x3072; 0x3073; 0x3075; 0x3076; 0x3078; 0x3079; 0x307B; 0x307C; 1331 0x309D; 0x309E; 0x30A6; 0x30F4; 0x30AB; 0x30AC; 0x30AD; 0x30AE; 1332 0x30AF; 0x30B0; 0x30B1; 0x30B2; 0x30B3; 0x30B4; 0x30B5; 0x30B6; 1333 0x30B7; 0x30B8; 0x30B9; 0x30BA; 0x30BB; 0x30BC; 0x30BD; 0x30BE; 1334 0x30BF; 0x30C0; 0x30C1; 0x30C2; 0x30C4; 0x30C5; 0x30C6; 0x30C7; 1335 0x30C8; 0x30C9; 0x30CF; 0x30D0; 0x30D2; 0x30D3; 0x30D5; 0x30D6; 1336 0x30D8; 0x30D9; 0x30DB; 0x30DC; 0x30EF; 0x30F7; 0x30F0; 0x30F8; 1337 0x30F1; 0x30F9; 0x30F2; 0x30FA; 0x30FD; 0x30FE; 0x306F; 0x3071; 1338 0x3072; 0x3074; 0x3075; 0x3077; 0x3078; 0x307A; 0x307B; 0x307D; 1339 0x30CF; 0x30D1; 0x30D2; 0x30D4; 0x30D5; 0x30D7; 0x30D8; 0x30DA; 1340 0x30DB; 0x30DD 1341 |] 1342 1343 let uniCharCombiningBitmap = "\ 1344 \x00\x00\x00\x01\x02\x03\x04\x05\ 1345 \x00\x06\x07\x08\x09\x0A\x0B\x0C\ 1346 \x0D\x14\x00\x00\x00\x00\x00\x0E\ 1347 \x0F\x00\x00\x00\x00\x00\x00\x00\ 1348 \x10\x00\x00\x00\x00\x00\x00\x00\ 1349 \x00\x00\x00\x00\x00\x00\x00\x00\ 1350 \x11\x00\x00\x00\x00\x00\x00\x00\ 1351 \x00\x00\x00\x00\x00\x00\x00\x00\ 1352 \x00\x00\x00\x00\x00\x00\x00\x00\ 1353 \x00\x00\x00\x00\x00\x00\x00\x00\ 1354 \x00\x00\x00\x00\x00\x00\x00\x00\ 1355 \x00\x00\x00\x00\x00\x00\x00\x00\ 1356 \x00\x00\x00\x00\x00\x00\x00\x00\ 1357 \x00\x00\x00\x00\x00\x00\x00\x00\ 1358 \x00\x00\x00\x00\x00\x00\x00\x00\ 1359 \x00\x00\x00\x00\x00\x00\x00\x00\ 1360 \x00\x00\x00\x00\x00\x00\x00\x00\ 1361 \x00\x00\x00\x00\x00\x00\x00\x00\ 1362 \x00\x00\x00\x00\x00\x00\x00\x00\ 1363 \x00\x00\x00\x00\x00\x00\x00\x00\ 1364 \x00\x00\x00\x00\x00\x00\x00\x00\ 1365 \x00\x00\x00\x00\x00\x00\x00\x00\ 1366 \x00\x00\x00\x00\x00\x00\x00\x00\ 1367 \x00\x00\x00\x00\x00\x00\x00\x00\ 1368 \x00\x00\x00\x00\x00\x00\x00\x00\ 1369 \x00\x00\x00\x00\x00\x00\x00\x00\ 1370 \x00\x00\x00\x00\x00\x00\x00\x00\ 1371 \x00\x00\x00\x00\x00\x00\x00\x00\ 1372 \x00\x00\x00\x00\x00\x00\x00\x00\ 1373 \x00\x00\x00\x00\x00\x00\x00\x00\ 1374 \x00\x00\x00\x00\x00\x00\x00\x00\ 1375 \x00\x00\x00\x12\x00\x00\x13\x00\ 1376 \xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\ 1377 \xFF\xFF\x00\x00\xFF\xFF\x00\x00\ 1378 \x00\x00\x00\x00\x00\x00\x00\x00\ 1379 \x00\x00\x00\x00\x00\x00\x00\x00\ 1380 \x00\x00\x00\x00\x00\x00\x00\x00\ 1381 \x00\x00\x00\x00\x00\x00\x00\x00\ 1382 \x78\x03\x00\x00\x00\x00\x00\x00\ 1383 \x00\x00\x00\x00\x00\x00\x00\x00\ 1384 \x00\x00\x00\x00\x00\x00\x00\x00\ 1385 \x00\x00\x00\x00\x00\x00\x00\x00\ 1386 \x00\x00\xFE\xFF\xFB\xFF\xFF\xBB\ 1387 \x16\x00\x00\x00\x00\x00\x00\x00\ 1388 \x00\x00\x00\x00\x00\x00\x00\x00\ 1389 \x00\xF8\x3F\x00\x00\x00\x01\x00\ 1390 \x00\x00\x00\x00\x00\x00\x00\x00\ 1391 \x00\x00\xC0\xFF\x9F\x3D\x00\x00\ 1392 \x00\x00\x02\x00\x00\x00\xFF\xFF\ 1393 \xFF\x07\x00\x00\x00\x00\x00\x00\ 1394 \x00\x00\x00\x00\xC0\xFF\x01\x00\ 1395 \x00\x00\x00\x00\x00\x00\x00\x00\ 1396 \x0E\x00\x00\x00\x00\x00\x00\xD0\ 1397 \xFF\x3F\x1E\x00\x0C\x00\x00\x00\ 1398 \x0E\x00\x00\x00\x00\x00\x00\xD0\ 1399 \x9F\x39\x80\x00\x0C\x00\x00\x00\ 1400 \x04\x00\x00\x00\x00\x00\x00\xD0\ 1401 \x87\x39\x00\x00\x00\x00\x03\x00\ 1402 \x0E\x00\x00\x00\x00\x00\x00\xD0\ 1403 \xBF\x3B\x00\x00\x00\x00\x00\x00\ 1404 \x0E\x00\x00\x00\x00\x00\x00\xD0\ 1405 \x8F\x39\xC0\x00\x00\x00\x00\x00\ 1406 \x04\x00\x00\x00\x00\x00\x00\xC0\ 1407 \xC7\x3D\x80\x00\x00\x00\x00\x00\ 1408 \x0E\x00\x00\x00\x00\x00\x00\xC0\ 1409 \xDF\x3D\x60\x00\x00\x00\x00\x00\ 1410 \x0C\x00\x00\x00\x00\x00\x00\xC0\ 1411 \xDF\x3D\x60\x00\x00\x00\x00\x00\ 1412 \x0C\x00\x00\x00\x00\x00\x00\xC0\ 1413 \xCF\x3D\x80\x00\x00\x00\x00\x00\ 1414 \x0C\x00\x00\x00\x00\x00\x00\x00\ 1415 \x00\x84\x5F\xFF\x00\x00\x0C\x00\ 1416 \x00\x00\x00\x00\x00\x00\xF2\x07\ 1417 \x80\x7F\x00\x00\x00\x00\x00\x00\ 1418 \x00\x00\x00\x00\x00\x00\xF2\x1B\ 1419 \x00\x3F\x00\x00\x00\x00\x00\x00\ 1420 \x00\x00\x00\x03\x00\x00\xA0\xC2\ 1421 \x00\x00\x00\x00\x00\x00\xFE\xFF\ 1422 \xDF\x00\xFF\xFE\xFF\xFF\xFF\x1F\ 1423 \x40\x00\x00\x00\x00\x00\x00\x00\ 1424 \x00\x00\x00\x00\x00\xF0\xC7\x03\ 1425 \x00\x00\xC0\x03\x00\x00\x00\x00\ 1426 \x00\x00\x00\x00\x00\x00\x00\x00\ 1427 \x00\x00\x00\x00\x00\x00\x00\x00\ 1428 \x00\x00\x1C\x00\x00\x00\x1C\x00\ 1429 \x00\x00\x0C\x00\x00\x00\x0C\x00\ 1430 \x00\x00\x00\x00\x00\x00\xF0\xFF\ 1431 \xFF\xFF\x0F\x00\x00\x00\x00\x00\ 1432 \x00\x38\x00\x00\x00\x00\x00\x00\ 1433 \x00\x00\x00\x00\x00\x00\x00\x00\ 1434 \x00\x00\x00\x00\x00\x02\x00\x00\ 1435 \x00\x00\x00\x00\x00\x00\x00\x00\ 1436 \x00\x00\x00\x00\x00\x00\x00\x00\ 1437 \x00\x00\x00\x00\x00\x00\x00\x00\ 1438 \x00\x00\x00\x00\x00\x00\x00\x00\ 1439 \x00\x00\xFF\xFF\xFF\x07\x00\x00\ 1440 \x00\x00\x00\x00\x00\xFC\x00\x00\ 1441 \x00\x00\x00\x00\x00\x00\x00\x00\ 1442 \x00\x00\x00\x06\x00\x00\x00\x00\ 1443 \x00\x00\x00\x00\x00\x00\x00\x00\ 1444 \x00\x00\x00\x40\x00\x00\x00\x00\ 1445 \x00\x00\x00\x00\x00\x00\x00\x00\ 1446 \x00\x00\x00\x00\x00\x00\x00\x00\ 1447 \x00\x00\x00\x00\x00\x00\x00\x00\ 1448 \xFF\xFF\x00\x00\x0F\x00\x00\x00\ 1449 \x00\x00\x00\x00\x00\x00\x00\x00\ 1450 \x00\x00\x00\x00\x00\x00\x00\x00\ 1451 \x00\x00\x00\x00\x00\x00\x00\x00\ 1452 \x00\x00\x00\x00\x00\x00\x00\x00\ 1453 \x00\x00\x00\x00\xFE\xFF\x3F\x00\ 1454 \x00\x00\x00\x00\x00\xFF\xFF\xFF\ 1455 \x07\x00\x00\x00\x00\x00\x00\x00" 1456 1457 (****) 1458 1459 let bitmap_test base bitmap character = 1460 character >= base && character < 0x10000 1461 && 1462 (let value = string_get bitmap ((character lsr 8) land 0xFF) in 1463 value = 0xFF 1464 || 1465 (value <> 0 1466 && 1467 string_get bitmap ((value - 1) * 32 + 256 + (character land 0xFF) / 8) 1468 land (1 lsl (character land 7)) <> 0)) 1469 1470 let unicode_combinable character = 1471 bitmap_test 0x0300 uniCharCombiningBitmap character 1472 1473 let rec find_rec t i j v = 1474 if i + 1 = j then begin 1475 if t.(i * 2) = v then t.(i * 2 + 1) else 0 1476 end else begin 1477 let k = (i + j) / 2 in 1478 if v < t.(k * 2) then 1479 find_rec t i k v 1480 else 1481 find_rec t k j v 1482 end 1483 1484 let find t i n v = 1485 let j = i + n in 1486 if v < t.(2 * i) || v > t.(2 * (j - 1)) then 0 else 1487 find_rec t i j v 1488 1489 let uniCharPrecompSourceTableLen = Array.length uniCharPrecompSourceTable / 2 1490 1491 let combine v v' = 1492 if v' >= hangul_vbase && v' < hangul_tbase + hangul_tcount then begin 1493 if 1494 v' < hangul_vbase + hangul_vcount && 1495 v >= hangul_lbase && v < hangul_lbase + hangul_lcount 1496 then 1497 hangul_sbase + ((v - hangul_lbase) * (hangul_vcount * hangul_tcount)) + 1498 ((v' - hangul_vbase) * hangul_tcount) 1499 else if 1500 v' > hangul_tbase && 1501 v >= hangul_sbase && v < hangul_sbase + hangul_scount 1502 then 1503 if (v - hangul_sbase) mod hangul_tcount <> 0 then 0 else 1504 v + v' - hangul_tbase 1505 else 1506 0 1507 end else begin 1508 let k = 1509 find uniCharPrecompSourceTable 0 1510 uniCharPrecompSourceTableLen v' 1511 in 1512 if k = 0 then 0 else 1513 find uniCharBMPPrecompDestinationTable (k land 0xFFFF) (k lsr 16) v 1514 end 1515 1516 (****) 1517 1518 let rec scan d s i l = 1519 if i < l then begin 1520 let c = get s i in 1521 if c < 0x80 then 1522 cont d s i l (i + 1) c 1523 else if c < 0xE0 then begin 1524 (* 80 - 7FF *) 1525 if c < 0xc2 || i + 1 >= l then fail () else 1526 let c1 = get s (i + 1) in 1527 if c1 land 0xc0 <> 0x80 then fail () else 1528 let v = c lsl 6 + c1 - 0x3080 in 1529 cont d s i l (i + 2) v 1530 end else if c < 0xF0 then begin 1531 (* 800 - FFFF *) 1532 if i + 2 >= l then fail () else 1533 let c1 = get s (i + 1) in 1534 let c2 = get s (i + 2) in 1535 if (c1 lor c2) land 0xc0 <> 0x80 then fail () else 1536 let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in 1537 if v < 0x800 then fail () else 1538 cont d s i l (i + 3) v 1539 end else begin 1540 (* 10000 - 10FFFF *) 1541 if i + 3 >= l then fail () else 1542 let c1 = get s (i + 1) in 1543 let c2 = get s (i + 2) in 1544 let c3 = get s (i + 3) in 1545 if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then fail () else 1546 let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in 1547 if v < 0x10000 || v > 0x10ffff then fail () else 1548 cont d s i l (i + 4) v 1549 end 1550 end else begin 1551 let (i1, i2) = d in 1552 Bytes.blit s i2 s i1 (l - i2); 1553 Bytes.sub s 0 (i1 + l - i2) 1554 end 1555 1556 and cont d s i l j v' = 1557 if unicode_combinable v' then begin 1558 let i = prev_char s i in 1559 let (v, _) = decode_char s i l in 1560 let v'' = combine v v' in 1561 if v'' = 0 then 1562 scan d s j l 1563 else begin 1564 let (i1, i2) = d in 1565 Bytes.blit s i2 s i1 (i - i2); 1566 let i1 = i1 + i - i2 in 1567 let (v'', i) = compose_rec s j l v'' in 1568 let i1 = encode_char s i1 l v'' in 1569 scan (i1, i) s i l 1570 end 1571 end else 1572 scan d s j l 1573 1574 and compose_rec s i l v = 1575 try 1576 let (v', j) = decode_char s i l in 1577 if unicode_combinable v' then begin 1578 let v'' = combine v v' in 1579 if v'' = 0 then 1580 (v, i) 1581 else 1582 compose_rec s j l v'' 1583 end else 1584 (v, i) 1585 with Invalid -> 1586 (v, i) 1587 1588 let compose s = 1589 try Bytes.to_string (scan (0, 0) (Bytes.of_string s) 0 (String.length s)) with Invalid -> s 1590 1591 (***) 1592 1593 let set_2 s i v = 1594 set s i (v land 0xff); 1595 set s (i + 1) (v lsr 8) 1596 1597 let get_2 s i = (string_get s (i + 1)) lsl 8 + string_get s i 1598 1599 let rec scan s' j s i l = 1600 if i < l then begin 1601 let c = string_get s i in 1602 if c < 0x80 then 1603 cont s' j s (i + 1) l c 1604 else if c < 0xE0 then begin 1605 (* 80 - 7FF *) 1606 if c < 0xc2 || i + 1 >= l then fail () else 1607 let c1 = string_get s (i + 1) in 1608 if c1 land 0xc0 <> 0x80 then fail () else 1609 let v = c lsl 6 + c1 - 0x3080 in 1610 cont s' j s (i + 2) l v 1611 end else if c < 0xF0 then begin 1612 (* 800 - FFFF *) 1613 if i + 2 >= l then fail () else 1614 let c1 = string_get s (i + 1) in 1615 let c2 = string_get s (i + 2) in 1616 if (c1 lor c2) land 0xc0 <> 0x80 then fail () else 1617 let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in 1618 if v < 0x800 then fail () else 1619 cont s' j s (i + 3) l v 1620 end else begin 1621 (* 10000 - 10FFFF *) 1622 if i + 3 >= l then fail () else 1623 let c1 = string_get s (i + 1) in 1624 let c2 = string_get s (i + 2) in 1625 let c3 = string_get s (i + 3) in 1626 if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then fail () else 1627 let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in 1628 if v < 0x10000 || v > 0x10ffff then fail () else 1629 let v = v - 0x10000 in 1630 set_2 s' j (v lsr 10 + 0xD800); 1631 set_2 s' (j + 2) (v land 0x3FF + 0xDC00); 1632 scan s' (j + 4) s (i + 4) l 1633 end 1634 end else 1635 Bytes.sub s' 0 (j + 2) 1636 1637 and cont s' j s i l v = 1638 set_2 s' j v; 1639 scan s' (j + 2) s i l 1640 1641 let to_utf_16 s = 1642 let l = String.length s in 1643 let s' = Bytes.make (2 * l + 2) '\000' in 1644 Bytes.to_string (scan s' 0 s 0 l) 1645 1646 (***) 1647 1648 let sfm_encode = 1649 [| 0x0000; 0xf001; 0xf002; 0xf003; 0xf004; 0xf005; 0xf006; 0xf007; 1650 0xf008; 0xf009; 0xf00a; 0xf00b; 0xf00c; 0xf00d; 0xf00e; 0xf00f; 1651 0xf010; 0xf011; 0xf012; 0xf013; 0xf014; 0xf015; 0xf016; 0xf017; 1652 0xf018; 0xf019; 0xf01a; 0xf01b; 0xf01c; 0xf01d; 0xf01e; 0xf01f; 1653 0x0020; 0x0021; 0xf020; 0x0023; 0x0024; 0x0025; 0x0026; 0x0027; 1654 0x0028; 0x0029; 0xf021; 0x002b; 0x002c; 0x002d; 0x002e; 0x002f; 1655 0x0030; 0x0031; 0x0032; 0x0033; 0x0034; 0x0035; 0x0036; 0x0037; 1656 0x0038; 0x0039; 0xf022; 0x003b; 0xf023; 0x003d; 0xf024; 0xf025; 1657 0x0040; 0x0041; 0x0042; 0x0043; 0x0044; 0x0045; 0x0046; 0x0047; 1658 0x0048; 0x0049; 0x004a; 0x004b; 0x004c; 0x004d; 0x004e; 0x004f; 1659 0x0050; 0x0051; 0x0052; 0x0053; 0x0054; 0x0055; 0x0056; 0x0057; 1660 0x0058; 0x0059; 0x005a; 0x005b; 0xf026; 0x005d; 0x005e; 0x005f; 1661 0x0060; 0x0061; 0x0062; 0x0063; 0x0064; 0x0065; 0x0066; 0x0067; 1662 0x0068; 0x0069; 0x006a; 0x006b; 0x006c; 0x006d; 0x006e; 0x006f; 1663 0x0070; 0x0071; 0x0072; 0x0073; 0x0074; 0x0075; 0x0076; 0x0077; 1664 0x0078; 0x0079; 0x007a; 0x007b; 0xf027; 0x007d; 0x007e; 0x007f |] 1665 1666 let set_2 s i v = 1667 set s i (v land 0xff); 1668 set s (i + 1) (v lsr 8) 1669 1670 let get_2 s i = (string_get s (i + 1)) lsl 8 + string_get s i 1671 1672 let end_of_name s i l = let i' = i + 1 in i' = l || string_get s i' = 0x2f (*'/'*) 1673 1674 let rec scan s' j s i l = 1675 if i < l then begin 1676 let c = string_get s i in 1677 if c < 0x80 then 1678 cont s' j s (i + 1) l 1679 (if c = 0x20 && end_of_name s i l then 0xf028 1680 else if c = 0x2e && end_of_name s i l then 0xf029 1681 else Array.unsafe_get sfm_encode c) 1682 else if c < 0xE0 then begin 1683 (* 80 - 7FF *) 1684 if c < 0xc2 || i + 1 >= l then fail () else 1685 let c1 = string_get s (i + 1) in 1686 if c1 land 0xc0 <> 0x80 then fail () else 1687 let v = c lsl 6 + c1 - 0x3080 in 1688 cont s' j s (i + 2) l v 1689 end else if c < 0xF0 then begin 1690 (* 800 - FFFF *) 1691 if i + 2 >= l then fail () else 1692 let c1 = string_get s (i + 1) in 1693 let c2 = string_get s (i + 2) in 1694 if (c1 lor c2) land 0xc0 <> 0x80 then fail () else 1695 let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in 1696 if v < 0x800 then fail () else 1697 cont s' j s (i + 3) l v 1698 end else begin 1699 (* 10000 - 10FFFF *) 1700 if i + 3 >= l then fail () else 1701 let c1 = string_get s (i + 1) in 1702 let c2 = string_get s (i + 2) in 1703 let c3 = string_get s (i + 3) in 1704 if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then fail () else 1705 let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in 1706 if v < 0x10000 || v > 0x10ffff then fail () else 1707 let v = v - 0x10000 in 1708 set_2 s' j (v lsr 10 + 0xD800); 1709 set_2 s' (j + 2) (v land 0x3FF + 0xDC00); 1710 scan s' (j + 4) s (i + 4) l 1711 end 1712 end else 1713 Bytes.sub s' 0 (j + 2) 1714 1715 and cont s' j s i l v = 1716 set_2 s' j v; 1717 scan s' (j + 2) s i l 1718 1719 let to_utf_16_filename s = 1720 let l = String.length s in 1721 let s' = Bytes.make (2 * l + 2) '\000' in 1722 Bytes.to_string (scan s' 0 s 0 l) 1723 1724 (****) 1725 1726 let rec scan s' i' l' s i l = 1727 if i + 2 <= l then begin 1728 let v = get_2 s i in 1729 if v = 0 then 1730 Bytes.sub s' 0 i' (* null *) 1731 else if v < 0xD800 || v > 0xDFFF then 1732 let i' = encode_char s' i' l' v in 1733 scan s' i' l' s (i + 2) l 1734 else if v >= 0xdc00 || i + 4 > l then 1735 let i' = encode_char s' i' l' v in 1736 scan s' i' l' s (i + 2) l 1737 (* fail () *) 1738 else begin 1739 let v' = get_2 s (i + 2) in 1740 if v' < 0xDC00 || v' > 0XDFFF then 1741 let i' = encode_char s' i' l' v in 1742 scan s' i' l' s (i + 2) l 1743 (* fail ()*) 1744 else 1745 let i' = 1746 encode_char s' i' l' ((v - 0xD800) lsl 10 + (v' - 0xDC00) + 0x10000) 1747 in 1748 scan s' i' l' s (i + 4) l 1749 end 1750 end else if i < l then 1751 fail () (* Odd number of chars *) 1752 else 1753 Bytes.sub s' 0 i' 1754 1755 let from_utf_16 s = 1756 let l = String.length s in 1757 let l' = 3 * l / 2 in 1758 let s' = Bytes.create l' in 1759 Bytes.to_string (scan s' 0 l' s 0 l) 1760 1761 (****) 1762 1763 let end_of_name s i l = 1764 i + 2 = l || (i + 4 <= l && s.[i + 2] = '/' && s.[i + 3] = '\000') 1765 1766 let sfm_decode = 1767 "\x00\x01\x02\x03\x04\x05\x06\x07\ 1768 \x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\ 1769 \x10\x11\x12\x13\x14\x15\x16\x17\ 1770 \x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\ 1771 \"*:<>?\\| ." 1772 1773 let rec scan s' i' l' s i l = 1774 if i + 2 <= l then begin 1775 let v = get_2 s i in 1776 if v = 0 then 1777 Bytes.sub s' 0 i' (* null *) 1778 else if v < 0xD800 then 1779 let i' = encode_char s' i' l' v in 1780 scan s' i' l' s (i + 2) l 1781 else if v > 0xDFFF then begin 1782 let v = 1783 if v > 0xf000 && v <= 0xf029 then 1784 if v = 0xf028 && end_of_name s i l then 0x20 1785 else if v = 0xf029 && end_of_name s i l then 0x2e 1786 else string_get sfm_decode (v - 0xf000) 1787 else 1788 v 1789 in 1790 let i' = encode_char s' i' l' v in 1791 scan s' i' l' s (i + 2) l 1792 end else if v >= 0xdc00 || i + 4 > l then 1793 let i' = encode_char s' i' l' v in 1794 scan s' i' l' s (i + 2) l 1795 (* fail () *) 1796 else begin 1797 let v' = get_2 s (i + 2) in 1798 if v' < 0xDC00 || v' > 0XDFFF then 1799 let i' = encode_char s' i' l' v in 1800 scan s' i' l' s (i + 2) l 1801 (* fail ()*) 1802 else 1803 let i' = 1804 encode_char s' i' l' ((v - 0xD800) lsl 10 + (v' - 0xDC00) + 0x10000) 1805 in 1806 scan s' i' l' s (i + 4) l 1807 end 1808 end else if i < l then 1809 fail () (* Odd number of chars *) 1810 else 1811 Bytes.sub s' 0 i' 1812 1813 (* NOTE: we MUST have to_utf_16_filename (from_utf_16 s) = s for any 1814 Windows valid filename s *) 1815 let from_utf_16_filename s = 1816 let l = String.length s in 1817 let l' = 3 * l / 2 in 1818 let s' = Bytes.create l' in 1819 Bytes.to_string (scan s' 0 l' s 0 l) 1820 1821 (****) 1822 1823 let rec scan s i l = 1824 i = l || 1825 let c = string_get s i in 1826 if c < 0x80 then 1827 c <> 0 && scan s (i + 1) l 1828 else if c < 0xE0 then begin 1829 (* 80 - 7FF *) 1830 c >= 0xc2 && i + 1 < l && 1831 let c1 = string_get s (i + 1) in 1832 c1 land 0xc0 = 0x80 && 1833 scan s (i + 2) l 1834 end else if c < 0xF0 then begin 1835 (* 800 - FFFF *) 1836 i + 2 < l && 1837 let c1 = string_get s (i + 1) in 1838 let c2 = string_get s (i + 2) in 1839 (c1 lor c2) land 0xc0 = 0x80 && 1840 let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in 1841 v >= 0x800 && (v < 0xd800 || (v > 0xdfff && v <> 0xfffe && v <> 0xffff)) && 1842 scan s (i + 3) l 1843 end else begin 1844 (* 10000 - 10FFFF *) 1845 i + 3 < l && 1846 let c1 = string_get s (i + 1) in 1847 let c2 = string_get s (i + 2) in 1848 let c3 = string_get s (i + 3) in 1849 (c1 lor c2 lor c3) land 0xc0 = 0x80 && 1850 let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in 1851 v >= 0x10000 && v <= 0x10ffff && 1852 scan s (i + 4) l 1853 end 1854 1855 let check_utf_8 s = scan s 0 (String.length s) 1856 1857 (****) 1858 1859 let wf_utf8 = 1860 [[('\x01', '\x7F')]; 1861 [('\xC2', '\xDF'); ('\x80', '\xBF')]; 1862 [('\xE0', '\xE0'); ('\xA0', '\xBF'); ('\x80', '\xBF')]; 1863 [('\xE1', '\xEC'); ('\x80', '\xBF'); ('\x80', '\xBF')]; 1864 [('\xED', '\xED'); ('\x80', '\x9F'); ('\x80', '\xBF')]; 1865 [('\xEE', '\xEF'); ('\x80', '\xBF'); ('\x80', '\xBF')]; 1866 [('\xF0', '\xF0'); ('\x90', '\xBF'); ('\x80', '\xBF'); ('\x80', '\xBF')]; 1867 [('\xF1', '\xF3'); ('\x80', '\xBF'); ('\x80', '\xBF'); ('\x80', '\xBF')]; 1868 [('\xF4', '\xF4'); ('\x80', '\x8F'); ('\x80', '\xBF'); ('\x80', '\xBF')]] 1869 1870 let rec accept_seq l s i len = 1871 match l with 1872 [] -> 1873 Some i 1874 | (a, b) :: r -> 1875 if i = len || s.[i] < a || s.[i] > b then 1876 None 1877 else 1878 accept_seq r s (i + 1) len 1879 1880 let rec accept_rec l s i len = 1881 match l with 1882 [] -> 1883 None 1884 | seq :: r -> 1885 match accept_seq seq s i len with 1886 None -> accept_rec r s i len 1887 | res -> res 1888 1889 let accept = accept_rec wf_utf8 1890 1891 (***) 1892 1893 let protect_char buf c = 1894 if c = '\x00' then 1895 Buffer.add_char buf ' ' 1896 else if c < '\x80' then 1897 Buffer.add_char buf c 1898 else 1899 let c = Char.code c in 1900 Buffer.add_char buf (Char.chr (c lsr 6 + 0xC0)); 1901 Buffer.add_char buf (Char.chr (c land 0x3f + 0x80)) 1902 1903 let rec protect_rec buf s i len = 1904 if i = len then 1905 Buffer.contents buf 1906 else 1907 match accept s i len with 1908 Some i' -> 1909 Buffer.add_substring buf s i (i' - i); 1910 protect_rec buf s i' len 1911 | None -> 1912 protect_char buf s.[i]; 1913 protect_rec buf s (i + 1) len 1914 1915 let expl f s = f s 0 (String.length s) 1916 1917 (* Convert a string to UTF8 by keeping all UTF8 characters unchanged 1918 and considering all other characters as ISO 8859-1 characters *) 1919 let protect s = 1920 let buf = Buffer.create (String.length s * 2) in 1921 expl (protect_rec buf) s