unison

Fork of Unison, a bi-directional file synchronization tool
git clone git://git.laack.co/unison.git
Log | Files | Refs | README | LICENSE

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